OLD | NEW |
| (Empty) |
1 #!/bin/sh | |
2 # | |
3 # Copyright (c) 2013 The Chromium Authors. All rights reserved. | |
4 # Use of this source code is governed by a BSD-style license that can be | |
5 # found in the LICENSE file. | |
6 | |
7 # Sanitize environment. | |
8 set -e | |
9 export LANG=C | |
10 export LC_ALL=C | |
11 | |
12 PROGDIR=$(dirname "$0") | |
13 PROGNAME=$(basename "$0") | |
14 | |
15 # Defaults | |
16 VERBOSE=1 | |
17 | |
18 . "$PROGDIR/openssl-chromium.config" | |
19 | |
20 # Print error message and exit script. | |
21 # $1+: Error message. | |
22 panic () { | |
23 echo "ERROR: $@" | |
24 exit 1 | |
25 } | |
26 | |
27 # $1: Variable name | |
28 # Output: variable value. | |
29 var_value () { | |
30 # NOTE: Don't use 'echo' here, it is sensitive to options like -n. | |
31 eval printf \"%s\\n\" \$$1 | |
32 } | |
33 | |
34 # Print a message if verbosity is sufficiently high. | |
35 # $1: Verbosity threshold, only if '$VERBOSE > $1' does this print. | |
36 # $2+: Message. | |
37 dump_n () { | |
38 local LEVEL=$1 | |
39 shift | |
40 if [ "$VERBOSE" -gt "$LEVEL" ]; then | |
41 printf "%s\n" "$@" | |
42 fi | |
43 } | |
44 | |
45 # Print a message, unless --quiet was used. | |
46 dump () { | |
47 dump_n 0 "$@" | |
48 } | |
49 | |
50 # Print a message if --verbose was used. | |
51 log () { | |
52 dump_n 1 "$@" | |
53 } | |
54 | |
55 # Print a message if --verbose --verbose was used. | |
56 log2 () { | |
57 dump_n 2 "$@" | |
58 } | |
59 | |
60 # Run a command silently, unless --verbose is used. | |
61 # More specifically: | |
62 # - By default, this runs the command but redirects its stdout/stderr | |
63 # to /dev/null to avoid printing anything. | |
64 # - If --verbose is used, this prints the command's name, and stderr | |
65 # will not be redirected. | |
66 # - If '--verbose --verbose' is used, this prints the commands and its | |
67 # complete output. | |
68 # $1+: Command | |
69 # Return: Command status | |
70 run () { | |
71 if [ "$VERBOSE" -gt 1 ]; then | |
72 echo "COMMAND: $@" | |
73 fi | |
74 case $VERBOSE in | |
75 0) | |
76 "$@" > /dev/null 2>&1 | |
77 ;; | |
78 1) | |
79 "$@" > /dev/null | |
80 ;; | |
81 *) | |
82 "$@" | |
83 ;; | |
84 esac | |
85 } | |
86 | |
87 # Support cleaning up stuff when the script exits, even in case of | |
88 # error. | |
89 _ALL_CLEANUPS= | |
90 | |
91 clean_atexit () { | |
92 local CLEANUPS CLEANUP | |
93 CLEANUPS=$_ALL_CLEANUPS | |
94 _ALL_CLEANUPS= | |
95 for CLEANUP in $CLEANUPS; do | |
96 ($CLEANUP) | |
97 done | |
98 exit $1 | |
99 } | |
100 | |
101 trap "clean_atexit 0" EXIT | |
102 trap "clean_atexit \$?" HUP INT QUIT TERM | |
103 | |
104 # Add a cleanup function to the list of cleanups that will be run when | |
105 # the script exits. | |
106 atexit () { | |
107 # Prepend to ensure that the cleanup steps are performed in reverse | |
108 # order or registration. | |
109 _ALL_CLEANUPS="$* $_ALL_CLEANUPS" | |
110 } | |
111 | |
112 # Support code to write into a gyp file | |
113 _GYP_MARGIN="" | |
114 | |
115 # Increment margin of gyp printer. | |
116 incr_gyp_margin () { | |
117 _GYP_MARGIN="$_GYP_MARGIN " | |
118 } | |
119 | |
120 decr_gyp_margin () { | |
121 _GYP_MARGIN=$(echo "$_GYP_MARGIN" | cut --bytes=3-) | |
122 } | |
123 | |
124 print_gyp () { | |
125 printf "%s%s\n" "$_GYP_MARGIN" "$@" | |
126 } | |
127 | |
128 # This prints a list variable definition in a gyp file. | |
129 # $1: Variable name (e.g. 'openssl_common_defines') | |
130 # $2+: List items (e.g. defines) | |
131 print_gyp_variable () { | |
132 local VARNAME=$1 | |
133 local VALUE | |
134 shift | |
135 print_gyp "'$VARNAME': [" | |
136 for VALUE; do | |
137 print_gyp " '$VALUE'," | |
138 done | |
139 print_gyp "]," | |
140 } | |
141 | |
142 # Same as print_gyp_variable, but for source file lists, this | |
143 # prepends openssl/ as required by the Chromium build to each item | |
144 # in the list. | |
145 # $1: Variable name (e.g. 'openssl_common_sources') | |
146 # $2+: List items (source file names). | |
147 print_gyp_source_variable () { | |
148 local VARNAME=$1 | |
149 local VALUE | |
150 shift | |
151 print_gyp "'$VARNAME': [" | |
152 for VALUE; do | |
153 print_gyp " 'openssl/$VALUE'," | |
154 done | |
155 print_gyp "]," | |
156 } | |
157 | |
158 # Print usage instructions. | |
159 usage () { | |
160 echo \ | |
161 "Usage: $PROGNAME [options] | |
162 | |
163 This script is used to regenerate the content of the Chromium | |
164 third_party/openssl/ directory according to the configuration file | |
165 named 'openssl-chromium.config'. | |
166 | |
167 In particular, it will perform the following steps: | |
168 | |
169 1) Download the Android sources from the AOSP git servers. | |
170 | |
171 2) Add Chromium-specific patches to the Android source tree. | |
172 (they must be under patches.chromium/ in $PROGDIR). | |
173 | |
174 3) Download a versioned openssl package from the official OpenSSL | |
175 servers, and check its MD5. The version is taken from the | |
176 'openssl.version' file in the Android source tree. | |
177 | |
178 4) Run the Android 'import_openssl.sh' script that rebuilds all sources | |
179 from a clean slate. | |
180 | |
181 5) Generate the 'openssl.gypi' that contains gyp-specific declarations | |
182 for the library. | |
183 | |
184 6) Generate 64-bit compatible opensslconf.h header. | |
185 | |
186 Valid options are the following (defaults are in brackets): | |
187 | |
188 --help|-h|-? Display this message. | |
189 --aosp-git=<url> Change git source for Android repository. | |
190 [$ANDROID_OPENSSL_GIT_SOURCE] | |
191 --aosp-commit=<name> Specify git commit or branch name [$ANDROID_OPENSSL_GIT_
COMMIT] | |
192 --temp-dir=<path> Specify temporary directory, will not be cleaned. | |
193 [<random-temp-file-cleaned-on-exit>] | |
194 --verbose Increase verbosity. | |
195 --quiet Decrease verbosity. | |
196 " | |
197 exit 1 | |
198 } | |
199 | |
200 # Parse command-line. | |
201 DO_HELP= | |
202 | |
203 for OPT; do | |
204 OPTARG=$() | |
205 case $OPT in | |
206 --help|-h|-?) | |
207 DO_HELP=true | |
208 ;; | |
209 --aosp-commit=*) | |
210 ANDROID_OPENSSL_GIT_COMMIT=${OPT#--aosp-commit=} | |
211 if [ -z "$ANDROID_OPENSSL_GIT_COMMIT" ]; then | |
212 panic "Missing option value: $OPT" | |
213 fi | |
214 ;; | |
215 --aosp-git=*) | |
216 ANDROID_OPENSSL_GIT_SOURCE=${OPT#--aosp-git=} | |
217 if [ -z "$ANDROID_OPENSSL_GIT_SOURCE" ]; then | |
218 panic "Missing option value: $OPT" | |
219 fi | |
220 ;; | |
221 --temp-dir=*) | |
222 TEMP_DIR=${OPT#--temp-dir=} | |
223 if [ -z "$TEMP_DIR" ]; then | |
224 panic "Missing option value: $OPT" | |
225 fi | |
226 ;; | |
227 --quiet) | |
228 VERBOSE=$(( $VERBOSE - 1 )) | |
229 ;; | |
230 --verbose) | |
231 VERBOSE=$(( $VERBOSE + 1 )) | |
232 ;; | |
233 -*) | |
234 panic "Invalid option '$OPT', see --help for details." | |
235 ;; | |
236 *) | |
237 panic "This script doesn't take parameters. See --help for details." | |
238 ;; | |
239 esac | |
240 done | |
241 | |
242 if [ "$DO_HELP" ]; then | |
243 usage | |
244 fi | |
245 | |
246 # Create temporary directory. Ensure it's always cleaned up on exit. | |
247 if [ -z "$TEMP_DIR" ]; then | |
248 TEMP_DIR=$(mktemp -d) | |
249 clean_tempdir () { | |
250 rm -rf "$TEMP_DIR" | |
251 } | |
252 atexit clean_tempdir | |
253 log "Temporary directory created: $TEMP_DIR" | |
254 else | |
255 log "Using user-provided temp directory: $TEMP_DIR" | |
256 fi | |
257 | |
258 GIT_FLAGS= | |
259 case $VERBOSE in | |
260 0|1) | |
261 GIT_CLONE_FLAGS="--quiet" | |
262 GIT_CHECKOUT_FLAGS="--quiet" | |
263 CURL_FLAGS="-s" | |
264 ;; | |
265 2) | |
266 GIT_CLONE_FLAGS="" | |
267 GIT_CHECKOUT_FLAGS="" | |
268 CURL_FLAGS="" | |
269 ;; | |
270 *) | |
271 GIT_CLONE_FLAGS="--verbose" | |
272 GIT_CHECKOUT_FLAGS="" | |
273 CURL_FLAGS="" | |
274 ;; | |
275 esac | |
276 | |
277 BUILD_DIR=$TEMP_DIR/build | |
278 mkdir -p "$BUILD_DIR" && rm -rf "$BUILD_DIR"/* | |
279 | |
280 # Download the Android sources. | |
281 ANDROID_SRC_DIR=$BUILD_DIR/android-openssl | |
282 dump "Downloading Android sources" | |
283 log "Downloading branch $ANDROID_OPENSSL_GIT_COMMIT from: $ANDROID_OPENSSL_GIT_S
OURCE" | |
284 ( | |
285 run mkdir -p $ANDROID_SRC_DIR | |
286 run cd $ANDROID_SRC_DIR | |
287 run git clone $GIT_CLONE_FLAGS $ANDROID_OPENSSL_GIT_SOURCE . | |
288 run git checkout $GIT_CHECKOUT_FLAGS $ANDROID_OPENSSL_GIT_COMMIT | |
289 run rm -rf .git | |
290 ) | |
291 | |
292 # Apply chromium-specific patches located in patches.chromium | |
293 CHROMIUM_PATCHES_DIR=$PROGDIR/patches.chromium | |
294 if [ ! -d "$CHROMIUM_PATCHES_DIR" ]; then | |
295 dump "No Chromium-specific patches to apply." | |
296 else | |
297 dump "Applying Chromium-specific patches:" | |
298 CHROMIUM_PATCHES=$(/bin/ls $CHROMIUM_PATCHES_DIR/*.patch 2>/dev/null) | |
299 for CHROMIUM_PATCH in $CHROMIUM_PATCHES; do | |
300 dump "Applying: $CHROMIUM_PATCH" | |
301 (cd $ANDROID_SRC_DIR && run patch -p1) < $CHROMIUM_PATCH | |
302 done | |
303 fi | |
304 | |
305 # Get the openssl version | |
306 . $ANDROID_SRC_DIR/openssl.version | |
307 if [ -z "$OPENSSL_VERSION" ]; then | |
308 panic "Could not find OPENSSL_VERSION definition from $ANDROID_SRC_DIR!" | |
309 fi | |
310 dump "Found OpenSSL version: $OPENSSL_VERSION" | |
311 | |
312 # Download OpenSSL package | |
313 DOWNLOAD_DIR=$BUILD_DIR/download | |
314 mkdir -p "$DOWNLOAD_DIR" | |
315 | |
316 OPENSSL_PACKAGE=openssl-$OPENSSL_VERSION.tar.gz | |
317 dump "Downloading $OPENSSL_PACKAGE from $OPENSSL_TAR_SOURCE" | |
318 run curl $CURL_FLAGS -o $DOWNLOAD_DIR/$OPENSSL_PACKAGE $OPENSSL_TAR_SOURCE/$OPEN
SSL_PACKAGE | |
319 run curl $CURL_FLAGS -o $DOWNLOAD_DIR/$OPENSSL_PACKAGE.md5 $OPENSSL_TAR_SOURCE/$
OPENSSL_PACKAGE.md5 | |
320 | |
321 OPENSSL_SHA1_DOWNLOADED=$(sha1sum $DOWNLOAD_DIR/$OPENSSL_PACKAGE | cut -d" " -f1
) | |
322 OPENSSL_SHA1_EXPECTED=$OPENSSL_TAR_SHA1 | |
323 if [ "$OPENSSL_SHA1_DOWNLOADED" != "$OPENSSL_SHA1_EXPECTED" ]; then | |
324 echo "ERROR: Content mismatch for downloaded OpenSSL package:" | |
325 echo " Downloaded SHA-1: $OPENSSL_SHA1_DOWNLOADED" | |
326 echo " Expected SHA-1 : $OPENSSL_SHA1_EXPECTED" | |
327 exit 1 | |
328 fi | |
329 dump "Checking content of downloaded package: ok" | |
330 | |
331 # The import_openssl.sh script will really remove the existing 'openssl' | |
332 # directory and replace it with something completely new. This is a problem | |
333 # when using subversion because this also gets rid of all .svn | |
334 # subdirectories. This makes it impossible to commit the right set of | |
335 # changes with "gcl commit". | |
336 # | |
337 # To work-around this, copy all the .svn subdirectories into a temporary | |
338 # tarball, which will be extracted after the import process. | |
339 # | |
340 dump "Saving .svn subdirectories" | |
341 SVN_LIST_FILE=$BUILD_DIR/svn-subdirs | |
342 run find . -type d -name ".svn" > $SVN_LIST_FILE | |
343 SAVED_SVN_TARBALL=$BUILD_DIR/saved-svn-subdirs.tar.gz | |
344 run tar czf $SAVED_SVN_TARBALL -T $SVN_LIST_FILE | |
345 | |
346 # Re-run the import_openssl.sh script. | |
347 dump "Re-running the 'import_openssl.sh' script to reconfigure all sources." | |
348 ( | |
349 cd $ANDROID_SRC_DIR | |
350 run ./import_openssl.sh import $DOWNLOAD_DIR/$OPENSSL_PACKAGE | |
351 ) | |
352 | |
353 dump "Copying new Android sources to final location." | |
354 clean_openssl_new () { | |
355 rm -rf "$PROGDIR/openssl.new" | |
356 } | |
357 atexit clean_openssl_new | |
358 | |
359 run cp -rp "$ANDROID_SRC_DIR" "$PROGDIR/openssl.new" | |
360 run mv "$PROGDIR/openssl" "$PROGDIR/openssl.old" | |
361 run mv "$PROGDIR/openssl.new" "$PROGDIR/openssl" | |
362 run rm -rf "$PROGDIR/openssl.old" | |
363 | |
364 dump "Restoring .svn subdirectores" | |
365 run tar xzf $SAVED_SVN_TARBALL | |
366 | |
367 # Extract list of source files or compiler defines from openssl.config | |
368 # variable definition. This assumes that the lists are in variables that | |
369 # are named as <prefix><suffix> or <prefix><suffix><arch>. | |
370 # | |
371 # A few examples: | |
372 # get_gyp_list "FOO BAR" _SOURCES | |
373 # -> returns '$FOO_SOURCES $BAR_SOURCES' | |
374 # | |
375 # get_gyp_list FOO _SOURCES_ "arm x86" | |
376 # -> returns '$FOO_SOURCES_arm $FOO_SOURCES_x86" | |
377 # | |
378 # get_gyp_list "FOO BAR" _SOURCES_ "arm x86" | |
379 # -> returns '$FOO_SOURCES_arm $FOO_SOURCES_x86 $BAR_SOURCES_arm $BAR_SOURCE
S_x86' | |
380 # | |
381 # $1: list of variable prefixes | |
382 # $2: variable suffix | |
383 # $3: optional list of architectures. | |
384 get_gyp_list () { | |
385 local ALL_PREFIXES="$1" | |
386 local SUFFIX="$2" | |
387 local ALL_ARCHS="$3" | |
388 local LIST PREFIX ARCH | |
389 for PREFIX in $ALL_PREFIXES; do | |
390 if [ "$ALL_ARCHS" ]; then | |
391 for ARCH in $ALL_ARCHS; do | |
392 LIST="$LIST $(var_value ${PREFIX}${SUFFIX}${ARCH})" | |
393 done | |
394 else | |
395 LIST="$LIST $(var_value ${PREFIX}${SUFFIX})" | |
396 fi | |
397 done | |
398 echo "$LIST" | |
399 } | |
400 | |
401 generate_gyp_file () { | |
402 echo "# Auto-generated file - DO NOT EDIT" | |
403 echo "# To regenerate - run import_from_android.sh." | |
404 echo "# See 'import_from_android.sh --help' for details." | |
405 | |
406 local ALL_PREFIXES="OPENSSL_CRYPTO OPENSSL_SSL" | |
407 local ALL_ARCHS="arm mips x86 x86_64 mac_ia32" | |
408 local PREFIX ARCH LIST | |
409 | |
410 print_gyp "{" | |
411 incr_gyp_margin | |
412 | |
413 print_gyp "'variables': {" | |
414 incr_gyp_margin | |
415 | |
416 # First, the common sources and defines | |
417 print_gyp_source_variable "openssl_common_sources" \ | |
418 $(get_gyp_list "$ALL_PREFIXES" _SOURCES) | |
419 | |
420 print_gyp_variable "openssl_common_defines" \ | |
421 $(get_gyp_list "$ALL_PREFIXES" _DEFINES) | |
422 | |
423 # Now, conditions section with add architecture-specific sub-sections. | |
424 for ARCH in $ALL_ARCHS; do | |
425 # Convert ARCH to gyp-specific architecture name | |
426 case $ARCH in | |
427 x86) | |
428 GYP_ARCH=ia32 | |
429 ;; | |
430 x86_64) | |
431 GYP_ARCH=x64 | |
432 ;; | |
433 *) | |
434 GYP_ARCH=$ARCH | |
435 ;; | |
436 esac | |
437 | |
438 print_gyp_source_variable "openssl_${ARCH}_source_excludes" \ | |
439 $(get_gyp_list "$ALL_PREFIXES" _SOURCES_EXCLUDES_ $ARCH) | |
440 | |
441 print_gyp_source_variable "openssl_${ARCH}_sources" \ | |
442 $(get_gyp_list "$ALL_PREFIXES" _SOURCES_ $ARCH) | |
443 | |
444 print_gyp_variable "openssl_${ARCH}_defines" \ | |
445 $(get_gyp_list "$ALL_PREFIXES" _DEFINES_ $ARCH) | |
446 | |
447 done # for ARCH | |
448 | |
449 decr_gyp_margin | |
450 print_gyp "}" # variables | |
451 | |
452 decr_gyp_margin | |
453 print_gyp "}" # top-level dict. | |
454 } | |
455 | |
456 dump "Generating 64-bit configuration header file." | |
457 mkdir -p $PROGDIR/config/x64/openssl/ | |
458 sed \ | |
459 -e 's|^#define RC4_INT unsigned char|#define RC4_INT unsigned int|g' \ | |
460 -e 's|^#define BN_LLONG|#undef BN_LLONG|g' \ | |
461 -e 's|^#define THIRTY_TWO_BIT|#undef THIRTY_TWO_BIT|g' \ | |
462 -e 's|^#undef SIXTY_FOUR_BIT_LONG|#define SIXTY_FOUR_BIT_LONG|g' \ | |
463 -e 's|^#define BF_PTR|#undef BF_PTR|g' \ | |
464 $PROGDIR/openssl/include/openssl/opensslconf.h \ | |
465 > $PROGDIR/config/x64/openssl/opensslconf.h | |
466 | |
467 dump "Generating OS X 32-bit configuration header file." | |
468 mkdir -p $PROGDIR/config/mac/ia32/openssl/ | |
469 sed \ | |
470 -e '4a#ifndef OPENSSL_SYSNAME_MACOSX\n# define OPENSSL_SYSNAME_MACOSX\n#endif'
\ | |
471 -e 's|^#define RC4_INT unsigned char|#define RC4_INT unsigned int|g' \ | |
472 -e 's|^#define DES_LONG unsigned int|#define DES_LONG unsigned long|g' \ | |
473 $PROGDIR/openssl/include/openssl/opensslconf.h \ | |
474 > $PROGDIR/config/mac/ia32/openssl/opensslconf.h | |
475 | |
476 dump "Generating .gypi file." | |
477 . $ANDROID_SRC_DIR/openssl.config | |
478 generate_gyp_file > $PROGDIR/openssl.gypi.new | |
479 run mv $PROGDIR/openssl.gypi $PROGDIR/openssl.gypi.old | |
480 run mv $PROGDIR/openssl.gypi.new $PROGDIR/openssl.gypi | |
481 run rm $PROGDIR/openssl.gypi.old | |
482 | |
483 dump "Done." | |
OLD | NEW |