Home | History | Annotate | Download | only in tools
      1 #!/bin/bash
      2 # Quick semi-auto file to build Windows SDK tools.
      3 #
      4 # Limitations and requirements:
      5 # - Expects the emulator has been built first, will pick it up from prebuilt.
      6 # - Run in Cygwin
      7 # - Expects to have one of the existing SDK (Darwin or Linux) to build the Windows one
      8 # - Needs Cygwin packages: autoconf, bison, curl, flex, gcc, g++, git,
      9 #   gnupg, make, mingw-zlib, python, zip, unzip
     10 # - Must NOT have cygwin package readline (its GPL license might taint the SDK if
     11 #   it gets compiled in)
     12 # - Does not need a Java Development Kit or any other tools outside of cygwin.
     13 # - If you think you may have Windows versions of tools (e.g. make) installed, it may
     14 #   reduce confusion levels to 'export PATH=/usr/bin'
     15 
     16 PROG_NAME="$0"
     17 SDK_ZIP="$1"; shift
     18 DIST_DIR="$1"; shift
     19 TEMP_DIR="$1"; shift
     20 [ -z "$TEMP_DIR" ] && TEMP_DIR=${TMP:-/tmp}
     21 
     22 set -e  # Fail this script as soon as a command fails -- fail early, fail fast
     23 
     24 function die() {
     25     echo "Error:" $*
     26     echo "Aborting"
     27     exit 1
     28 }
     29 
     30 function usage() {
     31     local NAME
     32     NAME=`basename ${PROG_NAME}`
     33     echo "Usage: ${NAME} linux_or_mac_sdk.zip output_dir [temp_dir]"
     34     echo "If temp_dir is not given, \$TMP is used. If that's missing, /tmp is used."
     35     status
     36     exit 2
     37 }
     38 
     39 function status() {
     40     echo "Current values:"
     41     echo "- Input  SDK: ${SDK_ZIP:-missing}"
     42     echo "- Output dir: ${DIST_DIR:-missing}"
     43     echo "- Temp   dir: ${TEMP_DIR:-missing}"
     44 }
     45 
     46 function check() {
     47     [ -f "$SDK_ZIP" ] || usage
     48     [ -d "$DIST_DIR" ] || usage
     49 
     50 
     51     # We need mgwz.dll in the SDK when compiling with Cygwin 1.5
     52     # Right now we don't support building with Cygwin 1.7 yet, as it lacks this DLL.
     53     NEED_MGWZ=1
     54     # We can skip this check for debug purposes.
     55     echo $*
     56     [[ "$1" == "-no-mgwz" ]] && NEED_MGWZ=""
     57     CYG_MGWZ_PATH=/cygdrive/c/cygwin/bin/mgwz.dll
     58     [[ -n $NEED_MGWZ && ! -f $CYG_MGWZ_PATH ]] && \
     59         die "Cygwin is missing $CYG_MGWZ_PATH. Use -no-mgwz to override."
     60 
     61 
     62     # Use the BUILD_ID as SDK_NUMBER if defined, otherwise try to get it from the
     63     # provided zip filename.
     64     if [ -f config/build_id.make ]; then
     65         BUILD_ID=`cat config/build_id.make | sed -n '/BUILD_ID=/s/^[^=]\+=\(.*\)$/\1/p'`
     66         [ -n "$BUILD_ID" ] && SDK_NUMBER="$BUILD_ID"
     67     fi
     68     if [ -z "$SDK_NUMBER" ]; then
     69         # Look for a pattern like "anything_sdknumber.extension"
     70         # The pattern is now "any-thing_sdknumber_anything-else.extension"
     71         #
     72         # The bottom line is that the SDK number is whatever is enclosed by
     73         # the LAST couple of underscores. You can have underscores *before* the
     74         # SDK number if you want, but not after, e.g these are valid:
     75         #    android_sdk_4242_platform.zip or blah_42_.zip
     76         #
     77         # Note that the root directory name in the zip must match the zip
     78         # name, too, so there's no point just changing the zip name to match
     79         # the above format.
     80         #
     81         # SDK_NUMBER will be empty if nothing matched.
     82         filename=`basename "$SDK_ZIP"`
     83         SDK_NUMBER=`echo $filename | sed -n 's/^.*_\([^_./]\+\)_[^_.]*\..*$/\1/p'`
     84     fi
     85 
     86     [ -n "$SDK_NUMBER" ] || die "Failed to extract the SDK number from $SDK_ZIP. Check its format."
     87 
     88     [ $OSTYPE == "cygwin" ] || die "This expects to run under Cygwin"
     89     [ -e `which zip` ] || die "Please install 'zip' package in Cygwin"
     90     [ -f "build/envsetup.sh" ] || die "Please run this from the 'android' directory"
     91 
     92     echo "Using SDK ${SDK_NUMBER}"
     93 }
     94 
     95 function build() {
     96 
     97     # IMPORTANT: For Cygwin to be able to build Android targets here,
     98     # you will generally need to edit build/core/main.mk and add directories
     99     # where Android.mk makefiles are to be found to the SDK_ONLY==true section.
    100 
    101     echo 
    102     echo "Building..."
    103     [ -n "$MAKE_OPT" ] && echo "Make options: $MAKE_OPT"
    104 
    105     . build/envsetup.sh
    106 
    107     # Disable parallel build: it generates "permission denied" issues when
    108     # multiple "ar.exe" are running in parallel.
    109     make \
    110         aapt adb aidl \
    111         etc1tool \
    112         prebuilt \
    113         dexdump dmtracedump \
    114         fastboot \
    115         hprof-conv \
    116         mksdcard \
    117         sdklauncher sqlite3 \
    118         zipalign \
    119         || die "Build failed"
    120 
    121     # Fix permissions. Git/cygwin may not make this +x as needed.
    122     chmod +x prebuilt/windows/sdl/bin/sdl-config
    123 
    124     # It's worth building the emulator with -j 4 so do it separately
    125     make -j 4 emulator || die "Build failed"
    126 }
    127 
    128 function package() {
    129     echo
    130     echo "Packaging..."
    131     DEST_NAME="android-sdk_${SDK_NUMBER}_windows"
    132     DEST_NAME_ZIP="${DEST_NAME}.zip"
    133 
    134     TEMP_SDK_DIR="$TEMP_DIR/$DEST_NAME"
    135 
    136     # Unzip current linux/mac SDK and rename using the windows name
    137     [ -e "$TEMP_SDK_DIR" ] && rm -rfv "$TEMP_SDK_DIR"  # cleanup dest first if exists
    138     UNZIPPED=`basename "$SDK_ZIP"`
    139     UNZIPPED="$TEMP_DIR/${UNZIPPED/.zip/}"
    140     [ -e "$UNZIPPED" ] && rm -rfv "$UNZIPPED"  # cleanup unzip dir (if exists)
    141     unzip "$SDK_ZIP" -d "$TEMP_DIR"
    142     mv -v "$UNZIPPED" "$TEMP_SDK_DIR"
    143     
    144     # Assert that the package contains only one platform
    145     PLATFORMS="$TEMP_SDK_DIR/platforms"
    146     THE_PLATFORM=`echo $PLATFORMS/*`
    147     PLATFORM_TOOLS=$THE_PLATFORM/tools
    148     echo "Platform found: " $THE_PLATFORM
    149     [[ -d "$THE_PLATFORM" ]] || die \
    150         "Error: One platform was expected in $SDK_ZIP. " \
    151         "Instead found " $THE_PLATFORM
    152     [[ -d "$PLATFORM_TOOLS" ]] || die "Missing folder $PLATFORM_TOOLS."
    153 
    154     # Package USB Driver
    155     if type package_usb_driver 2>&1 | grep -q function ; then
    156         package_usb_driver $TEMP_SDK_DIR
    157     fi
    158 
    159     # Remove obsolete stuff from tools & platform
    160     TOOLS="$TEMP_SDK_DIR/tools"
    161     LIB="$TEMP_SDK_DIR/tools/lib"
    162     rm -v "$TOOLS"/{adb,android,apkbuilder,ddms,dmtracedump,draw9patch,emulator,etc1tool}
    163     rm -v "$TOOLS"/{hierarchyviewer,hprof-conv,layoutopt,mksdcard,sqlite3,traceview,zipalign}
    164     rm -v "$LIB"/*/swt.jar
    165     rm -v "$PLATFORM_TOOLS"/{aapt,aidl,dx,dexdump}
    166 
    167     # Copy all the new stuff in tools
    168     # Note: some tools are first copied here and then moved in platforms/<name>/tools/
    169     cp -v out/host/windows-x86/bin/*.{exe,dll} "$TOOLS"/
    170     mkdir -pv "$LIB"/x86
    171     cp -v prebuilt/windows/swt/swt.jar         "$LIB"/x86/
    172     mkdir -pv "$LIB"/x86_64
    173     cp -v prebuilt/windows-x86_64/swt/swt.jar  "$LIB"/x86_64/
    174 
    175     # Copy the SDK Manager (aka sdklauncher) to the root of the SDK (it was copied in tools above)
    176     # and move it also in SDK/tools/lib (so that tools updates can update the root one too)
    177     cp "$TOOLS/sdklauncher.exe" "$TEMP_SDK_DIR/SDK Manager.exe"
    178     mv "$TOOLS/sdklauncher.exe" "$LIB/SDK Manager.exe"
    179 
    180     # If you want the emulator NOTICE in the tools dir, uncomment the following line:
    181     # cp -v external/qemu/NOTICE "$TOOLS"/emulator_NOTICE.txt
    182 
    183     # We currently need libz from MinGW for aapt
    184     [[ -n $NEED_MGWZ ]] && cp -v $CYG_MGWZ_PATH "$TOOLS"/
    185 
    186     # Update a bunch of bat files
    187     cp -v sdk/files/post_tools_install.bat                 "$LIB"/
    188     cp -v sdk/files/find_java.bat                          "$LIB"/
    189     cp -v sdk/apkbuilder/etc/apkbuilder.bat                "$TOOLS"/
    190     cp -v sdk/ddms/app/etc/ddms.bat                        "$TOOLS"/
    191     cp -v sdk/traceview/etc/traceview.bat                  "$TOOLS"/
    192     cp -v sdk/hierarchyviewer2/app/etc/hierarchyviewer.bat "$TOOLS"/
    193     cp -v sdk/layoutopt/app/etc/layoutopt.bat              "$TOOLS"/
    194     cp -v sdk/draw9patch/etc/draw9patch.bat                "$TOOLS"/
    195     cp -v sdk/sdkmanager/app/etc/android.bat               "$TOOLS"/
    196 
    197     # Put the JetCreator tools, content and docs (not available in the linux SDK)
    198     JET="$TOOLS/Jet"
    199     JETCREATOR="$JET/JetCreator"
    200     JETDEMOCONTENT="$JET/demo_content"
    201     JETLOGICTEMPLATES="$JET/logic_templates"
    202     JETDOC="$TEMP_SDK_DIR/docs/JetCreator"
    203 
    204     # need to rm these folders since a Mac SDK will have them and it might create a conflict
    205     rm -rfv "$JET"
    206     rm -rfv "$JETDOC"
    207 
    208     # now create fresh folders for JetCreator
    209     mkdir -v "$JET"
    210     mkdir -v "$JETDOC"
    211 
    212     cp -rv external/sonivox/jet_tools/JetCreator         "$JETCREATOR"/
    213     cp -rv external/sonivox/jet_tools/JetCreator_content "$JETDEMOCONTENT"/
    214     cp -rv external/sonivox/jet_tools/logic_templates    "$JETLOGICTEMPLATES"/
    215     chmod -vR u+w "$JETCREATOR"  # fixes an issue where Cygwin might copy the above as u+rx only
    216     cp -v prebuilt/windows/jetcreator/EASDLL.dll         "$JETCREATOR"/
    217     
    218     cp -v  external/sonivox/docs/JET_Authoring_Guidelines.html  "$JETDOC"/
    219     cp -rv external/sonivox/docs/JET_Authoring_Guidelines_files "$JETDOC"/
    220     cp  -v external/sonivox/docs/JET_Creator_User_Manual.html   "$JETDOC"/
    221     cp -rv external/sonivox/docs/JET_Creator_User_Manual_files  "$JETDOC"/
    222 
    223     # Copy or move platform specific tools to the default platform.
    224     cp -v dalvik/dx/etc/dx.bat "$PLATFORM_TOOLS"/
    225     mv -v "$TOOLS"/{aapt.exe,aidl.exe,dexdump.exe} "$PLATFORM_TOOLS"/
    226     # Note: mgwz.dll must be both in SDK/tools for zipalign and in SDK/platform/XYZ/tools/ for aapt
    227     [[ -n $NEED_MGWZ ]] && cp -v "$TOOLS"/mgwz.dll "$PLATFORM_TOOLS"/
    228 
    229     # Fix EOL chars to make window users happy - fix all files at the top level only
    230     # as well as all batch files including those in platforms/<name>/tools/
    231     find "$TEMP_SDK_DIR" -maxdepth 1 -type f -writable -print0 | xargs -0 unix2dos -D
    232     find "$TEMP_SDK_DIR" -maxdepth 3 -name "*.bat" -type f -writable -print0 | xargs -0 unix2dos -D
    233 
    234     # Done.. Zip it. Clean the temp folder ONLY if the zip worked (to ease debugging)
    235     pushd "$TEMP_DIR" > /dev/null
    236     [ -e "$DEST_NAME_ZIP" ] && rm -rfv "$DEST_NAME_ZIP"
    237     zip -9r "$DEST_NAME_ZIP" "$DEST_NAME" && rm -rfv "$DEST_NAME"
    238     popd > /dev/null
    239 
    240     # Now move the final zip from the temp dest to the final dist dir
    241     mv -v "$TEMP_DIR/$DEST_NAME_ZIP" "$DIST_DIR/$DEST_NAME_ZIP"
    242 
    243     # We want fastboot and adb (and its DLLs) next to the new SDK
    244     for i in fastboot.exe adb.exe AdbWinApi.dll AdbWinUsbApi.dll; do
    245         cp -vf out/host/windows-x86/bin/$i "$DIST_DIR"/$i
    246     done
    247 
    248     echo "Done"
    249     echo
    250     echo "Resulting SDK is in $DIST_DIR/$DEST_NAME_ZIP"
    251 }
    252 
    253 check $*
    254 status
    255 build
    256 package
    257 
    258 echo "Done"
    259