scripts/rebuild.sh: Improve script. This improves the rebuild script with --help and other options to better control the build process. This removes hard-coded paths, i.e. the script must now be called with two arguments as in: scripts/rebuild.sh <qemu-android-dir> <aosp-dir> See --help for details.
diff --git a/scripts/rebuild.sh b/scripts/rebuild.sh index 1dc42e4..39e7a8c 100755 --- a/scripts/rebuild.sh +++ b/scripts/rebuild.sh
@@ -3,12 +3,95 @@ . $(dirname "$0")/common.shi shell_import build-defaults.shi +OPT_BUILD_DIR= +OPT_HELP= +OPT_NO_CCACHE= +OPT_NUM_JOBS= + +for OPT; do + OPTARG=$(expr "x$OPT" : "x[^=]*=\(.*\)" || true) + case $OPT in + --build-dir=*) + OPT_BUILD_DIR=$OPTARG + ;; + --help|-?) + OPT_HELP=true + ;; + -j*) + OPT_NUM_JOBS=${OPT##-j} + ;; + --jobs=*) + OPT_NUM_JOBS=$OPTARG + ;; + --no-ccache) + OPT_NO_CCACHE=true + ;; + --quiet) + decrement_verbosity + ;; + --verbose) + increment_verbosity + ;; + -*) + panic "Unknown option '$OPT', see --help." + ;; + *) + PARAM_COUNT=$(( $PARAM_COUNT + 1)) + var_assign PARAM_${PARAM_COUNT} "$OPT" + ;; + esac +done + +if [ "$OPT_HELP" ]; then + cat <<EOF +Usage: $(program_name) [options] <qemu-android-dir> <aosp-dir> + +Rebuild qemu-android binaries from scratch. This requires two other +directories to be available: + + <qemu-android-dir> + Path to a checkout of the QEMU-Android sources from + https://qemu-android.googlesource.com/qemu-android + + <aosp-dir> + Path to a checkout of an AOSP workspace. This is only used to + use the prebuilts toolchains under prebuilts/gcc/ + +Valid options: + --help|-? Print this message. + --verbose Increase verbosity. + --quiet Decrease verbosity. + --build-dir=<path> Use specific build directory (default is temporary). + --no-ccache Don't try to probe and use ccache during build. + -j<count> Run <count> parallel build jobs. + --jobs=<count> Same as -j<count>. + +EOF + exit 0 +fi + +if [ "$PARAM_COUNT" != 2 ]; then + panic "This script requires two arguments, see --help for details." +fi + +QEMU_ANDROID=$PARAM_1 +if [ ! -f "$QEMU_ANDROID/include/qemu-common.h" ]; then + panic "Not a valid qemu-android source directory: $QEMU_ANDROID" +fi + +AOSP_SOURCE_DIR=$PARAM_2 +if [ ! -d "$AOSP_SOURCE_DIR"/prebuilts/gcc ]; then + panic "Not a valid AOSP checkout directory: $AOSP_SOURCE_DIR" +fi + # Do we have ccache ? -CCACHE=$(which ccache 2>/dev/null) -if [ "$CCACHE" ]; then - log "Found ccache as: $CCACHE" -else - log "Cannot find ccache in PATH." +if [ -z "$OPT_NO_CCACHE" ]; then + CCACHE=$(which ccache 2>/dev/null) + if [ "$CCACHE" ]; then + log "Found ccache as: $CCACHE" + else + log "Cannot find ccache in PATH." + fi fi ARCHIVE_DIR=$(dirname "$0")/../archive @@ -20,25 +103,36 @@ HOST_OS=linux-x86_64 -# TODO(digit): Take these from command-line parameters. -AOSP_SOURCE_DIR=/opt/digit/repo/aosp -QEMU_ANDROID=$UPSTREAM/qemu-android +if [ "$OPT_BUILD_DIR" ]; then + TEMP_DIR=$OPT_BUILD_DIR +else + TEMP_DIR=/tmp/$USER-build-qemu-ranchu-$$ + log "Auto-config: --build-dir=$TEMP_DIR" +fi +run mkdir -p "$TEMP_DIR" || +panic "Could not create build directory: $TEMP_DIR" -TEMP_DIR=/tmp/build-qemu-android-aarch64-100 -mkdir -p "$TEMP_DIR" -rm -rf "$TEMP_DIR"/* +log "Cleaning up build directory." +run rm -rf "$TEMP_DIR"/* -NUM_JOBS=$(get_build_num_cores) -log "Parallel jobs count: $NUM_JOBS" +if [ "$OPT_NUM_JOBS" ]; then + NUM_JONS=$OPT_NUM_JOBS + log "Parallel jobs count: $NUM_JOBS" +else + NUM_JOBS=$(get_build_num_cores) + log "Auto-config: --jobs=$NUM_JOBS" +fi ORIGINAL_PATH=$PATH export PKG_CONFIG=$(which pkg-config 2>/dev/null) -if [ -z "$PKG_CONFIG" ]; then - panic "You must have pkg-config installed on this system!" +if [ "$PKG_CONFIG" ]; then + log "Found pkg-config at: $PKG_CONFIG" +else + log "pkg-config is not installed on this system." fi -# Generate a small wrapper program +# Generate a small toolchain wrapper program # # $1: program name, without any prefix (e.g. gcc, g++, ar, etc..) # $2: source prefix (e.g. 'i586-mingw32msvc-') @@ -225,6 +319,32 @@ ) } +do_zlib_package () { + local ZLIB_VERSION ZLIB_PACKAGE + local LOC LDFLAGS + case $CURRENT_HOST in + *-x86) + LOC=-m32 + LDFLAGS=-m32 + ;; + *-x86_64) + LOC=-m64 + LDFLAGS=-m64 + ;; + esac + ZLIB_VERSION=$(get_source_package_version zlib) + dump "$CURRENT_TEXT Building zlib-$ZLIB_VERSION" + ZLIB_PACKAGE=$(get_source_package_name zlib) + unpack_archive "$ARCHIVE_DIR/$ZLIB_PACKAGE" "$BUILD_DIR" + ( + run cd "$BUILD_DIR/zlib-$ZLIB_VERSION" + export CROSS_PREFIX=${GNU_CONFIG_HOST}- + run ./configure --prefix=$PREFIX + run make -j$NUM_JOBS + run make install + ) +} + require_program () { local VARNAME PROGNAME CMD VARNAME=$1 @@ -304,6 +424,7 @@ run cd "$BUILD_DIR/$PKG-$PKG_VERSION" export LDFLAGS="-L$PREFIX/lib" export CPPFLAGS="-L$PREFIX/include" + export PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" run ./configure \ --prefix=$PREFIX \ --host=$GNU_CONFIG_HOST \ @@ -328,11 +449,15 @@ windows-*) do_windows_zlib_package ;; + *) + do_zlib_package + ;; esac - # Handle libpng - do_autotools_package libpng + # libffi is required by glib. + do_autotools_package libffi + # libiconv is required by gettext on windows. case $1 in windows-*) do_autotools_package libiconv \ @@ -340,18 +465,20 @@ ;; esac + # gettext is required by glib do_autotools_package gettext \ --disable-rpath \ --disable-acl \ --disable-curses \ --disable-openmp \ --disable-java \ - --disable-rpath \ + --disable-native-java \ --without-emacs \ - --disable-c++ + --disable-c++ \ + --without-libexpat-prefix \ - do_autotools_package libffi + # glib is required by pkg-config and qemu-android case $1 in windows-x86) do_windows_glib_package 32 @@ -361,16 +488,33 @@ ;; *) do_autotools_package glib \ - --disable-man \ - --disable-gtk-doc \ --disable-always-build-tests \ + --disable-debug \ + --disable-fam \ + --disable-gtk-doc \ + --disable-gtk-doc-html \ + --disable-gtk-doc-pdf \ --disable-installed-tests \ + --disable-libelf \ + --disable-man \ + --disable-selinux \ + --disable-xattr \ --enable-included-printf ;; esac + # pkg-config is required by qemu-android, and not available on + # Windows and OS X + do_autotools_package pkg-config \ + --without-pc-path \ + --disable-host-tool + + # Handle libpng + do_autotools_package libpng + do_autotools_package pixman \ - --disable-gtk + --disable-gtk \ + --disable-libpng do_autotools_package SDL \ --disable-audio \ @@ -379,18 +523,49 @@ --disable-file \ --disable-threads - export SDL_CONFIG=$PREFIX/bin/sdl-config + # The SDL build script install a buggy sdl.pc when cross-compiling for + # Windows as a static library. I.e. it lacks many of the required + # libraries, that are part of --static-libs. Patch it directly + # instead. + case $1 in + windows-*) + sed -i -e 's|^Libs: -L\${libdir} -lmingw32 -lSDLmain -lSDL -mwindows|Libs: -lmingw32 -lSDLmain -lSDL -mwindows -liconv -lm -luser32 -lgdi32 -lwinmm -ldxguid|g' $PREFIX/lib/pkgconfig/sdl.pc + ;; + esac + + SDL_CONFIG=$PREFIX/bin/sdl-config + PKG_CONFIG_LIBDIR=$PREFIX/lib/pkgconfig + + case $1 in + windows-*) + # Use the host version, or the build will freeze. + PKG_CONFIG=pkg-config + ;; + *) + PKG_CONFIG=$PREFIX/bin/pkg-config + ;; + esac + export SDL_CONFIG PKG_CONFIG PKG_CONFIG_LIBDIR dump "$CURRENT_TEXT Building qemu-android" ( run mkdir -p "$BUILD_DIR/qemu-android" run rm -rf "$BUILD_DIR"/qemu-android/* run cd "$BUILD_DIR/qemu-android" + EXTRA_LDFLAGS="-L$PREFIX/lib -static-libgcc -static-libstdc++" + case $1 in + windows-*) + ;; + *) + EXTRA_LDFLAGS="$EXTRA_LDFLAGS -ldl -lm" + ;; + esac run $QEMU_ANDROID/configure \ --cross-prefix=$CROSS_PREFIX \ --target-list=aarch64-softmmu \ --prefix=$PREFIX \ - --extra-ldflags="-L$PREFIX/lib -static-libgcc -static-libstdc++" \ + --extra-cflags="-I$PREFIX/include" \ + --extra-ldflags="$EXTRA_LDFLAGS" \ --disable-attr \ --disable-blobs \ --disable-cap-ng \