| OLD | NEW |
| (Empty) |
| 1 #!/bin/sh | |
| 2 # | |
| 3 | |
| 4 set -e | |
| 5 export LANG=C | |
| 6 export LC_ALL=C | |
| 7 | |
| 8 PROGDIR=$(dirname "$0") | |
| 9 PROGNAME=$(basename "$0") | |
| 10 | |
| 11 panic () { | |
| 12 echo "ERROR: $@" | |
| 13 exit 1 | |
| 14 } | |
| 15 | |
| 16 VERBOSE=1 | |
| 17 | |
| 18 # Dump message is $VERBOSE >= $1 | |
| 19 # $1+: message. | |
| 20 dump_n () { | |
| 21 local LOG_LEVEL=$1 | |
| 22 shift | |
| 23 if [ "$VERBOSE" -ge "$LOG_LEVEL" ]; then | |
| 24 printf "%s\n" "$@" | |
| 25 fi | |
| 26 } | |
| 27 | |
| 28 # Dump a message unless --quiet is used. | |
| 29 # $1+: message. | |
| 30 dump () { | |
| 31 dump_n 1 "$@" | |
| 32 } | |
| 33 | |
| 34 # Dump a message if --verbose is used only. | |
| 35 # $1+: message. | |
| 36 log () { | |
| 37 dump_n 2 "$@" | |
| 38 } | |
| 39 | |
| 40 # Run a command silently, unless --verbose or '--verbose --verbose' | |
| 41 # is used. | |
| 42 # $1+: Command | |
| 43 # Return: command status. | |
| 44 run () { | |
| 45 log "COMMAND: $*" | |
| 46 case $VERBOSE in | |
| 47 0) | |
| 48 "$@" >/dev/null 2>&1 || return $? | |
| 49 ;; | |
| 50 1) | |
| 51 "$@" >/dev/null || return $? | |
| 52 ;; | |
| 53 *) | |
| 54 "$@" || return $? | |
| 55 ;; | |
| 56 esac | |
| 57 } | |
| 58 | |
| 59 # $1: string | |
| 60 # Out: input string, with capital letters replaced by small ones. | |
| 61 tolower () { | |
| 62 echo "$1" | tr '[A-Z]' '[a-z]' | |
| 63 } | |
| 64 | |
| 65 # Return value of a given variable. | |
| 66 # $1: Variable name | |
| 67 var_value () { | |
| 68 eval printf \"%s\" \"\$$1\" | |
| 69 } | |
| 70 | |
| 71 # Remove some items from a list | |
| 72 # $1: input space-separated list | |
| 73 # $2: space-separated list of items to remove from 1 | |
| 74 # Out: items of $1 without items of $2 | |
| 75 filter_out () { | |
| 76 local TMP=$(mktemp) | |
| 77 local RESULT | |
| 78 printf "" > $TMP | |
| 79 echo "$2" | tr ' ' '\n' > $TMP | |
| 80 RESULT=$(echo "$1" | tr ' ' '\n' | fgrep -x -v -f $TMP | tr '\n' ' ') | |
| 81 rm -f $TMP | |
| 82 echo "$RESULT" | |
| 83 } | |
| 84 | |
| 85 src_to_obj () { | |
| 86 case $1 in | |
| 87 *.c) | |
| 88 echo ${1%%.c}.o | |
| 89 ;; | |
| 90 *.S) | |
| 91 echo ${1%%.S}.o | |
| 92 ;; | |
| 93 *) | |
| 94 echo $1 | |
| 95 ;; | |
| 96 esac | |
| 97 } | |
| 98 | |
| 99 # Determine host operating system. | |
| 100 HOST_OS=$(uname -s) | |
| 101 case $HOST_OS in | |
| 102 Linux) | |
| 103 HOST_OS=linux | |
| 104 ;; | |
| 105 Darwin) | |
| 106 HOST_OS=darwin | |
| 107 ;; | |
| 108 esac | |
| 109 | |
| 110 # Determine host architecture | |
| 111 HOST_ARCH=$(uname -m) | |
| 112 case $HOST_ARCH in | |
| 113 i?86) | |
| 114 HOST_ARCH=x86 | |
| 115 ;; | |
| 116 esac | |
| 117 | |
| 118 ANDROID_HOST_TAG=$HOST_OS-$HOST_ARCH | |
| 119 | |
| 120 case $ANDROID_HOST_TAG in | |
| 121 linux-x86_64|darwin-x86-64) | |
| 122 ANDROID_HOST_TAG=$HOST_OS-x86 | |
| 123 ;; | |
| 124 *) | |
| 125 panic "Sorry, this script can only run on 64-bit Linux or Darwin" | |
| 126 esac | |
| 127 | |
| 128 # Determine number of cores | |
| 129 case $HOST_OS in | |
| 130 linux) | |
| 131 NUM_CORES=$(grep -c "processor" /proc/cpuinfo) | |
| 132 ;; | |
| 133 darwin) | |
| 134 NUM_CORES=$(sysctl -n hw.ncpu) | |
| 135 ;; | |
| 136 *) | |
| 137 NUM_CORES=1 | |
| 138 ;; | |
| 139 esac | |
| 140 | |
| 141 # The list of supported Android target architectures. | |
| 142 ANDROID_ARCHS="arm x86 mips" | |
| 143 | |
| 144 BUILD_TYPES= | |
| 145 for ARCH in $ANDROID_ARCHS; do | |
| 146 BUILD_TYPES="$BUILD_TYPES android-$ARCH" | |
| 147 done | |
| 148 ANDROID_BUILD_TYPES=$BUILD_TYPES | |
| 149 | |
| 150 # NOTE: The $HOST_OS-x86_64 is currently broken because the single | |
| 151 # <openssl/opensslconf.h> header is tailored for 32-bits. | |
| 152 HOST_BUILD_TYPES="$HOST_OS-x86 $HOST_OS-generic32 $HOST_OS-generic64" | |
| 153 | |
| 154 BUILD_TYPES="$ANDROID_BUILD_TYPES $HOST_BUILD_TYPES" | |
| 155 | |
| 156 # Parse command-line | |
| 157 DO_HELP= | |
| 158 SRC_DIR=$(cd $PROGDIR && pwd) | |
| 159 OUT_DIR=out | |
| 160 BUILD_DIR= | |
| 161 BUILD_TYPES= | |
| 162 NUM_JOBS=$NUM_CORES | |
| 163 ANDROID_BUILD_TOP=$(cd $PROGDIR/../.. && pwd) | |
| 164 for OPT; do | |
| 165 case $OPT in | |
| 166 --help|-h|-?) | |
| 167 DO_HELP=true | |
| 168 ;; | |
| 169 --build-dir=*) | |
| 170 BUILD_DIR=${OPT##--build-dir=} | |
| 171 ;; | |
| 172 --verbose) | |
| 173 VERBOSE=$(( $VERBOSE + 1 )) | |
| 174 ;; | |
| 175 --jobs=*) | |
| 176 NUM_JOBS=${OPT##--jobs=} | |
| 177 ;; | |
| 178 --quiet) | |
| 179 VERBOSE=$(( $VERBOSE - 1 )) | |
| 180 ;; | |
| 181 -j*) | |
| 182 NUM_JOBS=${OPT##-j} | |
| 183 ;; | |
| 184 -*) | |
| 185 panic "Unknown option '$OPT', see --help for details." | |
| 186 ;; | |
| 187 *) | |
| 188 BUILD_TYPES="$BUILD_TYPES $OPT" | |
| 189 ;; | |
| 190 esac | |
| 191 done | |
| 192 | |
| 193 # Print help when needed. | |
| 194 if [ "$DO_HELP" ]; then | |
| 195 echo \ | |
| 196 "Usage: $PROGNAME [options] [<build-type> ...] | |
| 197 | |
| 198 This script is used to ensure that all OpenSSL build variants compile | |
| 199 properly. It can be used after modifying external/openssl/openssl.config | |
| 200 and re-running import_openssl.sh to check that any changes didn't break | |
| 201 the build. | |
| 202 | |
| 203 A <build-type> is a description of a given build of the library and its | |
| 204 program. Its format is: | |
| 205 | |
| 206 <compiler>-<system>-<arch> | |
| 207 | |
| 208 Where: <compiler> is either 'gcc' or 'clang'. | |
| 209 <system> is 'android', 'linux' or 'darwin'. | |
| 210 <arch> is 'arm', 'x86' or 'mips'. | |
| 211 | |
| 212 By default, it rebuilds the sources for the following build types: | |
| 213 " | |
| 214 for BUILD_TYPE in $BUILD_TYPES; do | |
| 215 echo " $BUILD_TYPE" | |
| 216 done | |
| 217 | |
| 218 echo \ | |
| 219 "However, you can pass custom values on the command-line instead. | |
| 220 | |
| 221 This scripts generates a custom Makefile in a temporary directory, then | |
| 222 launches 'make' in it to build all binaries in parallel. In case of | |
| 223 problem, you can use the --build-dir=<path> option to specify a custom | |
| 224 build-directory, which will _not_ be removed when the script exits. | |
| 225 | |
| 226 For example, to better see why a build fails: | |
| 227 | |
| 228 ./$PROGNAME --build-dir=/tmp/mydir | |
| 229 make -C /tmp/mydir V=1 | |
| 230 | |
| 231 Valid options: | |
| 232 | |
| 233 --help|-h|-? Print this message. | |
| 234 --build-dir=<path> Specify build directory. | |
| 235 --jobs=<count> Run <count> parallel build jobs [$NUM_JOBS]. | |
| 236 -j<count> Same as --jobs=<count>. | |
| 237 --verbose Increase verbosity. | |
| 238 --quiet Decrease verbosity. | |
| 239 " | |
| 240 exit 0 | |
| 241 fi | |
| 242 | |
| 243 log "Host OS: $HOST_OS" | |
| 244 log "Host arch: $HOST_ARCH" | |
| 245 log "Host CPU count: $NUM_CORES" | |
| 246 | |
| 247 if [ -z "$BUILD_TYPES" ]; then | |
| 248 BUILD_TYPES="$ANDROID_BUILD_TYPES $HOST_BUILD_TYPES" | |
| 249 fi | |
| 250 log "Build types: $BUILD_TYPES" | |
| 251 | |
| 252 if [ -z "$BUILD_DIR" ]; then | |
| 253 # Create a temporary directory, ensure it gets destroyed properly | |
| 254 # when the script exits. | |
| 255 BUILD_DIR=$(mktemp -d) | |
| 256 clean_build_dir () { | |
| 257 log "Cleaning up temporary directory: $BUILD_DIR" | |
| 258 rm -rf "$BUILD_DIR" | |
| 259 exit $1 | |
| 260 } | |
| 261 trap "clean_build_dir 0" EXIT | |
| 262 trap "clean_build_dir \$?" INT HUP QUIT TERM | |
| 263 log "Using temporary build directory: $BUILD_DIR" | |
| 264 else | |
| 265 log "Using user build directory: $BUILD_DIR" | |
| 266 fi | |
| 267 | |
| 268 mkdir -p "$BUILD_DIR" && rm -rf "$BUILD_DIR"/* | |
| 269 | |
| 270 MAKEFILE=$BUILD_DIR/GNUmakefile | |
| 271 | |
| 272 # Return source files for a given module and architecture. | |
| 273 # $1: module prefix (e.g. CRYPTO) | |
| 274 # $2: build arch. | |
| 275 get_module_src_files_for_arch () { | |
| 276 local prefix=$1 | |
| 277 local arch=$2 | |
| 278 local src_files="$(var_value OPENSSL_${prefix}_SOURCES)" | |
| 279 src_files="$src_files $(var_value OPENSSL_${prefix}_SOURCES_${arch})" | |
| 280 local exclude_files="$(var_value OPENSSL_${prefix}_SOURCES_EXCLUDES_${arch})" | |
| 281 src_files=$(filter_out "$src_files" "$exclude_files") | |
| 282 echo "$src_files" | |
| 283 } | |
| 284 | |
| 285 # Return the compiler defines for a given module and architecture | |
| 286 # $1: module prefix (e.g. CRYPTO) | |
| 287 # $2 build arch. | |
| 288 get_module_defines_for_arch () { | |
| 289 local prefix=$1 | |
| 290 local arch=$2 | |
| 291 local defines="$(var_value OPENSSL_${prefix}_DEFINES)" | |
| 292 defines="$defines $(var_value OPENSSL_${prefix}_DEFINES_${arch})" | |
| 293 echo "$defines" | |
| 294 } | |
| 295 | |
| 296 # $1: module prefix (e.g. CRYPTO) | |
| 297 get_module_c_includes () { | |
| 298 var_value OPENSSL_$1_INCLUDES | |
| 299 } | |
| 300 | |
| 301 # $1: build type (e.g. gcc-android-arm) | |
| 302 # Out: build arch. | |
| 303 get_build_arch () { | |
| 304 echo "$1" | cut -d- -f3 | |
| 305 } | |
| 306 | |
| 307 # $1: build arch | |
| 308 # Out: GNU configuration target (e.g. arm-linux-androideabi) | |
| 309 get_build_arch_target () { | |
| 310 case $1 in | |
| 311 arm) | |
| 312 echo "arm-linux-androideabi" | |
| 313 ;; | |
| 314 x86) | |
| 315 echo "i686-linux-android" | |
| 316 ;; | |
| 317 mips) | |
| 318 echo "mipsel-linux-android" | |
| 319 ;; | |
| 320 *) | |
| 321 echo "$1-linux-android" | |
| 322 ;; | |
| 323 esac | |
| 324 } | |
| 325 | |
| 326 GCC_VERSION=4.7 | |
| 327 CLANG_VERSION=3.1 | |
| 328 | |
| 329 get_prebuilt_gcc_dir_for_arch () { | |
| 330 local arch=$1 | |
| 331 local target=$(get_build_arch_target $arch) | |
| 332 echo "$ANDROID_BUILD_TOP/prebuilts/gcc/$ANDROID_HOST_TAG/$arch/$target-$GCC_VE
RSION" | |
| 333 } | |
| 334 | |
| 335 get_prebuilt_clang () { | |
| 336 echo "$ANDROID_BUILD_TOP/prebuilts/clang/$ANDROID_HOST_TAG/$CLANG_VERSION/clan
g" | |
| 337 } | |
| 338 | |
| 339 get_prebuilt_ndk_sysroot_for_arch () { | |
| 340 echo "$ANDROID_BUILD_TOP/prebuilts/ndk/current/platforms/android-9/arch-$1" | |
| 341 } | |
| 342 | |
| 343 get_c_runtime_file () { | |
| 344 local build_type=$1 | |
| 345 local arch=$(get_build_arch $build_type) | |
| 346 local filename=$2 | |
| 347 echo "$(get_prebuilt_ndk_sysroot_for_arch $arch)/usr/lib/$filename" | |
| 348 } | |
| 349 | |
| 350 # $1: build type (e.g. gcc-android-arm) | |
| 351 get_build_compiler () { | |
| 352 local arch=$(get_build_arch $1) | |
| 353 local target=$(get_build_arch_target $arch) | |
| 354 local gcc_dir=$(get_prebuilt_gcc_dir_for_arch $arch); | |
| 355 local result | |
| 356 | |
| 357 # Get the toolchain binary. | |
| 358 case $1 in | |
| 359 gcc-android-*) | |
| 360 result="$gcc_dir/bin/$target-gcc" | |
| 361 ;; | |
| 362 clang-android-*) | |
| 363 result="$(get_prebuilt_clang) -target $target -B$gcc_dir/$target/bin -I$gc
c_dir/lib/gcc/$target/$GCC_VERSION/include" | |
| 364 ;; | |
| 365 gcc-*) | |
| 366 result=gcc | |
| 367 ;; | |
| 368 clang-*) # Must have host clang compiler. | |
| 369 result=clang | |
| 370 ;; | |
| 371 esac | |
| 372 | |
| 373 compiler_check=$(which $result 2>/dev/null || echo "") | |
| 374 if [ -z "$compiler_check" ]; then | |
| 375 panic "Could not find compiler: $result" | |
| 376 fi | |
| 377 | |
| 378 # Get the Android sysroot if needed. | |
| 379 case $1 in | |
| 380 *-android-*) | |
| 381 result="$result --sysroot=$(get_prebuilt_ndk_sysroot_for_arch $arch)" | |
| 382 ;; | |
| 383 esac | |
| 384 | |
| 385 # Force -m32 flag when needed for 32-bit builds. | |
| 386 case $1 in | |
| 387 *-linux-x86|*-darwin-x86|*-generic32) | |
| 388 result="$result -m32" | |
| 389 ;; | |
| 390 esac | |
| 391 echo "$result" | |
| 392 } | |
| 393 | |
| 394 # $1: build type. | |
| 395 # Out: common compiler flags for this build. | |
| 396 get_build_c_flags () { | |
| 397 local result="-O2 -fPIC" | |
| 398 case $1 in | |
| 399 *-android-arm) | |
| 400 result="$result -march=armv7-a -mfpu=vfpv3-d16" | |
| 401 ;; | |
| 402 esac | |
| 403 | |
| 404 case $1 in | |
| 405 *-generic32|*-generic64) | |
| 406 # Generic builds do not compile without this flag. | |
| 407 result="$result -DOPENSSL_NO_ASM" | |
| 408 ;; | |
| 409 esac | |
| 410 echo "$result" | |
| 411 } | |
| 412 | |
| 413 # $1: build type. | |
| 414 # Out: linker for this build. | |
| 415 get_build_linker () { | |
| 416 get_build_compiler $1 | |
| 417 } | |
| 418 | |
| 419 clear_sources () { | |
| 420 g_all_objs="" | |
| 421 } | |
| 422 | |
| 423 # Generate build instructions to compile source files. | |
| 424 # Also update g_all_objs. | |
| 425 # $1: module prefix (e.g. CRYPTO) | |
| 426 # $2: build type | |
| 427 build_sources () { | |
| 428 local prefix=$1 | |
| 429 local build_type=$2 | |
| 430 echo "## build_sources prefix='$prefix' build_type='$build_type'" | |
| 431 local arch=$(get_build_arch $build_type) | |
| 432 local src_files=$(get_module_src_files_for_arch $prefix $arch) | |
| 433 local c_defines=$(get_module_defines_for_arch $prefix $arch) | |
| 434 local c_includes=$(get_module_c_includes $prefix "$SRC_DIR") | |
| 435 local build_cc=$(get_build_compiler $build_type) | |
| 436 local build_cflags=$(get_build_c_flags $build_type) | |
| 437 local build_linker=$(get_build_linker $build_type) | |
| 438 local src obj def inc | |
| 439 | |
| 440 printf "OUT_DIR := $OUT_DIR/$build_type\n\n" | |
| 441 printf "BUILD_CC := $build_cc\n\n" | |
| 442 printf "BUILD_LINKER := $build_linker\n\n" | |
| 443 printf "BUILD_CFLAGS := $build_cflags" | |
| 444 for inc in $c_includes; do | |
| 445 printf " -I\$(SRC_DIR)/$inc" | |
| 446 done | |
| 447 for def in $c_defines; do | |
| 448 printf " -D$def" | |
| 449 done | |
| 450 printf "\n\n" | |
| 451 printf "BUILD_OBJECTS :=\n\n" | |
| 452 | |
| 453 case $build_type in | |
| 454 clang-android-*) | |
| 455 # The version of clang that comes with the platform build doesn't | |
| 456 # support simple linking of shared libraries and executables. One | |
| 457 # has to provide the C runtime files explicitely. | |
| 458 local crtbegin_so=$(get_c_runtime_file $build_type crtbegin_so.o) | |
| 459 local crtend_so=$(get_c_runtime_file $build_type crtend_so.o) | |
| 460 local crtbegin_exe=$(get_c_runtime_file $build_type crtbegin_dynamic.o) | |
| 461 local crtend_exe=$(get_c_runtime_file $build_type crtend_android.o) | |
| 462 printf "CRTBEGIN_SO := $crtbegin_so\n" | |
| 463 printf "CRTEND_SO := $crtend_so\n" | |
| 464 printf "CRTBEGIN_EXE := $crtbegin_exe\n" | |
| 465 printf "CRTEND_EXE := $crtend_exe\n" | |
| 466 printf "\n" | |
| 467 ;; | |
| 468 esac | |
| 469 | |
| 470 for src in $src_files; do | |
| 471 obj=$(src_to_obj $src) | |
| 472 g_all_objs="$g_all_objs $obj" | |
| 473 printf "OBJ := \$(OUT_DIR)/$obj\n" | |
| 474 printf "BUILD_OBJECTS += \$(OBJ)\n" | |
| 475 printf "\$(OBJ): PRIVATE_CC := \$(BUILD_CC)\n" | |
| 476 printf "\$(OBJ): PRIVATE_CFLAGS := \$(BUILD_CFLAGS)\n" | |
| 477 printf "\$(OBJ): \$(SRC_DIR)/$src\n" | |
| 478 printf "\t@echo [$build_type] CC $src\n" | |
| 479 printf "\t@mkdir -p \$\$(dirname \$@)\n" | |
| 480 printf "\t\$(hide) \$(PRIVATE_CC) \$(PRIVATE_CFLAGS) -c -o \$@ \$<\n" | |
| 481 printf "\n" | |
| 482 done | |
| 483 printf "\n" | |
| 484 } | |
| 485 | |
| 486 # $1: library name (e.g. crypto). | |
| 487 # $2: module prefix (e.g. CRYPTO). | |
| 488 # $3: build type. | |
| 489 # $4: source directory. | |
| 490 # $5: output directory. | |
| 491 build_shared_library () { | |
| 492 local name=$1 | |
| 493 local prefix=$2 | |
| 494 local build_type=$3 | |
| 495 local src_dir="$4" | |
| 496 local out_dir="$5" | |
| 497 local shlib="lib${name}.so" | |
| 498 local build_linker=$(get_build_linker $build_type) | |
| 499 clear_sources | |
| 500 build_sources $prefix $build_type | |
| 501 | |
| 502 # TODO(digit): Make the clang build link properly. | |
| 503 printf "SHLIB=\$(OUT_DIR)/$shlib\n" | |
| 504 printf "\$(SHLIB): PRIVATE_LINKER := \$(BUILD_LINKER)\n" | |
| 505 case $build_type in | |
| 506 clang-android-*) | |
| 507 printf "\$(SHLIB): PRIVATE_CRTBEGIN := \$(CRTBEGIN_SO)\n" | |
| 508 printf "\$(SHLIB): PRIVATE_CRTEND := \$(CRTEND_SO)\n" | |
| 509 ;; | |
| 510 esac | |
| 511 printf "\$(SHLIB): \$(BUILD_OBJECTS)\n" | |
| 512 printf "\t@echo [$build_type] SHARED_LIBRARY $(basename $shlib)\n" | |
| 513 printf "\t@mkdir -p \$\$(dirname \$@)\n" | |
| 514 case $build_type in | |
| 515 clang-android-*) | |
| 516 printf "\t\$(hide) \$(PRIVATE_LINKER) -nostdlib -shared -o \$@ \$(PRIVATE_
CRTBEGIN) \$^ \$(PRIVATE_CRTEND)\n" | |
| 517 ;; | |
| 518 *) | |
| 519 printf "\t\$(hide) \$(PRIVATE_LINKER) -shared -o \$@ \$^\n" | |
| 520 ;; | |
| 521 esac | |
| 522 printf "\n" | |
| 523 } | |
| 524 | |
| 525 # $1: executable name. | |
| 526 # $2: module prefix (e.g. APPS). | |
| 527 # $3: build type. | |
| 528 # $4: source directory. | |
| 529 # $5: output directory. | |
| 530 # $6: dependent shared libraries (e.g. 'crypto ssl') | |
| 531 build_executable () { | |
| 532 local name=$1 | |
| 533 local prefix=$2 | |
| 534 local build_type=$3 | |
| 535 local src_dir="$4" | |
| 536 local out_dir="$5" | |
| 537 local shlibs="$6" | |
| 538 local build_linker=$(get_build_linker $build_type) | |
| 539 clear_sources | |
| 540 build_sources $prefix $build_type | |
| 541 | |
| 542 # TODO(digit): Make the clang build link properly. | |
| 543 exec=$name | |
| 544 all_shlibs= | |
| 545 printf "EXEC := \$(OUT_DIR)/$name\n" | |
| 546 printf "openssl_all: \$(EXEC)\n" | |
| 547 printf "\$(EXEC): PRIVATE_LINKER := \$(BUILD_LINKER)\n" | |
| 548 printf "\$(EXEC): \$(BUILD_OBJECTS)" | |
| 549 for lib in $shlibs; do | |
| 550 printf " \$(OUT_DIR)/lib${lib}.so" | |
| 551 done | |
| 552 printf "\n" | |
| 553 printf "\t@echo [$build_type] EXECUTABLE $name\n" | |
| 554 printf "\t@mkdir -p \$\$(dirname \$@)\n" | |
| 555 printf "\t\$(hide) \$(PRIVATE_LINKER) -o \$@ \$^\n" | |
| 556 printf "\n" | |
| 557 } | |
| 558 | |
| 559 ALL_BUILDS= | |
| 560 | |
| 561 generate_openssl_build () { | |
| 562 local build_type=$1 | |
| 563 local out="$OUT_DIR/$build_type" | |
| 564 ALL_BUILDS="$ALL_BUILDS $build_type" | |
| 565 echo "# Build type: $build_type" | |
| 566 build_shared_library crypto CRYPTO $build_type "$SRC_DIR" "$out" | |
| 567 build_shared_library ssl SSL $build_type "$SRC_DIR" "$out" | |
| 568 build_executable openssl APPS $build_type "$SRC_DIR" "$out" "crypto ssl" | |
| 569 } | |
| 570 | |
| 571 generate_makefile () { | |
| 572 echo \ | |
| 573 "# Auto-generated by $PROGDIR - do not edit | |
| 574 | |
| 575 .PHONY: openssl_all | |
| 576 | |
| 577 all: openssl_all | |
| 578 | |
| 579 # Use 'make V=1' to print build commands. | |
| 580 ifeq (1,\$(V)) | |
| 581 hide := | |
| 582 else | |
| 583 hide := @ | |
| 584 endif | |
| 585 | |
| 586 SRC_DIR=$SRC_DIR | |
| 587 OUT_DIR=$OUT_DIR | |
| 588 " | |
| 589 | |
| 590 for BUILD_TYPE in $BUILD_TYPES; do | |
| 591 generate_openssl_build gcc-$BUILD_TYPE | |
| 592 done | |
| 593 | |
| 594 # TODO(digit): Make the Clang build run. | |
| 595 # for BUILD_TYPE in $ANDROID_BUILD_TYPES; do | |
| 596 # generate_openssl_build clang-$BUILD_TYPE | |
| 597 # done | |
| 598 } | |
| 599 | |
| 600 . $SRC_DIR/openssl.config | |
| 601 | |
| 602 | |
| 603 | |
| 604 dump "Generating Makefile" | |
| 605 log "Makefile path: $MAKEFILE" | |
| 606 generate_makefile > $MAKEFILE | |
| 607 | |
| 608 dump "Building libraries with $NUM_JOBS jobs" | |
| 609 dump "For the following builds:" | |
| 610 for BUILD in $ALL_BUILDS; do | |
| 611 dump " $BUILD" | |
| 612 done | |
| 613 MAKE_FLAGS="-j$NUM_JOBS" | |
| 614 if [ "$VERBOSE" -gt 2 ]; then | |
| 615 MAKE_FLAGS="$MAKE_FLAGS V=1" | |
| 616 fi | |
| 617 run make $MAKE_FLAGS -f "$MAKEFILE" -C "$BUILD_DIR" | |
| 618 case $? in | |
| 619 0) | |
| 620 dump "All OK, congratulations!" | |
| 621 ;; | |
| 622 *) | |
| 623 dump "Error, try doing the following to inspect the issues:" | |
| 624 dump " $PROGNAME --build-dir=/tmp/mybuild" | |
| 625 dump " make -C /tmp/mybuild V=1" | |
| 626 dump "" | |
| 627 ;; | |
| 628 esac | |
| OLD | NEW |