1 #!/bin/sh 2 # 3 # Copyright (C) 2010 The Android Open Source Project 4 # 5 # Licensed under the Apache License, Version 2.0 (the "License"); 6 # you may not use this file except in compliance with the License. 7 # You may obtain a copy of the License at 8 # 9 # http://www.apache.org/licenses/LICENSE-2.0 10 # 11 # Unless required by applicable law or agreed to in writing, software 12 # distributed under the License is distributed on an "AS IS" BASIS, 13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 # See the License for the specific language governing permissions and 15 # limitations under the License. 16 # 17 # This script is used to build an NDK release package *from* scratch !! 18 # While handy, this is *not* the best way to generate NDK release packages. 19 # See docs/DEVELOPMENT.TXT for details. 20 # 21 22 . `dirname $0`/prebuilt-common.sh 23 24 force_32bit_binaries 25 26 # The default release name (use today's date) 27 RELEASE=`date +%Y%m%d` 28 register_var_option "--release=<name>" RELEASE "Specify release name" 29 30 # The package prefix 31 PREFIX=android-ndk 32 register_var_option "--prefix=<name>" PREFIX "Specify package prefix" 33 34 # Find the location of the platforms root directory 35 DEVELOPMENT_ROOT=`dirname $ANDROID_NDK_ROOT`/development/ndk 36 register_var_option "--development=<path>" DEVELOPMENT_ROOT "Path to development/ndk directory" 37 38 # Default location for final packages 39 OUT_DIR=/tmp/ndk-$USER/release 40 register_var_option "--out-dir=<path>" OUT_DIR "Path to output directory" 41 42 # Force the build 43 FORCE=no 44 register_var_option "--force" FORCE "Force build (do not ask initial question)" 45 46 # Use --incremental to implement incremental release builds. 47 # This is only useful to debug this script or the ones it calls. 48 INCREMENTAL=no 49 register_var_option "--incremental" INCREMENTAL "Enable incremental packaging (debug only)." 50 51 DARWIN_SSH= 52 if [ "$HOST_OS" = "linux" ] ; then 53 register_var_option "--darwin-ssh=<hostname>" DARWIN_SSH "Specify Darwin hostname to ssh to for the build." 54 fi 55 56 # Determine the host platforms we can build for. 57 # This is the current host platform, and eventually windows if 58 # we are on Linux and have the mingw32 compiler installed and 59 # in our path. 60 # 61 HOST_SYSTEMS="$HOST_TAG32" 62 63 MINGW_GCC= 64 CANADIAN_DARWIN_BUILD=no 65 if [ "$HOST_TAG" == "linux-x86" ] ; then 66 find_mingw_toolchain 67 if [ -n "$MINGW_GCC" ] ; then 68 HOST_SYSTEMS="$HOST_SYSTEMS,windows" 69 fi 70 # If darwin toolchain exist, build darwin too 71 if [ -z "$DARWIN_SSH" -a -f "${DARWIN_TOOLCHAIN}-gcc" ]; then 72 HOST_SYSTEMS="$HOST_SYSTEMS,darwin-x86" 73 CANADIAN_DARWIN_BUILD=yes 74 fi 75 fi 76 if [ -n "$DARWIN_SSH" -a "$HOST_SYSTEMS" = "${HOST_SYSTEMS%darwin-x86*}" ]; then 77 HOST_SYSTEMS="$HOST_SYSTEMS,darwin-x86" 78 fi 79 80 register_var_option "--systems=<list>" HOST_SYSTEMS "List of host systems to build for" 81 82 ALSO_64_FLAG= 83 register_option "--also-64" do_ALSO_64 "Also build 64-bit host toolchain" 84 do_ALSO_64 () { ALSO_64_FLAG=--also-64; } 85 86 TOOLCHAIN_SRCDIR= 87 register_var_option "--toolchain-src-dir=<path>" TOOLCHAIN_SRCDIR "Use toolchain sources from <path>" 88 89 extract_parameters "$@" 90 91 # Check if windows is specified w/o linux-x86 92 if [ "$HOST_SYSTEMS" != "${HOST_SYSTEMS%windows*}" ] ; then 93 if [ -z "$MINGW_GCC" ]; then 94 echo "ERROR: Can't find mingw tool with --systems=windows" 95 exit 1 96 fi 97 if [ "$HOST_SYSTEMS" = "${HOST_SYSTEMS%linux-x86*}" ] ; then 98 echo "ERROR: Can't specify --systems=windows w/o also specifying linux-x86" 99 exit 1 100 fi 101 fi 102 HOST_FLAGS="--systems=$HOST_SYSTEMS $ALSO_64_FLAG" 103 if [ -z "$CANADIAN_DARWIN_BUILD" ]; then 104 # Filter out darwin-x86 in $HOST_FLAGS, because 105 # 1) On linux when cross-compiling is done via "--darwin-ssh", keeping darwin-x86 in --systems list 106 # actually disable --darwin-ssh later on. 107 # 2) On MacOSX, darwin-x86 is the default, no need to be explicit. 108 # 109 HOST_FLAGS=$(echo "$HOST_FLAGS" | sed -e 's/darwin-x86//') 110 fi 111 112 # Print a warning and ask the user if he really wants to do that ! 113 # 114 if [ "$FORCE" = "no" -a "$INCREMENTAL" = "no" ] ; then 115 echo "IMPORTANT WARNING !!" 116 echo "" 117 echo "This script is used to generate an NDK release package from scratch" 118 echo "for the following host platforms: $HOST_SYSTEMS" 119 echo "" 120 echo "This process is EXTREMELY LONG and may take SEVERAL HOURS on a dual-core" 121 echo "machine. If you plan to do that often, please read docs/DEVELOPMENT.TXT" 122 echo "that provides instructions on how to do that more easily." 123 echo "" 124 echo "Are you sure you want to do that [y/N] " 125 read YESNO 126 case "$YESNO" in 127 y|Y|yes|YES) 128 ;; 129 *) 130 echo "Aborting !" 131 exit 0 132 esac 133 fi 134 135 PROGRAM_PARAMETERS= 136 PROGRAM_DESCRIPTION=\ 137 "This script is used to generate an NDK release package from scratch. 138 139 This process is EXTREMELY LONG and consists in the following steps: 140 141 - downloading toolchain sources from the Internet 142 - patching them appropriately (if needed) 143 - rebuilding the toolchain binaries for the host system 144 - rebuilding the platforms and samples directories from ../development/ndk 145 - packaging everything into a host-specific archive 146 147 This can take several hours on a dual-core machine, even assuming a very 148 nice Internet connection and plenty of RAM and disk space. 149 150 Note that on Linux, if you have the 'mingw32' package installed, the script 151 will also automatically generate a windows release package. You can prevent 152 that by using the --platforms option. 153 154 IMPORTANT: 155 If you intend to package NDK releases often, please read the 156 file named docs/DEVELOPMENT.TXT which provides ways to do that 157 more quickly, by preparing toolchain binary tarballs that can be 158 reused for each package operation. This will save you hours of 159 your time compared to using this script! 160 " 161 162 # Create directory where everything will be performed. 163 RELEASE_DIR=$NDK_TMPDIR/release-$RELEASE 164 unset NDK_TMPDIR # prevent later script from reusing/removing it 165 if [ "$INCREMENTAL" = "no" ] ; then 166 rm -rf $RELEASE_DIR && mkdir -p $RELEASE_DIR 167 else 168 if [ ! -d "$RELEASE_DIR" ] ; then 169 echo "ERROR: Can't make incremental, missing release dir: $RELEASE_DIR" 170 exit 1 171 fi 172 fi 173 174 175 # 176 # Timestamp management 177 TIMESTAMP_DIR="$RELEASE_DIR/timestamps" 178 mkdir -p "$TIMESTAMP_DIR" 179 if [ "$INCREMENTAL" = "no" ] ; then 180 run rm -rf "$TIMESTAMP_DIR/*" 181 fi 182 183 timestamp_set () 184 { 185 touch "$TIMESTAMP_DIR/$1" 186 } 187 188 timestamp_clear () 189 { 190 rm -f "$TIMESTAMP_DIR/$1" 191 } 192 193 timestamp_check () 194 { 195 if [ -f "$TIMESTAMP_DIR/$1" ] ; then 196 return 1 197 else 198 return 0 199 fi 200 } 201 202 # Step 1, If needed, download toolchain sources into a temporary directory 203 if [ -n "$TOOLCHAIN_SRCDIR" ] ; then 204 dump "Using toolchain source directory: $TOOLCHAIN_SRCDIR" 205 timestamp_set toolchain-download-sources 206 else 207 if timestamp_check toolchain-download-sources; then 208 dump "Downloading toolchain sources..." 209 TOOLCHAIN_SRCDIR="$RELEASE_DIR/toolchain-src" 210 log "Using toolchain source directory: $TOOLCHAIN_SRCDIR" 211 run $ANDROID_NDK_ROOT/build/tools/download-toolchain-sources.sh "$TOOLCHAIN_SRCDIR" 212 if [ "$?" != 0 ] ; then 213 dump "ERROR: Could not download toolchain sources" 214 exit 1 215 fi 216 timestamp_set toolchain-download-sources 217 timestamp_clear build-prebuilts 218 timestamp_clear build-host-prebuilts 219 timestamp_clear build-darwin-prebuilts 220 timestamp_clear build-mingw-prebuilts 221 fi 222 fi 223 224 # Step 2, build the host toolchain binaries and package them 225 if timestamp_check build-prebuilts; then 226 PREBUILT_DIR="$RELEASE_DIR/prebuilt" 227 if timestamp_check build-host-prebuilts; then 228 dump "Building host toolchain binaries..." 229 run $ANDROID_NDK_ROOT/build/tools/rebuild-all-prebuilt.sh --package-dir="$PREBUILT_DIR" --build-dir="$RELEASE_DIR/build" "$TOOLCHAIN_SRCDIR" $HOST_FLAGS 230 fail_panic "Can't build $HOST_SYSTEM binaries." 231 timestamp_set build-host-prebuilts 232 fi 233 if [ -n "$DARWIN_SSH" ] ; then 234 if timestamp_check build-darwin-prebuilts; then 235 dump "Building Darwin prebuilts through ssh to $DARWIN_SSH..." 236 run $ANDROID_NDK_ROOT/build/tools/rebuild-all-prebuilt.sh --package-dir="$PREBUILT_DIR" --darwin-ssh="$DARWIN_SSH" "$TOOLCHAIN_SRCDIR" 237 fail_panic "Can't build Darwin binaries!" 238 timestamp_set build-darwin-prebuilts 239 fi 240 fi 241 timestamp_set build-prebuilts 242 timestamp_clear make-packages 243 fi 244 245 # Step 3, package a release with everything 246 if timestamp_check make-packages; then 247 dump "Generating NDK release packages" 248 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" 249 if [ $? != 0 ] ; then 250 dump "ERROR: Can't generate proper release packages." 251 exit 1 252 fi 253 timestamp_set make-packages 254 fi 255 256 dump "All clear. Good work! See $OUT_DIR" 257