Index: openssl/check-all-builds.sh |
diff --git a/openssl/check-all-builds.sh b/openssl/check-all-builds.sh |
deleted file mode 100755 |
index 98dc391c3327cb9a39e95082df7905f12c674513..0000000000000000000000000000000000000000 |
--- a/openssl/check-all-builds.sh |
+++ /dev/null |
@@ -1,628 +0,0 @@ |
-#!/bin/sh |
-# |
- |
-set -e |
-export LANG=C |
-export LC_ALL=C |
- |
-PROGDIR=$(dirname "$0") |
-PROGNAME=$(basename "$0") |
- |
-panic () { |
- echo "ERROR: $@" |
- exit 1 |
-} |
- |
-VERBOSE=1 |
- |
-# Dump message is $VERBOSE >= $1 |
-# $1+: message. |
-dump_n () { |
- local LOG_LEVEL=$1 |
- shift |
- if [ "$VERBOSE" -ge "$LOG_LEVEL" ]; then |
- printf "%s\n" "$@" |
- fi |
-} |
- |
-# Dump a message unless --quiet is used. |
-# $1+: message. |
-dump () { |
- dump_n 1 "$@" |
-} |
- |
-# Dump a message if --verbose is used only. |
-# $1+: message. |
-log () { |
- dump_n 2 "$@" |
-} |
- |
-# Run a command silently, unless --verbose or '--verbose --verbose' |
-# is used. |
-# $1+: Command |
-# Return: command status. |
-run () { |
- log "COMMAND: $*" |
- case $VERBOSE in |
- 0) |
- "$@" >/dev/null 2>&1 || return $? |
- ;; |
- 1) |
- "$@" >/dev/null || return $? |
- ;; |
- *) |
- "$@" || return $? |
- ;; |
- esac |
-} |
- |
-# $1: string |
-# Out: input string, with capital letters replaced by small ones. |
-tolower () { |
- echo "$1" | tr '[A-Z]' '[a-z]' |
-} |
- |
-# Return value of a given variable. |
-# $1: Variable name |
-var_value () { |
- eval printf \"%s\" \"\$$1\" |
-} |
- |
-# Remove some items from a list |
-# $1: input space-separated list |
-# $2: space-separated list of items to remove from 1 |
-# Out: items of $1 without items of $2 |
-filter_out () { |
- local TMP=$(mktemp) |
- local RESULT |
- printf "" > $TMP |
- echo "$2" | tr ' ' '\n' > $TMP |
- RESULT=$(echo "$1" | tr ' ' '\n' | fgrep -x -v -f $TMP | tr '\n' ' ') |
- rm -f $TMP |
- echo "$RESULT" |
-} |
- |
-src_to_obj () { |
- case $1 in |
- *.c) |
- echo ${1%%.c}.o |
- ;; |
- *.S) |
- echo ${1%%.S}.o |
- ;; |
- *) |
- echo $1 |
- ;; |
- esac |
-} |
- |
-# Determine host operating system. |
-HOST_OS=$(uname -s) |
-case $HOST_OS in |
- Linux) |
- HOST_OS=linux |
- ;; |
- Darwin) |
- HOST_OS=darwin |
- ;; |
-esac |
- |
-# Determine host architecture |
-HOST_ARCH=$(uname -m) |
-case $HOST_ARCH in |
- i?86) |
- HOST_ARCH=x86 |
- ;; |
-esac |
- |
-ANDROID_HOST_TAG=$HOST_OS-$HOST_ARCH |
- |
-case $ANDROID_HOST_TAG in |
- linux-x86_64|darwin-x86-64) |
- ANDROID_HOST_TAG=$HOST_OS-x86 |
- ;; |
- *) |
- panic "Sorry, this script can only run on 64-bit Linux or Darwin" |
-esac |
- |
-# Determine number of cores |
-case $HOST_OS in |
- linux) |
- NUM_CORES=$(grep -c "processor" /proc/cpuinfo) |
- ;; |
- darwin) |
- NUM_CORES=$(sysctl -n hw.ncpu) |
- ;; |
- *) |
- NUM_CORES=1 |
- ;; |
-esac |
- |
-# The list of supported Android target architectures. |
-ANDROID_ARCHS="arm x86 mips" |
- |
-BUILD_TYPES= |
-for ARCH in $ANDROID_ARCHS; do |
- BUILD_TYPES="$BUILD_TYPES android-$ARCH" |
-done |
-ANDROID_BUILD_TYPES=$BUILD_TYPES |
- |
-# NOTE: The $HOST_OS-x86_64 is currently broken because the single |
-# <openssl/opensslconf.h> header is tailored for 32-bits. |
-HOST_BUILD_TYPES="$HOST_OS-x86 $HOST_OS-generic32 $HOST_OS-generic64" |
- |
-BUILD_TYPES="$ANDROID_BUILD_TYPES $HOST_BUILD_TYPES" |
- |
-# Parse command-line |
-DO_HELP= |
-SRC_DIR=$(cd $PROGDIR && pwd) |
-OUT_DIR=out |
-BUILD_DIR= |
-BUILD_TYPES= |
-NUM_JOBS=$NUM_CORES |
-ANDROID_BUILD_TOP=$(cd $PROGDIR/../.. && pwd) |
-for OPT; do |
- case $OPT in |
- --help|-h|-?) |
- DO_HELP=true |
- ;; |
- --build-dir=*) |
- BUILD_DIR=${OPT##--build-dir=} |
- ;; |
- --verbose) |
- VERBOSE=$(( $VERBOSE + 1 )) |
- ;; |
- --jobs=*) |
- NUM_JOBS=${OPT##--jobs=} |
- ;; |
- --quiet) |
- VERBOSE=$(( $VERBOSE - 1 )) |
- ;; |
- -j*) |
- NUM_JOBS=${OPT##-j} |
- ;; |
- -*) |
- panic "Unknown option '$OPT', see --help for details." |
- ;; |
- *) |
- BUILD_TYPES="$BUILD_TYPES $OPT" |
- ;; |
- esac |
-done |
- |
-# Print help when needed. |
-if [ "$DO_HELP" ]; then |
- echo \ |
-"Usage: $PROGNAME [options] [<build-type> ...] |
- |
-This script is used to ensure that all OpenSSL build variants compile |
-properly. It can be used after modifying external/openssl/openssl.config |
-and re-running import_openssl.sh to check that any changes didn't break |
-the build. |
- |
-A <build-type> is a description of a given build of the library and its |
-program. Its format is: |
- |
- <compiler>-<system>-<arch> |
- |
-Where: <compiler> is either 'gcc' or 'clang'. |
- <system> is 'android', 'linux' or 'darwin'. |
- <arch> is 'arm', 'x86' or 'mips'. |
- |
-By default, it rebuilds the sources for the following build types: |
-" |
- for BUILD_TYPE in $BUILD_TYPES; do |
- echo " $BUILD_TYPE" |
- done |
- |
- echo \ |
-"However, you can pass custom values on the command-line instead. |
- |
-This scripts generates a custom Makefile in a temporary directory, then |
-launches 'make' in it to build all binaries in parallel. In case of |
-problem, you can use the --build-dir=<path> option to specify a custom |
-build-directory, which will _not_ be removed when the script exits. |
- |
-For example, to better see why a build fails: |
- |
- ./$PROGNAME --build-dir=/tmp/mydir |
- make -C /tmp/mydir V=1 |
- |
-Valid options: |
- |
- --help|-h|-? Print this message. |
- --build-dir=<path> Specify build directory. |
- --jobs=<count> Run <count> parallel build jobs [$NUM_JOBS]. |
- -j<count> Same as --jobs=<count>. |
- --verbose Increase verbosity. |
- --quiet Decrease verbosity. |
-" |
- exit 0 |
-fi |
- |
-log "Host OS: $HOST_OS" |
-log "Host arch: $HOST_ARCH" |
-log "Host CPU count: $NUM_CORES" |
- |
-if [ -z "$BUILD_TYPES" ]; then |
- BUILD_TYPES="$ANDROID_BUILD_TYPES $HOST_BUILD_TYPES" |
-fi |
-log "Build types: $BUILD_TYPES" |
- |
-if [ -z "$BUILD_DIR" ]; then |
- # Create a temporary directory, ensure it gets destroyed properly |
- # when the script exits. |
- BUILD_DIR=$(mktemp -d) |
- clean_build_dir () { |
- log "Cleaning up temporary directory: $BUILD_DIR" |
- rm -rf "$BUILD_DIR" |
- exit $1 |
- } |
- trap "clean_build_dir 0" EXIT |
- trap "clean_build_dir \$?" INT HUP QUIT TERM |
- log "Using temporary build directory: $BUILD_DIR" |
-else |
- log "Using user build directory: $BUILD_DIR" |
-fi |
- |
-mkdir -p "$BUILD_DIR" && rm -rf "$BUILD_DIR"/* |
- |
-MAKEFILE=$BUILD_DIR/GNUmakefile |
- |
-# Return source files for a given module and architecture. |
-# $1: module prefix (e.g. CRYPTO) |
-# $2: build arch. |
-get_module_src_files_for_arch () { |
- local prefix=$1 |
- local arch=$2 |
- local src_files="$(var_value OPENSSL_${prefix}_SOURCES)" |
- src_files="$src_files $(var_value OPENSSL_${prefix}_SOURCES_${arch})" |
- local exclude_files="$(var_value OPENSSL_${prefix}_SOURCES_EXCLUDES_${arch})" |
- src_files=$(filter_out "$src_files" "$exclude_files") |
- echo "$src_files" |
-} |
- |
-# Return the compiler defines for a given module and architecture |
-# $1: module prefix (e.g. CRYPTO) |
-# $2 build arch. |
-get_module_defines_for_arch () { |
- local prefix=$1 |
- local arch=$2 |
- local defines="$(var_value OPENSSL_${prefix}_DEFINES)" |
- defines="$defines $(var_value OPENSSL_${prefix}_DEFINES_${arch})" |
- echo "$defines" |
-} |
- |
-# $1: module prefix (e.g. CRYPTO) |
-get_module_c_includes () { |
- var_value OPENSSL_$1_INCLUDES |
-} |
- |
-# $1: build type (e.g. gcc-android-arm) |
-# Out: build arch. |
-get_build_arch () { |
- echo "$1" | cut -d- -f3 |
-} |
- |
-# $1: build arch |
-# Out: GNU configuration target (e.g. arm-linux-androideabi) |
-get_build_arch_target () { |
- case $1 in |
- arm) |
- echo "arm-linux-androideabi" |
- ;; |
- x86) |
- echo "i686-linux-android" |
- ;; |
- mips) |
- echo "mipsel-linux-android" |
- ;; |
- *) |
- echo "$1-linux-android" |
- ;; |
- esac |
-} |
- |
-GCC_VERSION=4.7 |
-CLANG_VERSION=3.1 |
- |
-get_prebuilt_gcc_dir_for_arch () { |
- local arch=$1 |
- local target=$(get_build_arch_target $arch) |
- echo "$ANDROID_BUILD_TOP/prebuilts/gcc/$ANDROID_HOST_TAG/$arch/$target-$GCC_VERSION" |
-} |
- |
-get_prebuilt_clang () { |
- echo "$ANDROID_BUILD_TOP/prebuilts/clang/$ANDROID_HOST_TAG/$CLANG_VERSION/clang" |
-} |
- |
-get_prebuilt_ndk_sysroot_for_arch () { |
- echo "$ANDROID_BUILD_TOP/prebuilts/ndk/current/platforms/android-9/arch-$1" |
-} |
- |
-get_c_runtime_file () { |
- local build_type=$1 |
- local arch=$(get_build_arch $build_type) |
- local filename=$2 |
- echo "$(get_prebuilt_ndk_sysroot_for_arch $arch)/usr/lib/$filename" |
-} |
- |
-# $1: build type (e.g. gcc-android-arm) |
-get_build_compiler () { |
- local arch=$(get_build_arch $1) |
- local target=$(get_build_arch_target $arch) |
- local gcc_dir=$(get_prebuilt_gcc_dir_for_arch $arch); |
- local result |
- |
- # Get the toolchain binary. |
- case $1 in |
- gcc-android-*) |
- result="$gcc_dir/bin/$target-gcc" |
- ;; |
- clang-android-*) |
- result="$(get_prebuilt_clang) -target $target -B$gcc_dir/$target/bin -I$gcc_dir/lib/gcc/$target/$GCC_VERSION/include" |
- ;; |
- gcc-*) |
- result=gcc |
- ;; |
- clang-*) # Must have host clang compiler. |
- result=clang |
- ;; |
- esac |
- |
- compiler_check=$(which $result 2>/dev/null || echo "") |
- if [ -z "$compiler_check" ]; then |
- panic "Could not find compiler: $result" |
- fi |
- |
- # Get the Android sysroot if needed. |
- case $1 in |
- *-android-*) |
- result="$result --sysroot=$(get_prebuilt_ndk_sysroot_for_arch $arch)" |
- ;; |
- esac |
- |
- # Force -m32 flag when needed for 32-bit builds. |
- case $1 in |
- *-linux-x86|*-darwin-x86|*-generic32) |
- result="$result -m32" |
- ;; |
- esac |
- echo "$result" |
-} |
- |
-# $1: build type. |
-# Out: common compiler flags for this build. |
-get_build_c_flags () { |
- local result="-O2 -fPIC" |
- case $1 in |
- *-android-arm) |
- result="$result -march=armv7-a -mfpu=vfpv3-d16" |
- ;; |
- esac |
- |
- case $1 in |
- *-generic32|*-generic64) |
- # Generic builds do not compile without this flag. |
- result="$result -DOPENSSL_NO_ASM" |
- ;; |
- esac |
- echo "$result" |
-} |
- |
-# $1: build type. |
-# Out: linker for this build. |
-get_build_linker () { |
- get_build_compiler $1 |
-} |
- |
-clear_sources () { |
- g_all_objs="" |
-} |
- |
-# Generate build instructions to compile source files. |
-# Also update g_all_objs. |
-# $1: module prefix (e.g. CRYPTO) |
-# $2: build type |
-build_sources () { |
- local prefix=$1 |
- local build_type=$2 |
- echo "## build_sources prefix='$prefix' build_type='$build_type'" |
- local arch=$(get_build_arch $build_type) |
- local src_files=$(get_module_src_files_for_arch $prefix $arch) |
- local c_defines=$(get_module_defines_for_arch $prefix $arch) |
- local c_includes=$(get_module_c_includes $prefix "$SRC_DIR") |
- local build_cc=$(get_build_compiler $build_type) |
- local build_cflags=$(get_build_c_flags $build_type) |
- local build_linker=$(get_build_linker $build_type) |
- local src obj def inc |
- |
- printf "OUT_DIR := $OUT_DIR/$build_type\n\n" |
- printf "BUILD_CC := $build_cc\n\n" |
- printf "BUILD_LINKER := $build_linker\n\n" |
- printf "BUILD_CFLAGS := $build_cflags" |
- for inc in $c_includes; do |
- printf " -I\$(SRC_DIR)/$inc" |
- done |
- for def in $c_defines; do |
- printf " -D$def" |
- done |
- printf "\n\n" |
- printf "BUILD_OBJECTS :=\n\n" |
- |
- case $build_type in |
- clang-android-*) |
- # The version of clang that comes with the platform build doesn't |
- # support simple linking of shared libraries and executables. One |
- # has to provide the C runtime files explicitely. |
- local crtbegin_so=$(get_c_runtime_file $build_type crtbegin_so.o) |
- local crtend_so=$(get_c_runtime_file $build_type crtend_so.o) |
- local crtbegin_exe=$(get_c_runtime_file $build_type crtbegin_dynamic.o) |
- local crtend_exe=$(get_c_runtime_file $build_type crtend_android.o) |
- printf "CRTBEGIN_SO := $crtbegin_so\n" |
- printf "CRTEND_SO := $crtend_so\n" |
- printf "CRTBEGIN_EXE := $crtbegin_exe\n" |
- printf "CRTEND_EXE := $crtend_exe\n" |
- printf "\n" |
- ;; |
- esac |
- |
- for src in $src_files; do |
- obj=$(src_to_obj $src) |
- g_all_objs="$g_all_objs $obj" |
- printf "OBJ := \$(OUT_DIR)/$obj\n" |
- printf "BUILD_OBJECTS += \$(OBJ)\n" |
- printf "\$(OBJ): PRIVATE_CC := \$(BUILD_CC)\n" |
- printf "\$(OBJ): PRIVATE_CFLAGS := \$(BUILD_CFLAGS)\n" |
- printf "\$(OBJ): \$(SRC_DIR)/$src\n" |
- printf "\t@echo [$build_type] CC $src\n" |
- printf "\t@mkdir -p \$\$(dirname \$@)\n" |
- printf "\t\$(hide) \$(PRIVATE_CC) \$(PRIVATE_CFLAGS) -c -o \$@ \$<\n" |
- printf "\n" |
- done |
- printf "\n" |
-} |
- |
-# $1: library name (e.g. crypto). |
-# $2: module prefix (e.g. CRYPTO). |
-# $3: build type. |
-# $4: source directory. |
-# $5: output directory. |
-build_shared_library () { |
- local name=$1 |
- local prefix=$2 |
- local build_type=$3 |
- local src_dir="$4" |
- local out_dir="$5" |
- local shlib="lib${name}.so" |
- local build_linker=$(get_build_linker $build_type) |
- clear_sources |
- build_sources $prefix $build_type |
- |
- # TODO(digit): Make the clang build link properly. |
- printf "SHLIB=\$(OUT_DIR)/$shlib\n" |
- printf "\$(SHLIB): PRIVATE_LINKER := \$(BUILD_LINKER)\n" |
- case $build_type in |
- clang-android-*) |
- printf "\$(SHLIB): PRIVATE_CRTBEGIN := \$(CRTBEGIN_SO)\n" |
- printf "\$(SHLIB): PRIVATE_CRTEND := \$(CRTEND_SO)\n" |
- ;; |
- esac |
- printf "\$(SHLIB): \$(BUILD_OBJECTS)\n" |
- printf "\t@echo [$build_type] SHARED_LIBRARY $(basename $shlib)\n" |
- printf "\t@mkdir -p \$\$(dirname \$@)\n" |
- case $build_type in |
- clang-android-*) |
- printf "\t\$(hide) \$(PRIVATE_LINKER) -nostdlib -shared -o \$@ \$(PRIVATE_CRTBEGIN) \$^ \$(PRIVATE_CRTEND)\n" |
- ;; |
- *) |
- printf "\t\$(hide) \$(PRIVATE_LINKER) -shared -o \$@ \$^\n" |
- ;; |
- esac |
- printf "\n" |
-} |
- |
-# $1: executable name. |
-# $2: module prefix (e.g. APPS). |
-# $3: build type. |
-# $4: source directory. |
-# $5: output directory. |
-# $6: dependent shared libraries (e.g. 'crypto ssl') |
-build_executable () { |
- local name=$1 |
- local prefix=$2 |
- local build_type=$3 |
- local src_dir="$4" |
- local out_dir="$5" |
- local shlibs="$6" |
- local build_linker=$(get_build_linker $build_type) |
- clear_sources |
- build_sources $prefix $build_type |
- |
- # TODO(digit): Make the clang build link properly. |
- exec=$name |
- all_shlibs= |
- printf "EXEC := \$(OUT_DIR)/$name\n" |
- printf "openssl_all: \$(EXEC)\n" |
- printf "\$(EXEC): PRIVATE_LINKER := \$(BUILD_LINKER)\n" |
- printf "\$(EXEC): \$(BUILD_OBJECTS)" |
- for lib in $shlibs; do |
- printf " \$(OUT_DIR)/lib${lib}.so" |
- done |
- printf "\n" |
- printf "\t@echo [$build_type] EXECUTABLE $name\n" |
- printf "\t@mkdir -p \$\$(dirname \$@)\n" |
- printf "\t\$(hide) \$(PRIVATE_LINKER) -o \$@ \$^\n" |
- printf "\n" |
-} |
- |
-ALL_BUILDS= |
- |
-generate_openssl_build () { |
- local build_type=$1 |
- local out="$OUT_DIR/$build_type" |
- ALL_BUILDS="$ALL_BUILDS $build_type" |
- echo "# Build type: $build_type" |
- build_shared_library crypto CRYPTO $build_type "$SRC_DIR" "$out" |
- build_shared_library ssl SSL $build_type "$SRC_DIR" "$out" |
- build_executable openssl APPS $build_type "$SRC_DIR" "$out" "crypto ssl" |
-} |
- |
-generate_makefile () { |
- echo \ |
-"# Auto-generated by $PROGDIR - do not edit |
- |
-.PHONY: openssl_all |
- |
-all: openssl_all |
- |
-# Use 'make V=1' to print build commands. |
-ifeq (1,\$(V)) |
-hide := |
-else |
-hide := @ |
-endif |
- |
-SRC_DIR=$SRC_DIR |
-OUT_DIR=$OUT_DIR |
-" |
- |
- for BUILD_TYPE in $BUILD_TYPES; do |
- generate_openssl_build gcc-$BUILD_TYPE |
- done |
- |
-# TODO(digit): Make the Clang build run. |
-# for BUILD_TYPE in $ANDROID_BUILD_TYPES; do |
-# generate_openssl_build clang-$BUILD_TYPE |
-# done |
-} |
- |
-. $SRC_DIR/openssl.config |
- |
- |
- |
-dump "Generating Makefile" |
-log "Makefile path: $MAKEFILE" |
-generate_makefile > $MAKEFILE |
- |
-dump "Building libraries with $NUM_JOBS jobs" |
-dump "For the following builds:" |
-for BUILD in $ALL_BUILDS; do |
- dump " $BUILD" |
-done |
-MAKE_FLAGS="-j$NUM_JOBS" |
-if [ "$VERBOSE" -gt 2 ]; then |
- MAKE_FLAGS="$MAKE_FLAGS V=1" |
-fi |
-run make $MAKE_FLAGS -f "$MAKEFILE" -C "$BUILD_DIR" |
-case $? in |
- 0) |
- dump "All OK, congratulations!" |
- ;; |
- *) |
- dump "Error, try doing the following to inspect the issues:" |
- dump " $PROGNAME --build-dir=/tmp/mybuild" |
- dump " make -C /tmp/mybuild V=1" |
- dump "" |
- ;; |
-esac |