| #!/bin/sh |
| # |
| # this script is used to rebuild the Android emulator from sources |
| # in the current directory. It also contains logic to speed up the |
| # rebuild if it detects that you're using the Android build system |
| # |
| # here's the list of environment variables you can define before |
| # calling this script to control it (besides options): |
| # |
| # |
| |
| # first, let's see which system we're running this on |
| cd `dirname $0` |
| |
| PROGNAME=`basename $0` |
| PROGDIR=`dirname $0` |
| |
| ## Logging support |
| ## |
| VERBOSE=yes |
| VERBOSE2=no |
| |
| panic () { |
| echo "ERROR: $@" |
| exit 1 |
| } |
| |
| log () { |
| if [ "$VERBOSE" = "yes" ] ; then |
| echo "$1" |
| fi |
| } |
| |
| log2 () { |
| if [ "$VERBOSE2" = "yes" ] ; then |
| echo "$1" |
| fi |
| } |
| |
| ## Normalize OS and CPU |
| ## |
| |
| BUILD_ARCH=$(uname -m) |
| case "$BUILD_ARCH" in |
| i?86) BUILD_ARCH=x86 |
| ;; |
| x86_64|amd64) BUILD_ARCH=x86_64 |
| ;; |
| *) panic "$BUILD_ARCH builds are not supported!" |
| ;; |
| esac |
| |
| log2 "BUILD_ARCH=$BUILD_ARCH" |
| |
| # at this point, the supported values for CPU are: |
| # x86 |
| # x86_64 |
| # |
| # other values may be possible but haven't been tested |
| # |
| |
| BUILD_EXEEXT= |
| BUILD_OS=`uname -s` |
| case "$BUILD_OS" in |
| Darwin) BUILD_OS=darwin;; |
| Linux) BUILD_OS=linux;; |
| FreeBSD) BUILD_OS=freebsd;; |
| CYGWIN*|*_NT-*) |
| panic "Please build Windows binaries on Linux with --mingw option." |
| ;; |
| *) panic "Unknown build OS: $BUILD_OS";; |
| esac |
| |
| BUILD_TAG=$BUILD_OS-$BUILD_ARCH |
| |
| log2 "BUILD_TAG=$BUILD_TAG" |
| log2 "BUILD_EXEEXT=$BUILD_EXEEXT" |
| |
| HOST_OS=$BUILD_OS |
| HOST_ARCH=$BUILD_ARCH |
| HOST_TAG=$HOST_OS-$HOST_ARCH |
| |
| #### Toolchain support |
| #### |
| |
| WINDRES= |
| |
| # Various probes are going to need to run a small C program |
| TMPC=/tmp/android-$$-test.c |
| TMPO=/tmp/android-$$-test.o |
| TMPE=/tmp/android-$$-test$BUILD_EXEEXT |
| TMPL=/tmp/android-$$-test.log |
| |
| # cleanup temporary files |
| clean_temp () { |
| rm -f $TMPC $TMPO $TMPL $TMPLE |
| } |
| |
| # cleanup temp files then exit with an error |
| clean_exit () { |
| clean_temp |
| exit 1 |
| } |
| |
| # this function will setup the compiler and linker and check that they work as advertized |
| setup_toolchain () { |
| if [ -z "$CC" ] ; then |
| CC=gcc |
| fi |
| |
| # check that we can compile a trivial C program with this compiler |
| cat > $TMPC <<EOF |
| int main(void) {} |
| EOF |
| compile |
| if [ $? != 0 ] ; then |
| echo "your C compiler doesn't seem to work: $CC" |
| cat $TMPL |
| clean_exit |
| fi |
| log "CC : compiler check ok ($CC)" |
| CC_VER=`$CC --version` |
| log "CC_VER : $CC_VER" |
| |
| # check that we can link the trivial program into an executable |
| if [ -z "$LD" ] ; then |
| LD=$CC |
| fi |
| link |
| if [ $? != 0 ] ; then |
| echo "your linker doesn't seem to work:" |
| cat $TMPL |
| clean_exit |
| fi |
| log "LD : linker check ok ($LD)" |
| |
| if [ -z "$AR" ]; then |
| AR=ar |
| fi |
| log "AR : archiver ($AR)" |
| clean_temp |
| } |
| |
| # try to compile the current source file in $TMPC into an object |
| # stores the error log into $TMPL |
| # |
| compile () { |
| log2 "Object : $CC -o $TMPO -c $CFLAGS $TMPC" |
| $CC -o $TMPO -c $CFLAGS $TMPC 2> $TMPL |
| } |
| |
| # try to link the recently built file into an executable. error log in $TMPL |
| # |
| link() { |
| log2 "Link : $LD -o $TMPE $TMPO $LDFLAGS" |
| $LD -o $TMPE $TMPO $LDFLAGS 2> $TMPL |
| } |
| |
| ## Feature test support |
| ## |
| |
| # check that a given C header file exists on the host system |
| # $1: variable name which will be set to "yes" or "no" depending on result |
| # $2: header name |
| # |
| # you can define EXTRA_CFLAGS for extra C compiler flags |
| # for convenience, this variable will be unset by the function. |
| # |
| feature_check_header () { |
| local result_ch OLD_CFLAGS |
| log2 "HeaderCheck: $2" |
| echo "#include $2" > $TMPC |
| cat >> $TMPC <<EOF |
| int main(void) { return 0; } |
| EOF |
| OLD_CFLAGS=$CFLAGS |
| CFLAGS="$CFLAGS $EXTRA_CFLAGS" |
| compile |
| if [ $? != 0 ]; then |
| result_ch=no |
| else |
| result_ch=yes |
| fi |
| log "HeaderCheck: $2 [$result_ch]" |
| EXTRA_CFLAGS= |
| CFLAGS=$OLD_CFLAGS |
| eval $1=$result_ch |
| clean_temp |
| } |
| |
| # Find pattern $1 in string $2 |
| # This is to be used in if statements as in: |
| # |
| # if pattern_match <pattern> <string>; then |
| # ... |
| # fi |
| # |
| pattern_match () { |
| echo "$2" | grep -q -E -e "$1" |
| } |
| |
| # Find if a given shell program is available. |
| # We need to take care of the fact that the 'which <foo>' command |
| # may return either an empty string (Linux) or something like |
| # "no <foo> in ..." (Darwin). Also, we need to redirect stderr |
| # to /dev/null for Cygwin |
| # |
| # $1: variable name |
| # $2: program name |
| # |
| # Result: set $1 to the full path of the corresponding command |
| # or to the empty/undefined string if not available |
| # |
| find_program () { |
| local PROG |
| PROG=`which $2 2>/dev/null || true` |
| if [ -n "$PROG" ] ; then |
| if pattern_match '^no ' "$PROG"; then |
| PROG= |
| fi |
| fi |
| eval $1="$PROG" |
| } |
| |
| # Default value of --ui option. |
| UI_DEFAULT=qt |
| |
| # Default value of --gles option. |
| GLES_DEFAULT=dgl |
| |
| # Parse options |
| OPTION_QEMU2_SRCDIR= |
| OPTION_DEBUG=no |
| OPTION_SANITIZER=no |
| OPTION_EMUGL_PRINTOUT=no |
| OPTION_IGNORE_AUDIO=no |
| OPTION_AOSP_PREBUILTS_DIR= |
| OPTION_OUT_DIR= |
| OPTION_HELP=no |
| OPTION_STRIP=yes |
| OPTION_CRASHUPLOAD= |
| OPTION_MINGW=no |
| OPTION_GLES= |
| OPTION_SDK_REV= |
| OPTION_SYMBOLS=no |
| OPTION_BENCHMARKS=no |
| ANDROID_SDK_TOOLS_REVISION= |
| ANDROID_SDK_TOOLS_BUILD_NUMBER= |
| |
| GLES_SUPPORT=no |
| |
| PCBIOS_PROBE=yes |
| |
| HOST_CC=${CC:-gcc} |
| OPTION_CC= |
| |
| HOST_CXX=${CXX:-g++} |
| OPTION_CXX= |
| |
| AOSP_PREBUILTS_DIR=$(dirname "$0")/../../prebuilts |
| if [ -d "$AOSP_PREBUILTS_DIR" ]; then |
| AOSP_PREBUILTS_DIR=$(cd "$AOSP_PREBUILTS_DIR" && pwd -P 2>/dev/null) |
| else |
| AOSP_PREBUILTS_DIR= |
| fi |
| |
| for opt do |
| optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'` |
| case "$opt" in |
| --help|-h|-\?) OPTION_HELP=yes |
| ;; |
| --verbose) |
| if [ "$VERBOSE" = "yes" ] ; then |
| VERBOSE2=yes |
| else |
| VERBOSE=yes |
| fi |
| ;; |
| --verbosity=*) |
| if [ "$optarg" -gt 1 ]; then |
| VERBOSE=yes |
| if [ "$optarg" -gt 2 ]; then |
| VERBOSE2=yes |
| fi |
| fi |
| ;; |
| |
| --debug) OPTION_DEBUG=yes; OPTION_STRIP=no |
| ;; |
| --mingw) OPTION_MINGW=yes |
| ;; |
| --sanitizer=*) OPTION_SANITIZER=$optarg |
| ;; |
| --emugl-printout) OPTION_EMUGL_PRINTOUT=yes |
| ;; |
| --cc=*) OPTION_CC="$optarg" |
| ;; |
| --cxx=*) OPTION_CXX="$optarg" |
| ;; |
| --strip) OPTION_STRIP=yes |
| ;; |
| --no-strip) OPTION_STRIP=no |
| ;; |
| --crash-staging) OPTION_CRASHUPLOAD=staging |
| ;; |
| --crash-prod) OPTION_CRASHUPLOAD=prod |
| ;; |
| --out-dir=*) OPTION_OUT_DIR=$optarg |
| ;; |
| --aosp-prebuilts-dir=*) OPTION_AOSP_PREBUILTS_DIR=$optarg |
| ;; |
| --qemu2-src-dir=*) OPTION_QEMU2_SRCDIR=$optarg |
| ;; |
| --no-pcbios) PCBIOS_PROBE=no |
| ;; |
| --no-tests) |
| # Ignore this option, only used by android-rebuild.sh |
| ;; |
| --symbols) OPTION_SYMBOLS=yes |
| ;; |
| --no-symbols) OPTION_SYMBOLS=no |
| ;; |
| --gles=dgl) OPTION_GLES=dgl |
| ;; |
| --gles=angle) OPTION_GLES=angle |
| ;; |
| --gles=*) echo "Unknown --gles value, try one of: dgl angle" |
| ;; |
| --sdk-revision=*) ANDROID_SDK_TOOLS_REVISION=$optarg |
| ;; |
| --sdk-build-number=*) ANDROID_SDK_TOOLS_BUILD_NUMBER=$optarg |
| ;; |
| --benchmarks) OPTION_BENCHMARKS=yes |
| ;; |
| *) |
| echo "unknown option '$opt', use --help" |
| exit 1 |
| esac |
| done |
| |
| # Print the help message |
| # |
| if [ "$OPTION_HELP" = "yes" ] ; then |
| cat << EOF |
| |
| Usage: rebuild.sh [options] |
| Options: [defaults in brackets after descriptions] |
| EOF |
| echo "Standard options:" |
| echo " --help Print this message" |
| echo " --cc=PATH Specify C compiler [$HOST_CC]" |
| echo " --cxx=PATH Specify C++ compiler [$HOST_CXX]" |
| echo " --no-strip Do not strip emulator executables." |
| echo " --strip Strip emulator executables (default)." |
| echo " --symbols Generating Breakpad symbol files." |
| echo " --no-symbols Do not generate Breakpad symbol files (default)." |
| echo " --crash-[staging,prod] Send crashes to specific server (no crash reporting by default)." |
| echo " --gles=dgl Build the OpenGLES to Desktop OpenGL Translator (default)" |
| echo " --gles=angle Build the OpenGLES to ANGLE wrapper" |
| echo " --aosp-prebuilts-dir=<path> Use specific prebuilt toolchain root directory [$AOSP_PREBUILTS_DIR]" |
| echo " --out-dir=<path> Use specific output directory [objs/]" |
| echo " --mingw Build Windows executable on Linux" |
| echo " --verbose Verbose configuration" |
| echo " --debug Build debug version of the emulator" |
| echo " --sanitizer=[...] Build with LLVM sanitizer (sanitizer=[address, thread])" |
| echo " --no-pcbios Disable copying of PC Bios files" |
| echo " --no-tests Don't run unit test suite" |
| echo " --benchmarks Build benchmark programs." |
| echo "" |
| exit 1 |
| fi |
| |
| if [ "$OPTION_AOSP_PREBUILTS_DIR" ]; then |
| if [ ! -d "$OPTION_AOSP_PREBUILTS_DIR"/gcc -a \ |
| ! -d "$OPTION_AOSP_PREBUILTS_DIR"/clang ]; then |
| echo "ERROR: Prebuilts directory does not exist: $OPTION_AOSP_PREBUILTS_DIR/gcc" |
| exit 1 |
| fi |
| AOSP_PREBUILTS_DIR=$OPTION_AOSP_PREBUILTS_DIR |
| fi |
| |
| if [ -z "$OPTION_GLES" ]; then |
| OPTION_GLES=$GLES_DEFAULT |
| log "Auto-config: --gles=$OPTION_GLES" |
| fi |
| |
| if [ "$OPTION_OUT_DIR" ]; then |
| OUT_DIR="$OPTION_OUT_DIR" |
| mkdir -p "$OUT_DIR" || panic "Could not create output directory: $OUT_DIR" |
| else |
| OUT_DIR=objs |
| log "Auto-config: --out-dir=objs" |
| fi |
| |
| CCACHE= |
| if [ "$USE_CCACHE" != 0 ]; then |
| CCACHE=$(which ccache 2>/dev/null || true) |
| fi |
| |
| if [ -n "$CCACHE" -a -f "$CCACHE" ]; then |
| if [ "$HOST_OS" = "darwin" -a "$OPTION_DEBUG" = "yes" ]; then |
| # http://llvm.org/bugs/show_bug.cgi?id=20297 |
| # ccache works for mingw/gdb, therefore probably works for gcc/gdb |
| log "Prebuilt : CCACHE disabled for OSX debug builds" |
| CCACHE= |
| else |
| log "Prebuilt : CCACHE=$CCACHE" |
| fi |
| else |
| log "Prebuilt : CCACHE can't be found" |
| CCACHE= |
| fi |
| |
| # Use gen-android-sdk-toolchain.sh to generate a toolchain that will |
| # build binaries compatible with the SDK deployement systems. |
| GEN_SDK=$PROGDIR/android/scripts/gen-android-sdk-toolchain.sh |
| GEN_SDK_FLAGS=--cxx11 |
| if [ "$CCACHE" ]; then |
| GEN_SDK_FLAGS="$GEN_SDK_FLAGS --ccache=$CCACHE" |
| else |
| GEN_SDK_FLAGS="$GEN_SDK_FLAGS --no-ccache" |
| fi |
| SDK_TOOLCHAIN_DIR=$OUT_DIR/build/toolchain |
| GEN_SDK_FLAGS="$GEN_SDK_FLAGS --aosp-dir=$AOSP_PREBUILTS_DIR/.." |
| "$GEN_SDK" $GEN_SDK_FLAGS "$SDK_TOOLCHAIN_DIR" || panic "Cannot generate SDK toolchain!" |
| BINPREFIX=$("$GEN_SDK" $GEN_SDK_FLAGS --print=binprefix "$SDK_TOOLCHAIN_DIR") |
| CC="$SDK_TOOLCHAIN_DIR/${BINPREFIX}gcc" |
| CXX="$SDK_TOOLCHAIN_DIR/${BINPREFIX}g++" |
| AR="$SDK_TOOLCHAIN_DIR/${BINPREFIX}ar" |
| LD=$CC |
| OBJCOPY="$SDK_TOOLCHAIN_DIR/${BINPREFIX}objcopy" |
| TOOLCHAIN_SYSROOT="$("${GEN_SDK}" $GEN_SDK_FLAGS --print=sysroot "${SDK_TOOLCHAIN_DIR}")" |
| |
| if [ -n "$OPTION_CC" ]; then |
| echo "Using specified C compiler: $OPTION_CC" |
| CC="$OPTION_CC" |
| fi |
| |
| if [ -n "$OPTION_CXX" ]; then |
| echo "Using specified C++ compiler: $OPTION_CXX" |
| CC="$OPTION_CXX" |
| fi |
| |
| setup_toolchain |
| |
| BUILD_AR=$AR |
| BUILD_CC=$CC |
| BUILD_CXX=$CXX |
| BUILD_LD=$LD |
| BUILD_OBJCOPY=$OBJCOPY |
| BUILD_CFLAGS=$CFLAGS |
| BUILD_CXXFLAGS=$CXXFLAGS |
| BUILD_LDFLAGS=$LDFLAGS |
| |
| # Teach make to build static executables where this makes sense. Darwin doesn't |
| # have a sane way of linking statically against system libraries at all. |
| if [ "$HOST_OS" = "darwin" ]; then |
| BUILD_STATIC_FLAGS= |
| else |
| BUILD_STATIC_FLAGS="-static" |
| fi |
| |
| if [ "$OPTION_MINGW" = "yes" ] ; then |
| # Are we on Linux ? |
| log "Mingw : Checking for Linux host" |
| if [ "$HOST_OS" != "linux" ] ; then |
| echo "Sorry, but mingw compilation is only supported on Linux !" |
| exit 1 |
| fi |
| GEN_SDK_FLAGS="$GEN_SDK_FLAGS --host=windows-x86_64" |
| "$GEN_SDK" $GEN_SDK_FLAGS "$SDK_TOOLCHAIN_DIR" || panic "Cannot generate SDK toolchain!" |
| BINPREFIX=$("$GEN_SDK" $GEN_SDK_FLAGS --print=binprefix "$SDK_TOOLCHAIN_DIR") |
| CC="$SDK_TOOLCHAIN_DIR/${BINPREFIX}gcc" |
| CXX="$SDK_TOOLCHAIN_DIR/${BINPREFIX}g++" |
| LD=$CC |
| WINDRES=$SDK_TOOLCHAIN_DIR/${BINPREFIX}windres |
| AR="$SDK_TOOLCHAIN_DIR/${BINPREFIX}ar" |
| OBJCOPY="$SDK_TOOLCHAIN_DIR/${BINPREFIX}objcopy" |
| HOST_OS=windows |
| HOST_TAG=$HOST_OS-$HOST_ARCH |
| fi |
| |
| # Try to find the GLES emulation headers and libraries automatically |
| GLES_DIR=distrib/android-emugl |
| if [ ! -d "$GLES_DIR" ]; then |
| panic "GLES : Could not find GPU emulation sources!: $GLES_DIR" |
| else |
| echo "GLES : Found GPU emulation sources: $GLES_DIR" |
| fi |
| |
| if [ "$PCBIOS_PROBE" = "yes" ]; then |
| PCBIOS_DIR=$AOSP_PREBUILTS_DIR/qemu-kernel/x86/pc-bios |
| if [ ! -d "$PCBIOS_DIR" ]; then |
| log2 "PC Bios : Probing $PCBIOS_DIR (missing)" |
| PCBIOS_DIR=../pc-bios |
| fi |
| log2 "PC Bios : Probing $PCBIOS_DIR" |
| if [ ! -d "$PCBIOS_DIR" ]; then |
| log "PC Bios : Could not find prebuilts directory." |
| else |
| mkdir -p $OUT_DIR/lib/pc-bios || panic "Could not create dir $OUT_DIR/lib/pc-bios" |
| for BIOS_FILE in bios.bin vgabios-cirrus.bin bios-256k.bin efi-virtio.rom kvmvapic.bin linuxboot.bin; do |
| log "PC Bios : Copying $BIOS_FILE" |
| cp -f $PCBIOS_DIR/$BIOS_FILE $OUT_DIR/lib/pc-bios/$BIOS_FILE || |
| panic "Missing BIOS file: $PCBIOS_DIR/$BIOS_FILE" |
| done |
| # The following BIOS files are only required by QEMU 2.7.0, move them to the non-optional |
| # list above once the big rebasing has been completed. |
| for BIOS_FILE in linuxboot_dma.bin; do |
| if [ ! -f "$PCBIOS_DIR/$BIOS_FILE" ]; then |
| log "PC Bios : Skipping optional missing $BIOS_FILE" |
| continue |
| fi |
| log "PC Bios : Copying $BIOS_FILE" |
| cp -f $PCBIOS_DIR/$BIOS_FILE $OUT_DIR/lib/pc-bios/$BIOS_FILE || |
| panic "Could not copy BIOS file: $PCBIOS_DIR/$BIOS_FILE" |
| done |
| fi |
| fi |
| |
| setup_toolchain |
| |
| ### |
| ### Audio subsystems probes |
| ### |
| PROBE_COREAUDIO=no |
| PROBE_ALSA=no |
| PROBE_OSS=no |
| PROBE_ESD=no |
| PROBE_PULSEAUDIO=no |
| PROBE_WINAUDIO=no |
| |
| case "$HOST_OS" in |
| darwin) PROBE_COREAUDIO=yes; |
| ;; |
| linux) PROBE_ALSA=yes; PROBE_OSS=yes; PROBE_ESD=yes; PROBE_PULSEAUDIO=yes; |
| ;; |
| freebsd) PROBE_OSS=yes; |
| ;; |
| windows) PROBE_WINAUDIO=yes |
| ;; |
| esac |
| |
| probe_prebuilts_dir () { |
| local PREBUILTS_DIR |
| PREBUILTS_DIR=$AOSP_PREBUILTS_DIR/android-emulator-build/$3 |
| if [ ! -d "$PREBUILTS_DIR" ]; then |
| panic "Missing prebuilts directory: $PREBUILTS_DIR" |
| fi |
| log "$1 prebuilts dir: $PREBUILTS_DIR" |
| eval $2=\$PREBUILTS_DIR |
| } |
| |
| ### |
| ### Zlib probe |
| ### |
| probe_prebuilts_dir "Zlib" ZLIB_PREBUILTS_DIR qemu-android-deps |
| |
| ### |
| ### Libpng probe |
| ### |
| probe_prebuilts_dir "Libpng" LIBPNG_PREBUILTS_DIR qemu-android-deps |
| |
| ### |
| ### Libxml2 probe |
| ### |
| probe_prebuilts_dir "Libxml2" LIBXML2_PREBUILTS_DIR common/libxml2 |
| |
| ### |
| ### Libcurl probe |
| ### |
| probe_prebuilts_dir "LibCURL" LIBCURL_PREBUILTS_DIR curl |
| |
| ### |
| ### LibANGLEtranslation probe |
| ### |
| probe_prebuilts_dir "LibANGLEtranslation" ANGLE_TRANSLATION_PREBUILTS_DIR common/ANGLE |
| |
| ### |
| ### Protobuf library probe |
| ### |
| probe_prebuilts_dir "Protobuf" PROTOBUF_PREBUILTS_DIR protobuf |
| |
| CACERTS_FILE="$PROGDIR/android/data/ca-bundle.pem" |
| if [ ! -f "$CACERTS_FILE" ]; then |
| panic "Missing cacerts file: $CACERTS_FILE" |
| fi |
| mkdir -p $OUT_DIR/lib |
| cp -f "$CACERTS_FILE" "$OUT_DIR/lib/" |
| |
| ADVANCED_FEATURE_FILE="$PROGDIR/android/data/advancedFeatures.ini" |
| if [ ! -f "$ADVANCED_FEATURE_FILE" ]; then |
| panic "Missing advanced feature file: $ADVANCED_FEATURE_FILE" |
| fi |
| mkdir -p $OUT_DIR/lib |
| cp -f "$ADVANCED_FEATURE_FILE" "$OUT_DIR/lib/" |
| |
| ### |
| ### Breakpad probe |
| ### |
| probe_prebuilts_dir "Breakpad" BREAKPAD_PREBUILTS_DIR common/breakpad |
| if [ "$OPTION_MINGW" = "yes" ] ; then |
| DUMPSYMS=$BREAKPAD_PREBUILTS_DIR/$BUILD_TAG/bin/dump_syms_dwarf |
| else |
| ##Mac and Linux builds |
| DUMPSYMS=$BREAKPAD_PREBUILTS_DIR/$BUILD_TAG/bin/dump_syms |
| fi |
| |
| ### |
| ### Qt probe |
| ### |
| probe_prebuilts_dir "Qt" QT_PREBUILTS_DIR qt |
| |
| ### |
| ### e2fsprogs probe |
| ### |
| probe_prebuilts_dir "e2fsprogs" E2FSPROGS_PREBUILTS_DIR common/e2fsprogs |
| |
| # create the objs directory that is going to contain all generated files |
| # including the configuration ones |
| # |
| mkdir -p $OUT_DIR |
| |
| ### |
| ### Compiler probe |
| ### |
| |
| #### |
| #### Host system probe |
| #### |
| |
| # because the previous version could be read-only |
| clean_temp |
| |
| # check whether we have <byteswap.h> |
| # |
| feature_check_header HAVE_BYTESWAP_H "<byteswap.h>" |
| feature_check_header HAVE_MACHINE_BSWAP_H "<machine/bswap.h>" |
| feature_check_header HAVE_FNMATCH_H "<fnmatch.h>" |
| |
| # check for Mingw version. |
| if [ "$HOST_OS" = "windows" ]; then |
| log "Mingw : Probing for GCC version." |
| GCC_VERSION=$($CC -v 2>&1 | awk '$1 == "gcc" && $2 == "version" { print $3; }') |
| GCC_MAJOR=$(echo "$GCC_VERSION" | cut -f1 -d.) |
| GCC_MINOR=$(echo "$GCC_VERSION" | cut -f2 -d.) |
| log "Mingw : Found GCC version $GCC_MAJOR.$GCC_MINOR [$GCC_VERSION]" |
| MINGW_GCC_VERSION=$(( $GCC_MAJOR * 100 + $GCC_MINOR )) |
| fi |
| # Build the config.make file |
| # |
| |
| PREBUILT_PATH_PAIRS= |
| PREBUILT_SYMPATH_PAIRS= |
| |
| # Copy a single file |
| # $1: Source file path. |
| # $2: Destination file path (not a directory!) |
| copy_file () { |
| local SRC_FILE="$1" |
| local DST_FILE="$2" |
| |
| log2 "Copying $SRC_FILE -> $DST_FILE" |
| |
| case $DST_FILE in |
| */) |
| if [ ! -d "$DST_FILE" ]; then |
| mkdir -p "${DST_FILE%%/}" || |
| panic "Cannot create destination directory: $DST_FILE" |
| fi |
| DST_FILE=${DST_FILE%%/} |
| ;; |
| *) |
| if [ -d "$DST_FILE" ]; then |
| DST_FILE=${DST_FILE}/ |
| else |
| local DST_DIR="$(dirname "$DST_FILE")" |
| if [ ! -d "$DST_DIR" ]; then |
| mkdir -p "$(dirname "$DST_FILE")" || |
| panic "Could not create destination directory: $DST_DIR" |
| fi |
| fi |
| ;; |
| esac |
| cp -a $SRC_FILE $DST_FILE || |
| panic "Could not copy $SRC_FILE into $DST_FILE !?" |
| } |
| |
| |
| # Set a prebuilt file to be copied |
| # $1: PKG root directory |
| # $2: Source file path relative to PKG SRC directory |
| # $3: Destination file path (not a directory!) relative to OUT_DIR |
| install_prebuilt_dll () { |
| local SRC_FILE="$1" |
| local DST_FILE="$2" |
| |
| if [ -L $SRC_FILE ]; then |
| PREBUILT_SYMPATH_PAIRS="$PREBUILT_SYMPATH_PAIRS $SRC_FILE:$DST_FILE" |
| else |
| PREBUILT_PATH_PAIRS="$PREBUILT_PATH_PAIRS $SRC_FILE:$DST_FILE" |
| fi |
| } |
| |
| PREBUILT_ARCHS= |
| case $HOST_OS in |
| windows) |
| PREBUILT_ARCHS="x86 x86_64" |
| ;; |
| *) |
| PREBUILT_ARCHS="x86_64" |
| ;; |
| esac |
| |
| ### |
| ### Copy ANGLE if available |
| ### |
| ANGLE_PREBUILTS_DIR=$AOSP_PREBUILTS_DIR/android-emulator-build/common/ANGLE |
| if [ -d $ANGLE_PREBUILTS_DIR ]; then |
| ANGLE_PREFIX=lib |
| ANGLE_HOST=$HOST_OS |
| case $ANGLE_HOST in |
| windows) |
| ANGLE_SUFFIX=.dll |
| ;; |
| linux) |
| ANGLE_SUFFIX=.so |
| ;; |
| *) |
| esac |
| # Windows only (for now) |
| if [ "$ANGLE_HOST" = "windows" ]; then |
| log "Copying ANGLE prebuilt libraries from $ANGLE_PREBUILTS_DIR" |
| for LIBNAME in EGL GLESv2; do # GLESv2 only for now |
| for ANGLE_ARCH in $PREBUILT_ARCHS; do |
| if [ "$ANGLE_ARCH" = "x86" ]; then |
| ANGLE_LIBDIR=lib |
| else |
| ANGLE_LIBDIR=lib64 |
| fi |
| ANGLE_LIBNAME=$ANGLE_PREFIX$LIBNAME$ANGLE_SUFFIX |
| ANGLE_SRCDIR=$ANGLE_PREBUILTS_DIR/$ANGLE_HOST-$ANGLE_ARCH |
| |
| ANGLE_DSTDIR="$OUT_DIR/$ANGLE_LIBDIR/gles_angle" |
| ANGLE_DSTLIB="$ANGLE_LIBNAME" |
| if [ -f "$ANGLE_SRCDIR/lib/$ANGLE_LIBNAME" ]; then |
| install_prebuilt_dll "$ANGLE_SRCDIR/lib/$ANGLE_LIBNAME" \ |
| "$ANGLE_DSTDIR/$ANGLE_DSTLIB" |
| fi |
| done |
| done |
| fi |
| fi |
| |
| ### |
| ### Copy Swiftshader if available |
| ### |
| SWIFTSHADER_PREBUILTS_DIR=$AOSP_PREBUILTS_DIR/android-emulator-build/common/swiftshader |
| if [ -d $SWIFTSHADER_PREBUILTS_DIR ]; then |
| log "Copying Swiftshader prebuilt libraries from $SWIFTSHADER_PREBUILTS_DIR" |
| SWIFTSHADER_PREFIX=lib |
| SWIFTSHADER_HOST=$HOST_OS |
| case $SWIFTSHADER_HOST in |
| windows) |
| SWIFTSHADER_SUFFIX=.dll |
| ;; |
| darwin) |
| SWIFTSHADER_SUFFIX=.dylib |
| ;; |
| linux) |
| SWIFTSHADER_SUFFIX=.so |
| ;; |
| *) |
| esac |
| for LIBNAME in EGL GLES_CM GLESv2; do |
| for SWIFTSHADER_ARCH in $PREBUILT_ARCHS; do |
| if [ "$SWIFTSHADER_ARCH" = "x86" ]; then |
| SWIFTSHADER_LIBDIR=lib |
| else |
| SWIFTSHADER_LIBDIR=lib64 |
| fi |
| SWIFTSHADER_LIBNAME=$SWIFTSHADER_PREFIX$LIBNAME$SWIFTSHADER_SUFFIX |
| SWIFTSHADER_SRCDIR=$SWIFTSHADER_PREBUILTS_DIR/$SWIFTSHADER_HOST-$SWIFTSHADER_ARCH |
| |
| SWIFTSHADER_DSTDIR="$OUT_DIR/$SWIFTSHADER_LIBDIR/gles_swiftshader" |
| SWIFTSHADER_DSTLIB="$SWIFTSHADER_LIBNAME" |
| if [ -f "$SWIFTSHADER_SRCDIR/lib/$SWIFTSHADER_LIBNAME" ]; then |
| install_prebuilt_dll "$SWIFTSHADER_SRCDIR/lib/$SWIFTSHADER_LIBNAME" \ |
| "$SWIFTSHADER_DSTDIR/$SWIFTSHADER_DSTLIB" |
| fi |
| done |
| done |
| fi |
| |
| |
| ### |
| ### Copy Mesa if available |
| ### |
| MESA_PREBUILTS_DIR=$AOSP_PREBUILTS_DIR/android-emulator-build/mesa |
| if [ -d $MESA_PREBUILTS_DIR ]; then |
| log "Copying Mesa prebuilt libraries from $MESA_PREBUILTS_DIR" |
| case $HOST_OS in |
| windows) |
| MESA_LIBNAME=opengl32.dll |
| ;; |
| linux) |
| MESA_LIBNAME="libGL.so libGL.so.1" |
| ;; |
| *) |
| MESA_LIBNAME= |
| esac |
| for LIBNAME in $MESA_LIBNAME; do |
| for MESA_ARCH in $PREBUILT_ARCHS; do |
| if [ "$MESA_ARCH" = "x86" ]; then |
| MESA_LIBDIR=lib |
| else |
| MESA_LIBDIR=lib64 |
| fi |
| MESA_SRCDIR=$MESA_PREBUILTS_DIR/$HOST_OS-$MESA_ARCH |
| MESA_DSTDIR="$OUT_DIR/$MESA_LIBDIR/gles_mesa" |
| MESA_DSTLIB="$LIBNAME" |
| if [ "$LIBNAME" = "opengl32.dll" ]; then |
| MESA_DSTLIB="mesa_opengl32.dll" |
| fi |
| install_prebuilt_dll "$MESA_SRCDIR/lib/$LIBNAME" "$MESA_DSTDIR/$MESA_DSTLIB" |
| done |
| done |
| fi |
| |
| # Copy Qt shared libraries, if needed. |
| log "Copying Qt prebuilt libraries from $QT_PREBUILTS_DIR" |
| for QT_ARCH in $PREBUILT_ARCHS; do |
| QT_SRCDIR=$QT_PREBUILTS_DIR/$HOST_OS-$QT_ARCH |
| case $QT_ARCH in |
| x86) QT_DSTDIR=$OUT_DIR/lib/qt;; |
| x86_64) QT_DSTDIR=$OUT_DIR/lib64/qt;; |
| *) panic "Invalid Qt host architecture: $QT_ARCH";; |
| esac |
| mkdir -p "$QT_DSTDIR" || panic "Could not create Qt library sub-directory!" |
| if [ ! -d "$QT_SRCDIR" ]; then |
| continue |
| fi |
| case $HOST_OS in |
| windows) QT_DLL_FILTER="*.dll";; |
| darwin) QT_DLL_FILTER="*.dylib";; |
| *) QT_DLL_FILTER="*.so*";; |
| esac |
| QT_LIBS=$(cd "$QT_SRCDIR" && find . -name "$QT_DLL_FILTER" -not -path "*.dSYM/*" 2>/dev/null) |
| if [ -z "$QT_LIBS" ]; then |
| panic "Cannot find Qt prebuilt libraries!?" |
| fi |
| for QT_LIB in $QT_LIBS; do |
| QT_LIB=${QT_LIB#./} |
| QT_DST_LIB=$QT_LIB |
| if [ "$HOST_OS" = "windows" ]; then |
| # NOTE: On Windows, the prebuilt libraries are placed under |
| # $PREBUILTS/qt/bin, not $PREBUILTS/qt/lib, ensure that they |
| # are always copied to $OUT_DIR/lib[64]/qt/lib/. |
| QT_DST_LIB=$(printf %s "$QT_DST_LIB" | sed -e 's|^bin/|lib/|g') |
| fi |
| install_prebuilt_dll "$QT_SRCDIR/$QT_LIB" "$QT_DSTDIR/$QT_DST_LIB" |
| done |
| done |
| |
| # Copy e2fsprogs binaries. |
| log "Copying e2fsprogs binaries." |
| for E2FS_ARCH in $PREBUILT_ARCHS; do |
| # NOTE: in windows only 32-bit binaries are available, so we'll copy the |
| # 32-bit executables to the bin64/ directory to cover all our bases |
| case $HOST_OS in |
| windows) E2FS_SRCDIR=$E2FSPROGS_PREBUILTS_DIR/$HOST_OS-x86;; |
| *) E2FS_SRCDIR=$E2FSPROGS_PREBUILTS_DIR/$HOST_OS-$E2FS_ARCH;; |
| esac |
| |
| if [ ! -d "$E2FS_SRCDIR" ]; then |
| continue |
| fi |
| |
| case $E2FS_ARCH in |
| x86) E2FS_DSTDIR=$OUT_DIR/bin;; |
| x86_64) E2FS_DSTDIR=$OUT_DIR/bin64;; |
| *) panic "Invalid e2fsprogs host architecture: $E2FS_ARCH" |
| esac |
| copy_file "$E2FS_SRCDIR/sbin/*" "$E2FS_DSTDIR/" |
| done |
| |
| # Copy the requested library from the toolchain sysroot. |
| # This function |
| # - resolves symlinks to find the actual library |
| # - copies the actual library with the resolved name. |
| # - copies all the symlinks found in $SRCDIR to that library as well. |
| # This way, linking against generic/specific version works on systems that |
| # do/don't understand symlinks. |
| # $1: Destination directory. |
| # $2: Source directory. |
| # $3: Name of the library (without the .so suffix). |
| copy_toolchain_lib () { |
| local DESTDIR SRCDIR NAME |
| local FROM REALNAME |
| local SYMLINK SYMNAME |
| DESTDIR="$1" |
| SRCDIR="$2" |
| NAME="$3.so" |
| |
| mkdir -p "${DESTDIR}" || panic "Failed to created ${DESTDIR}" |
| |
| FROM="$(readlink -qnm "${SRCDIR}/${NAME}")" || |
| panic "Coulnd't resolve ${SRCDIR}/${NAME}" |
| REALNAME="$(basename "${FROM}")" |
| |
| cp -f "${FROM}" "${DESTDIR}/${REALNAME}" || |
| panic "Cound't copy ${FROM} --> ${DESTDIR}/${REALNAME}" |
| |
| # Now re-create all the symlinks as relative path symlinks. |
| for SYMLINK in "${SRCDIR}/${NAME}".*; do |
| if [ "${SYMLINK}" = "${FROM}" -o "$(readlink -qnm "${SYMLINK}")" != "${FROM}" ]; then |
| continue |
| fi |
| SYMNAME="$(basename "${SYMLINK}")" |
| if [ ! -e "${DESTDIR}/${SYMNAME}" -o "$(readlink -qnm "${DESTDIR}/${SYMNAME}")" != "${DESTDIR}/${REALNAME}" ]; then |
| rm -f "${DESTDIR}/${SYMNAME}" |
| ln -s "${REALNAME}" "${DESTDIR}/${SYMNAME}" || \ |
| panic "Failed to create symlink ${DESTDIR}/${SYMNAME} --> ${REALNAME}" |
| fi |
| done |
| } |
| |
| if [ -n "${TOOLCHAIN_SYSROOT}" ]; then |
| # We currently only bundle libraries for linux |
| # - mingw: Statically links all libraries (b.android.com/191369) |
| # - darwin: We use the development machine's installed SDK. No point |
| # bundling, since we don't have a uniform libraries to begin with. |
| case $HOST_OS in |
| linux*) |
| log "Copying toolchain libraries to bundle with the program" |
| for BUNDLED_LIB in libstdc++; do |
| log " Bundling ${BUNDLED_LIB}" |
| copy_toolchain_lib "${OUT_DIR}/lib/libstdc++" "${TOOLCHAIN_SYSROOT}/lib32" "${BUNDLED_LIB}" |
| copy_toolchain_lib "${OUT_DIR}/lib64/libstdc++" "${TOOLCHAIN_SYSROOT}/lib64" "${BUNDLED_LIB}" |
| done |
| ;; |
| *) log "Not copying toolchain libraries for ${HOST_OS}";; |
| esac |
| fi |
| |
| ### |
| ### Libwinpthreads-1.dll probe |
| ### |
| |
| # $1: DLL name (e.g. libwinpthread-1.dll) |
| probe_mingw_dlls () { |
| local DLLS DLL SRC_DLL DST_DLL MINGW_SYSROTO |
| MINGW_SYSROOT=$("$GEN_SDK" $GEN_SDK_FLAGS --print=sysroot unused_parameter) |
| DLLS=$(cd "$MINGW_SYSROOT" && find . -name "$1" 2>/dev/null) |
| if [ -z "$DLLS" ]; then |
| log "Mingw : No $1 available." |
| else |
| log "Mingw : Copying prebuilt $1 libraries." |
| for DLL in $DLLS; do |
| SRC_DLL=${DLL#./} # Remove initial ./ in DLL path. |
| case $SRC_DLL in |
| bin/*) |
| DST_DLL=lib64${SRC_DLL##bin} |
| ;; |
| lib32/*) |
| DST_DLL=lib${SRC_DLL##lib32} |
| ;; |
| *) |
| DST_DLL=$SRC_DLL |
| ;; |
| esac |
| log2 " $SRC_DLL -> $DST_DLL" |
| install_prebuilt_dll "$MINGW_SYSROOT"/$SRC_DLL "$OUT_DIR"/$DST_DLL |
| done |
| fi |
| } |
| |
| if [ "$OPTION_MINGW" ]; then |
| probe_mingw_dlls libwinpthread-1.dll |
| fi |
| |
| # Re-create the configuration file |
| config_mk=$OUT_DIR/build/config.make |
| config_dir=$(dirname $config_mk) |
| mkdir -p "$config_dir" 2> $TMPL |
| if [ $? != 0 ] ; then |
| echo "Can't create directory for build config file: $config_dir" |
| cat $TMPL |
| clean_exit |
| fi |
| |
| log "Generate : $config_mk" |
| |
| echo "# This file was autogenerated by $PROGNAME. Do not edit !" > $config_mk |
| echo "BUILD_TARGET_OS := $HOST_OS" >> $config_mk |
| echo "BUILD_TARGET_ARCH := $HOST_ARCH" >> $config_mk |
| echo "BUILD_TARGET_CC := $CC" >> $config_mk |
| echo "BUILD_TARGET_CXX := $CXX" >> $config_mk |
| echo "BUILD_TARGET_LD := $LD" >> $config_mk |
| echo "BUILD_TARGET_AR := $AR" >> $config_mk |
| echo "BUILD_TARGET_OBJCOPY := $OBJCOPY" >> $config_mk |
| echo "BUILD_TARGET_WINDRES := $WINDRES" >> $config_mk |
| echo "BUILD_TARGET_DUMPSYMS := $DUMPSYMS" >> $config_mk |
| echo "BUILD_OBJS_DIR := $OUT_DIR" >> $config_mk |
| |
| echo "" >> $config_mk |
| echo "BUILD_HOST_AR := $BUILD_AR" >> $config_mk |
| echo "BUILD_HOST_CC := $BUILD_CC" >> $config_mk |
| echo "BUILD_HOST_CXX := $BUILD_CXX" >> $config_mk |
| echo "BUILD_HOST_LD := $BUILD_LD" >> $config_mk |
| echo "BUILD_HOST_OBJCOPY := $BUILD_OBJCOPY" >> $config_mk |
| echo "BUILD_HOST_CFLAGS := $BUILD_CFLAGS" >> $config_mk |
| echo "BUILD_HOST_LDFLAGS := $BUILD_LDFLAGS" >> $config_mk |
| echo "BUILD_HOST_DUMPSYMS := $DUMPSYMS" >> $config_mk |
| |
| echo "CONFIG_COREAUDIO := $PROBE_COREAUDIO" >> $config_mk |
| echo "CONFIG_WINAUDIO := $PROBE_WINAUDIO" >> $config_mk |
| echo "CONFIG_ESD := $PROBE_ESD" >> $config_mk |
| echo "CONFIG_ALSA := $PROBE_ALSA" >> $config_mk |
| echo "CONFIG_OSS := $PROBE_OSS" >> $config_mk |
| echo "CONFIG_PULSEAUDIO := $PROBE_PULSEAUDIO" >> $config_mk |
| echo "QT_PREBUILTS_DIR := $QT_PREBUILTS_DIR" >> $config_mk |
| |
| if [ "$OPTION_BENCHMARKS" = "yes" ]; then |
| echo "BUILD_BENCHMARKS := true" >> $config_mk |
| fi |
| |
| if [ "$OPTION_GLES" = "angle" ] ; then |
| echo "EMULATOR_USE_ANGLE := true" >> $config_mk |
| else |
| echo "EMULATOR_USE_ANGLE := false" >> $config_mk |
| fi |
| |
| echo "ZLIB_PREBUILTS_DIR := $ZLIB_PREBUILTS_DIR" >> $config_mk |
| echo "LIBPNG_PREBUILTS_DIR := $LIBPNG_PREBUILTS_DIR" >> $config_mk |
| echo "LIBXML2_PREBUILTS_DIR := $LIBXML2_PREBUILTS_DIR" >> $config_mk |
| echo "LIBCURL_PREBUILTS_DIR := $LIBCURL_PREBUILTS_DIR" >> $config_mk |
| echo "ANGLE_TRANSLATION_PREBUILTS_DIR := $ANGLE_TRANSLATION_PREBUILTS_DIR" >> $config_mk |
| echo "BREAKPAD_PREBUILTS_DIR := $BREAKPAD_PREBUILTS_DIR" >> $config_mk |
| # libuuid is a part of e2fsprogs package |
| echo "LIBUUID_PREBUILTS_DIR := $E2FSPROGS_PREBUILTS_DIR" >> $config_mk |
| echo "PROTOBUF_PREBUILTS_DIR := $PROTOBUF_PREBUILTS_DIR" >> $config_mk |
| |
| if [ $OPTION_DEBUG = "yes" ] ; then |
| echo "BUILD_DEBUG := true" >> $config_mk |
| fi |
| if [ $OPTION_SANITIZER != "no" ] ; then |
| echo "BUILD_SANITIZER := $OPTION_SANITIZER" >> $config_mk |
| fi |
| if [ $OPTION_EMUGL_PRINTOUT = "yes" ] ; then |
| echo "BUILD_EMUGL_PRINTOUT := true" >> $config_mk |
| fi |
| if [ "$OPTION_STRIP" = "yes" ]; then |
| echo "BUILD_STRIP_BINARIES := true" >> $config_mk |
| fi |
| if [ "$OPTION_SYMBOLS" = "yes" ]; then |
| echo "BUILD_GENERATE_SYMBOLS := true" >> $config_mk |
| echo "" >> $config_mk |
| fi |
| if [ "$OPTION_CRASHUPLOAD" = "prod" ]; then |
| echo "EMULATOR_CRASHUPLOAD := PROD" >> $config_mk |
| elif [ "$OPTION_CRASHUPLOAD" = "staging" ]; then |
| echo "EMULATOR_CRASHUPLOAD := STAGING" >> $config_mk |
| else |
| echo "EMULATOR_CRASHUPLOAD := NONE" >> $config_mk |
| fi |
| |
| if [ "$ANDROID_SDK_TOOLS_REVISION" ] ; then |
| echo "ANDROID_SDK_TOOLS_REVISION := $ANDROID_SDK_TOOLS_REVISION" >> $config_mk |
| fi |
| |
| if [ "$ANDROID_SDK_TOOLS_BUILD_NUMBER" ] ; then |
| echo "ANDROID_SDK_TOOLS_BUILD_NUMBER := $ANDROID_SDK_TOOLS_BUILD_NUMBER" >> $config_mk |
| fi |
| |
| if [ "$config_mk" = "yes" ] ; then |
| echo "" >> $config_mk |
| echo "USE_MINGW := 1" >> $config_mk |
| echo "HOST_OS := windows" >> $config_mk |
| echo "HOST_MINGW_VERSION := $MINGW_GCC_VERSION" >> $config_mk |
| fi |
| |
| if [ -z "$OPTION_QEMU2_SRCDIR" ]; then |
| QEMU2_TOP_DIR=$ANDROID_EMULATOR_QEMU2_SRCDIR |
| if [ -n "$QEMU2_TOP_DIR" ]; then |
| log "QEMU2 : $QEMU2_TOP_DIR [environment]" |
| else |
| QEMU2_TOP_DIR=$PROGDIR/../qemu-android |
| log "QEMU2 : $QEMU2_TOP_DIR [auto-detect]" |
| fi |
| if [ ! -d "$QEMU2_TOP_DIR" ]; then |
| panic "Missing QEMU2 source directory: $QEMU2_TOP_DIR" |
| fi |
| QEMU2_TOP_DIR=$(cd "$QEMU2_TOP_DIR" && pwd -P) |
| else |
| QEMU2_TOP_DIR=$OPTION_QEMU2_SRCDIR |
| log "QEMU2 : $QEMU2_TOP_DIR [--qemu2-src-dir]" |
| fi |
| |
| if [ ! -d "$QEMU2_TOP_DIR"/android-qemu2-glue ]; then |
| panic "Missing directory: $QEMU2_TOP_DIR/android-qemu2-glue" |
| else |
| echo "QEMU2_TOP_DIR := $QEMU2_TOP_DIR" >> $config_mk |
| fi |
| |
| echo "PREBUILT_PATH_PAIRS := \\" >> $config_mk |
| for PREBUILT_PATH_PAIR in $PREBUILT_PATH_PAIRS; |
| do |
| echo " $PREBUILT_PATH_PAIR \\" >> $config_mk |
| done |
| echo "" >> $config_mk |
| |
| echo "PREBUILT_SYMPATH_PAIRS := \\" >> $config_mk |
| for PREBUILT_SYMPATH_PAIR in $PREBUILT_SYMPATH_PAIRS; |
| do |
| echo " $PREBUILT_SYMPATH_PAIR \\" >> $config_mk |
| done |
| echo "" >> $config_mk |
| |
| # Build the config-host.h file |
| # |
| config_h=$OUT_DIR/build/config-host.h |
| cat > $config_h <<EOF |
| /* This file was autogenerated by '$PROGNAME' */ |
| |
| #define CONFIG_QEMU_SHAREDIR "/usr/local/share/qemu" |
| |
| EOF |
| |
| if [ "$HAVE_BYTESWAP_H" = "yes" ] ; then |
| echo "#define CONFIG_BYTESWAP_H 1" >> $config_h |
| fi |
| if [ "$HAVE_MACHINE_BYTESWAP_H" = "yes" ] ; then |
| echo "#define CONFIG_MACHINE_BSWAP_H 1" >> $config_h |
| fi |
| if [ "$HAVE_FNMATCH_H" = "yes" ] ; then |
| echo "#define CONFIG_FNMATCH 1" >> $config_h |
| fi |
| echo "#define CONFIG_GDBSTUB 1" >> $config_h |
| echo "#define CONFIG_SLIRP 1" >> $config_h |
| echo "#define CONFIG_SKINS 1" >> $config_h |
| echo "#define CONFIG_TRACE 1" >> $config_h |
| echo "#define CONFIG_QT 1" >> $config_h |
| echo "#undef CONFIG_SDL" >> $config_h |
| |
| case "$HOST_OS" in |
| windows) |
| echo "#define CONFIG_WIN32 1" >> $config_h |
| ;; |
| *) |
| echo "#define CONFIG_POSIX 1" >> $config_h |
| ;; |
| esac |
| |
| case "$HOST_OS" in |
| linux) |
| echo "#define CONFIG_KVM_GS_RESTORE 1" >> $config_h |
| ;; |
| esac |
| |
| # only Linux has fdatasync() |
| case "$HOST_OS" in |
| linux) |
| echo "#define CONFIG_FDATASYNC 1" >> $config_h |
| ;; |
| esac |
| |
| case "$HOST_OS" in |
| linux|darwin) |
| echo "#define CONFIG_MADVISE 1" >> $config_h |
| ;; |
| esac |
| |
| # the -nand-limits options can only work on non-windows systems |
| if [ "$HOST_OS" != "windows" ] ; then |
| echo "#define CONFIG_NAND_LIMITS 1" >> $config_h |
| fi |
| echo "#define QEMU_VERSION \"0.10.50\"" >> $config_h |
| echo "#define QEMU_PKGVERSION \"Android\"" >> $config_h |
| BSD= |
| case "$HOST_OS" in |
| linux) CONFIG_OS=LINUX |
| ;; |
| darwin) CONFIG_OS=DARWIN |
| BSD=1 |
| ;; |
| freebsd) CONFIG_OS=FREEBSD |
| BSD=1 |
| ;; |
| windows) CONFIG_OS=WIN32 |
| ;; |
| *) CONFIG_OS=$HOST_OS |
| esac |
| |
| case $HOST_OS in |
| linux|darwin) |
| echo "#define CONFIG_IOVEC 1" >> $config_h |
| ;; |
| esac |
| |
| echo "#define CONFIG_$CONFIG_OS 1" >> $config_h |
| if [ "$BSD" ]; then |
| echo "#define CONFIG_BSD 1" >> $config_h |
| echo "#define O_LARGEFILE 0" >> $config_h |
| echo "#define MAP_ANONYMOUS MAP_ANON" >> $config_h |
| fi |
| |
| case "$HOST_OS" in |
| linux) |
| echo "#define CONFIG_SIGNALFD 1" >> $config_h |
| ;; |
| esac |
| |
| echo "#define CONFIG_ANDROID 1" >> $config_h |
| |
| log "Generate : $config_h" |
| |
| # Generate the QAPI headers and sources from qapi-schema.json |
| # Ideally, this would be done in our Makefiles, but as far as I |
| # understand, the platform build doesn't support a single tool |
| # that generates several sources files, nor the standalone one. |
| export PYTHONDONTWRITEBYTECODE=1 |
| AUTOGENERATED_DIR=$OUT_DIR/build/qemu1-qapi-auto-generated |
| mkdir -p "$AUTOGENERATED_DIR" |
| python scripts/qapi-types.py qapi.types --output-dir=$AUTOGENERATED_DIR -b < qapi-schema.json |
| python scripts/qapi-visit.py --output-dir=$AUTOGENERATED_DIR -b < qapi-schema.json |
| python scripts/qapi-commands.py --output-dir=$AUTOGENERATED_DIR -m < qapi-schema.json |
| |
| log "Generate : $AUTOGENERATED_DIR" |
| |
| if [ -z "$OPTION_PREBUILT_QEMU2" ]; then |
| QEMU2_CONFIGURE=$QEMU2_TOP_DIR/android-qemu2-glue/build/configure.sh |
| if [ -f "$QEMU2_CONFIGURE" ]; then |
| log "QEMU2 : Configuring." |
| . "$QEMU2_CONFIGURE" |
| fi |
| fi |
| |
| clean_temp |
| |
| echo "Ready to go. Type 'make' to build emulator" |