#!/bin/sh # # Copyright (C) 2010 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # This script is used to build an NDK release package *from* scratch !! # While handy, this is *not* the best way to generate NDK release packages. # See docs/DEVELOPMENT.TXT for details. # . `dirname $0`/prebuilt-common.sh force_32bit_binaries # The default release name (use today's date) RELEASE=`date +%Y%m%d` register_var_option "--release=<name>" RELEASE "Specify release name" # The package prefix PREFIX=android-ndk register_var_option "--prefix=<name>" PREFIX "Specify package prefix" # Find the location of the platforms root directory DEVELOPMENT_ROOT=`dirname $ANDROID_NDK_ROOT`/development/ndk register_var_option "--development=<path>" DEVELOPMENT_ROOT "Path to development/ndk directory" # Default location for final packages OUT_DIR=/tmp/ndk-$USER/release register_var_option "--out-dir=<path>" OUT_DIR "Path to output directory" # Force the build FORCE=no register_var_option "--force" FORCE "Force build (do not ask initial question)" # Use --incremental to implement incremental release builds. # This is only useful to debug this script or the ones it calls. INCREMENTAL=no register_var_option "--incremental" INCREMENTAL "Enable incremental packaging (debug only)." DARWIN_SSH= if [ "$HOST_OS" = "linux" ] ; then register_var_option "--darwin-ssh=<hostname>" DARWIN_SSH "Specify Darwin hostname to ssh to for the build." fi # Determine the host platforms we can build for. # This is the current host platform, and eventually windows if # we are on Linux and have the mingw32 compiler installed and # in our path. # HOST_SYSTEMS="$HOST_TAG32" MINGW_GCC= CANADIAN_DARWIN_BUILD=no if [ "$HOST_TAG" == "linux-x86" ] ; then find_mingw_toolchain if [ -n "$MINGW_GCC" ] ; then HOST_SYSTEMS="$HOST_SYSTEMS,windows" fi # If darwin toolchain exist, build darwin too if [ -z "$DARWIN_SSH" -a -f "${DARWIN_TOOLCHAIN}-gcc" ]; then HOST_SYSTEMS="$HOST_SYSTEMS,darwin-x86" CANADIAN_DARWIN_BUILD=yes fi fi if [ -n "$DARWIN_SSH" -a "$HOST_SYSTEMS" = "${HOST_SYSTEMS%darwin-x86*}" ]; then HOST_SYSTEMS="$HOST_SYSTEMS,darwin-x86" fi register_var_option "--systems=<list>" HOST_SYSTEMS "List of host systems to build for" ALSO_64_FLAG= register_option "--also-64" do_ALSO_64 "Also build 64-bit host toolchain" do_ALSO_64 () { ALSO_64_FLAG=--also-64; } TOOLCHAIN_SRCDIR= register_var_option "--toolchain-src-dir=<path>" TOOLCHAIN_SRCDIR "Use toolchain sources from <path>" extract_parameters "$@" # Check if windows is specified w/o linux-x86 if [ "$HOST_SYSTEMS" != "${HOST_SYSTEMS%windows*}" ] ; then if [ -z "$MINGW_GCC" ]; then echo "ERROR: Can't find mingw tool with --systems=windows" exit 1 fi if [ "$HOST_SYSTEMS" = "${HOST_SYSTEMS%linux-x86*}" ] ; then echo "ERROR: Can't specify --systems=windows w/o also specifying linux-x86" exit 1 fi fi HOST_FLAGS="--systems=$HOST_SYSTEMS $ALSO_64_FLAG" if [ -z "$CANADIAN_DARWIN_BUILD" ]; then # Filter out darwin-x86 in $HOST_FLAGS, because # 1) On linux when cross-compiling is done via "--darwin-ssh", keeping darwin-x86 in --systems list # actually disable --darwin-ssh later on. # 2) On MacOSX, darwin-x86 is the default, no need to be explicit. # HOST_FLAGS=$(echo "$HOST_FLAGS" | sed -e 's/darwin-x86//') fi # Print a warning and ask the user if he really wants to do that ! # if [ "$FORCE" = "no" -a "$INCREMENTAL" = "no" ] ; then echo "IMPORTANT WARNING !!" echo "" echo "This script is used to generate an NDK release package from scratch" echo "for the following host platforms: $HOST_SYSTEMS" echo "" echo "This process is EXTREMELY LONG and may take SEVERAL HOURS on a dual-core" echo "machine. If you plan to do that often, please read docs/DEVELOPMENT.TXT" echo "that provides instructions on how to do that more easily." echo "" echo "Are you sure you want to do that [y/N] " read YESNO case "$YESNO" in y|Y|yes|YES) ;; *) echo "Aborting !" exit 0 esac fi PROGRAM_PARAMETERS= PROGRAM_DESCRIPTION=\ "This script is used to generate an NDK release package from scratch. This process is EXTREMELY LONG and consists in the following steps: - downloading toolchain sources from the Internet - patching them appropriately (if needed) - rebuilding the toolchain binaries for the host system - rebuilding the platforms and samples directories from ../development/ndk - packaging everything into a host-specific archive This can take several hours on a dual-core machine, even assuming a very nice Internet connection and plenty of RAM and disk space. Note that on Linux, if you have the 'mingw32' package installed, the script will also automatically generate a windows release package. You can prevent that by using the --platforms option. IMPORTANT: If you intend to package NDK releases often, please read the file named docs/DEVELOPMENT.TXT which provides ways to do that more quickly, by preparing toolchain binary tarballs that can be reused for each package operation. This will save you hours of your time compared to using this script! " # Create directory where everything will be performed. RELEASE_DIR=$NDK_TMPDIR/release-$RELEASE unset NDK_TMPDIR # prevent later script from reusing/removing it if [ "$INCREMENTAL" = "no" ] ; then rm -rf $RELEASE_DIR && mkdir -p $RELEASE_DIR else if [ ! -d "$RELEASE_DIR" ] ; then echo "ERROR: Can't make incremental, missing release dir: $RELEASE_DIR" exit 1 fi fi # # Timestamp management TIMESTAMP_DIR="$RELEASE_DIR/timestamps" mkdir -p "$TIMESTAMP_DIR" if [ "$INCREMENTAL" = "no" ] ; then run rm -rf "$TIMESTAMP_DIR/*" fi timestamp_set () { touch "$TIMESTAMP_DIR/$1" } timestamp_clear () { rm -f "$TIMESTAMP_DIR/$1" } timestamp_check () { if [ -f "$TIMESTAMP_DIR/$1" ] ; then return 1 else return 0 fi } # Step 1, If needed, download toolchain sources into a temporary directory if [ -n "$TOOLCHAIN_SRCDIR" ] ; then dump "Using toolchain source directory: $TOOLCHAIN_SRCDIR" timestamp_set toolchain-download-sources else if timestamp_check toolchain-download-sources; then dump "Downloading toolchain sources..." TOOLCHAIN_SRCDIR="$RELEASE_DIR/toolchain-src" log "Using toolchain source directory: $TOOLCHAIN_SRCDIR" run $ANDROID_NDK_ROOT/build/tools/download-toolchain-sources.sh "$TOOLCHAIN_SRCDIR" if [ "$?" != 0 ] ; then dump "ERROR: Could not download toolchain sources" exit 1 fi timestamp_set toolchain-download-sources timestamp_clear build-prebuilts timestamp_clear build-host-prebuilts timestamp_clear build-darwin-prebuilts timestamp_clear build-mingw-prebuilts fi fi # Step 2, build the host toolchain binaries and package them if timestamp_check build-prebuilts; then PREBUILT_DIR="$RELEASE_DIR/prebuilt" if timestamp_check build-host-prebuilts; then dump "Building host toolchain binaries..." run $ANDROID_NDK_ROOT/build/tools/rebuild-all-prebuilt.sh --package-dir="$PREBUILT_DIR" --build-dir="$RELEASE_DIR/build" "$TOOLCHAIN_SRCDIR" $HOST_FLAGS fail_panic "Can't build $HOST_SYSTEM binaries." timestamp_set build-host-prebuilts fi if [ -n "$DARWIN_SSH" ] ; then if timestamp_check build-darwin-prebuilts; then dump "Building Darwin prebuilts through ssh to $DARWIN_SSH..." run $ANDROID_NDK_ROOT/build/tools/rebuild-all-prebuilt.sh --package-dir="$PREBUILT_DIR" --darwin-ssh="$DARWIN_SSH" "$TOOLCHAIN_SRCDIR" fail_panic "Can't build Darwin binaries!" timestamp_set build-darwin-prebuilts fi fi timestamp_set build-prebuilts timestamp_clear make-packages fi # Step 3, package a release with everything if timestamp_check make-packages; then dump "Generating NDK release packages" run $ANDROID_NDK_ROOT/build/tools/package-release.sh --release=$RELEASE --prefix=$PREFIX --out-dir="$OUT_DIR" --prebuilt-dir="$PREBUILT_DIR" --systems="$HOST_SYSTEMS" --development-root="$DEVELOPMENT_ROOT" if [ $? != 0 ] ; then dump "ERROR: Can't generate proper release packages." exit 1 fi timestamp_set make-packages fi dump "All clear. Good work! See $OUT_DIR"