#!/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
