Win SDK: Split the win-sdk makefile and script into 2 parts.

The main makefile+scripts to build the Windows SDK is still this
one here in development/build/tools. However it defers to a new
matching set of files in sdk/build to build and package
things that depend on the sdk.git or external/qemu.git.

This will make it easier for us to prepare SDKs based on
a tools_rN branch that isn't cut at the same time than the
platform branch.

This is a multi-part changeset. The other part is in sdk.git.

This change also definitely removes support for building
the Windows SDK under Cygwin. Only building a specific subset
of individual binaries is supported at this point.

Change-Id: I4e9a2d810cf29fae0097fbd92be0cef89c9b3505
diff --git a/build/tools/make_windows_sdk.sh b/build/tools/make_windows_sdk.sh
deleted file mode 100755
index 9a61baf..0000000
--- a/build/tools/make_windows_sdk.sh
+++ /dev/null
@@ -1,261 +0,0 @@
-#!/bin/bash
-# Quick semi-auto file to build Windows SDK tools.
-#
-# Limitations and requirements:
-# - Expects the emulator has been built first, will pick it up from prebuilt.
-# - Run in Cygwin
-# - Expects to have one of the existing SDK (Darwin or Linux) to build the Windows one
-# - Needs Cygwin packages: autoconf, bison, curl, flex, gcc, g++, git,
-#   gnupg, make, mingw-zlib, python, zip, unzip
-# - Must NOT have cygwin package readline (its GPL license might taint the SDK if
-#   it gets compiled in)
-# - Does not need a Java Development Kit or any other tools outside of cygwin.
-# - If you think you may have Windows versions of tools (e.g. make) installed, it may
-#   reduce confusion levels to 'export PATH=/usr/bin'
-
-PROG_NAME="$0"
-SDK_ZIP="$1"; shift
-DIST_DIR="$1"; shift
-TEMP_DIR="$1"; shift
-[ -z "$TEMP_DIR" ] && TEMP_DIR=${TMP:-/tmp}
-
-set -e  # Fail this script as soon as a command fails -- fail early, fail fast
-
-function die() {
-    echo "Error:" $*
-    echo "Aborting"
-    exit 1
-}
-
-function usage() {
-    local NAME
-    NAME=`basename ${PROG_NAME}`
-    echo "Usage: ${NAME} linux_or_mac_sdk.zip output_dir [temp_dir]"
-    echo "If temp_dir is not given, \$TMP is used. If that's missing, /tmp is used."
-    status
-    exit 2
-}
-
-function status() {
-    echo "Current values:"
-    echo "- Input  SDK: ${SDK_ZIP:-missing}"
-    echo "- Output dir: ${DIST_DIR:-missing}"
-    echo "- Temp   dir: ${TEMP_DIR:-missing}"
-}
-
-function check() {
-    [ -f "$SDK_ZIP" ] || usage
-    [ -d "$DIST_DIR" ] || usage
-
-
-    # We need mgwz.dll in the SDK when compiling with Cygwin 1.5
-    # Right now we don't support building with Cygwin 1.7 yet, as it lacks this DLL.
-    NEED_MGWZ=1
-    # We can skip this check for debug purposes.
-    echo $*
-    [[ "$1" == "-no-mgwz" ]] && NEED_MGWZ=""
-    CYG_MGWZ_PATH=/cygdrive/c/cygwin/bin/mgwz.dll
-    [[ -n $NEED_MGWZ && ! -f $CYG_MGWZ_PATH ]] && \
-        die "Cygwin is missing $CYG_MGWZ_PATH. Use -no-mgwz to override."
-
-
-    # Use the BUILD_ID as SDK_NUMBER if defined, otherwise try to get it from the
-    # provided zip filename.
-    if [ -f config/build_id.make ]; then
-        BUILD_ID=`cat config/build_id.make | sed -n '/BUILD_ID=/s/^[^=]\+=\(.*\)$/\1/p'`
-        [ -n "$BUILD_ID" ] && SDK_NUMBER="$BUILD_ID"
-    fi
-    if [ -z "$SDK_NUMBER" ]; then
-        # Look for a pattern like "anything_sdknumber.extension"
-        # The pattern is now "any-thing_sdknumber_anything-else.extension"
-        #
-        # The bottom line is that the SDK number is whatever is enclosed by
-        # the LAST couple of underscores. You can have underscores *before* the
-        # SDK number if you want, but not after, e.g these are valid:
-        #    android_sdk_4242_platform.zip or blah_42_.zip
-        #
-        # Note that the root directory name in the zip must match the zip
-        # name, too, so there's no point just changing the zip name to match
-        # the above format.
-        #
-        # SDK_NUMBER will be empty if nothing matched.
-        filename=`basename "$SDK_ZIP"`
-        SDK_NUMBER=`echo $filename | sed -n 's/^.*_\([^_./]\+\)_[^_.]*\..*$/\1/p'`
-    fi
-
-    [ -n "$SDK_NUMBER" ] || die "Failed to extract the SDK number from $SDK_ZIP. Check its format."
-
-    [ $OSTYPE == "cygwin" ] || die "This expects to run under Cygwin"
-    [ -e `which zip` ] || die "Please install 'zip' package in Cygwin"
-    [ -f "build/envsetup.sh" ] || die "Please run this from the 'android' directory"
-
-    echo "Using SDK ${SDK_NUMBER}"
-}
-
-function build() {
-
-    # IMPORTANT: For Cygwin to be able to build Android targets here,
-    # you will generally need to edit build/core/main.mk and add directories
-    # where Android.mk makefiles are to be found to the SDK_ONLY==true section.
-
-    echo
-    echo "Building..."
-    [ -n "$MAKE_OPT" ] && echo "Make options: $MAKE_OPT"
-
-    . build/envsetup.sh
-
-    # Disable parallel build: it generates "permission denied" issues when
-    # multiple "ar.exe" are running in parallel.
-    make \
-        aapt adb aidl \
-        etc1tool \
-        prebuilt \
-        dexdump dmtracedump \
-        fastboot \
-        hprof-conv \
-        mksdcard \
-        sdklauncher sqlite3 \
-        zipalign \
-        || die "Build failed"
-
-    # Fix permissions. Git/cygwin may not make this +x as needed.
-    chmod +x prebuilt/windows/sdl/bin/sdl-config
-
-    # It's worth building the emulator with -j 4 so do it separately
-    make -j 4 emulator || die "Build failed"
-}
-
-function package() {
-    echo
-    echo "Packaging..."
-    DEST_NAME="android-sdk_${SDK_NUMBER}_windows"
-    DEST_NAME_ZIP="${DEST_NAME}.zip"
-
-    TEMP_SDK_DIR="$TEMP_DIR/$DEST_NAME"
-
-    # Unzip current linux/mac SDK and rename using the windows name
-    [ -e "$TEMP_SDK_DIR" ] && rm -rfv "$TEMP_SDK_DIR"  # cleanup dest first if exists
-    UNZIPPED=`basename "$SDK_ZIP"`
-    UNZIPPED="$TEMP_DIR/${UNZIPPED/.zip/}"
-    [ -e "$UNZIPPED" ] && rm -rfv "$UNZIPPED"  # cleanup unzip dir (if exists)
-    unzip "$SDK_ZIP" -d "$TEMP_DIR"
-    mv -v "$UNZIPPED" "$TEMP_SDK_DIR"
-
-    # Assert that the package contains only one platform
-    PLATFORMS="$TEMP_SDK_DIR/platforms"
-    THE_PLATFORM=`echo $PLATFORMS/*`
-    PLATFORM_TOOLS=$THE_PLATFORM/tools
-    echo "Platform found: " $THE_PLATFORM
-    [[ -d "$THE_PLATFORM" ]] || die \
-        "Error: One platform was expected in $SDK_ZIP. " \
-        "Instead found " $THE_PLATFORM
-    [[ -d "$PLATFORM_TOOLS" ]] || die "Missing folder $PLATFORM_TOOLS."
-
-    # Package USB Driver
-    if type package_usb_driver 2>&1 | grep -q function ; then
-        package_usb_driver $TEMP_SDK_DIR
-    fi
-
-    # Remove obsolete stuff from tools & platform
-    TOOLS="$TEMP_SDK_DIR/tools"
-    LIB="$TEMP_SDK_DIR/tools/lib"
-    rm -v "$TOOLS"/{adb,android,apkbuilder,ddms,dmtracedump,draw9patch,emulator,etc1tool}
-    rm -v "$TOOLS"/{hierarchyviewer,hprof-conv,layoutopt,mksdcard,sqlite3,traceview,zipalign,monkeyrunner}
-    rm -v "$TOOLS"/proguard/bin/*.sh
-    rm -v "$LIB"/*/swt.jar
-    rm -v "$PLATFORM_TOOLS"/{aapt,aidl,dx,dexdump}
-
-    # Copy all the new stuff in tools
-    # Note: some tools are first copied here and then moved in platforms/<name>/tools/
-    cp -v out/host/windows-x86/bin/*.{exe,dll} "$TOOLS"/
-    mkdir -pv "$LIB"/x86
-    cp -v prebuilt/windows/swt/swt.jar         "$LIB"/x86/
-    mkdir -pv "$LIB"/x86_64
-    cp -v prebuilt/windows-x86_64/swt/swt.jar  "$LIB"/x86_64/
-
-    # Copy the SDK Manager (aka sdklauncher) to the root of the SDK (it was copied in tools above)
-    # and move it also in SDK/tools/lib (so that tools updates can update the root one too)
-    cp "$TOOLS/sdklauncher.exe" "$TEMP_SDK_DIR/SDK Manager.exe"
-    mv "$TOOLS/sdklauncher.exe" "$LIB/SDK Manager.exe"
-
-    # If you want the emulator NOTICE in the tools dir, uncomment the following line:
-    # cp -v external/qemu/NOTICE "$TOOLS"/emulator_NOTICE.txt
-
-    # We currently need libz from MinGW for aapt
-    [[ -n $NEED_MGWZ ]] && cp -v $CYG_MGWZ_PATH "$TOOLS"/
-
-    # Update a bunch of bat files
-    cp -v sdk/files/post_tools_install.bat                 "$LIB"/
-    cp -v sdk/files/find_java.bat                          "$LIB"/
-    cp -v sdk/apkbuilder/etc/apkbuilder.bat                "$TOOLS"/
-    cp -v sdk/ddms/app/etc/ddms.bat                        "$TOOLS"/
-    cp -v sdk/traceview/etc/traceview.bat                  "$TOOLS"/
-    cp -v sdk/hierarchyviewer2/app/etc/hierarchyviewer.bat "$TOOLS"/
-    cp -v sdk/layoutopt/app/etc/layoutopt.bat              "$TOOLS"/
-    cp -v sdk/draw9patch/etc/draw9patch.bat                "$TOOLS"/
-    cp -v sdk/sdkmanager/app/etc/android.bat               "$TOOLS"/
-    cp -v sdk/monkeyrunner/etc/monkeyrunner.bat            "$TOOLS"/
-    cp -v sdk/files/proguard/bin/*.bat                     "$TOOLS"/proguard/bin/
-
-    # Put the JetCreator tools, content and docs (not available in the linux SDK)
-    JET="$TOOLS/Jet"
-    JETCREATOR="$JET/JetCreator"
-    JETDEMOCONTENT="$JET/demo_content"
-    JETLOGICTEMPLATES="$JET/logic_templates"
-    JETDOC="$TEMP_SDK_DIR/docs/JetCreator"
-
-    # need to rm these folders since a Mac SDK will have them and it might create a conflict
-    rm -rfv "$JET"
-    rm -rfv "$JETDOC"
-
-    # now create fresh folders for JetCreator
-    mkdir -v "$JET"
-    mkdir -v "$JETDOC"
-
-    cp -rv external/sonivox/jet_tools/JetCreator         "$JETCREATOR"/
-    cp -rv external/sonivox/jet_tools/JetCreator_content "$JETDEMOCONTENT"/
-    cp -rv external/sonivox/jet_tools/logic_templates    "$JETLOGICTEMPLATES"/
-    chmod -vR u+w "$JETCREATOR"  # fixes an issue where Cygwin might copy the above as u+rx only
-    cp -v prebuilt/windows/jetcreator/EASDLL.dll         "$JETCREATOR"/
-
-    cp -v  external/sonivox/docs/JET_Authoring_Guidelines.html  "$JETDOC"/
-    cp -rv external/sonivox/docs/JET_Authoring_Guidelines_files "$JETDOC"/
-    cp  -v external/sonivox/docs/JET_Creator_User_Manual.html   "$JETDOC"/
-    cp -rv external/sonivox/docs/JET_Creator_User_Manual_files  "$JETDOC"/
-
-    # Copy or move platform specific tools to the default platform.
-    cp -v dalvik/dx/etc/dx.bat "$PLATFORM_TOOLS"/
-    mv -v "$TOOLS"/{aapt.exe,aidl.exe,dexdump.exe} "$PLATFORM_TOOLS"/
-    # Note: mgwz.dll must be both in SDK/tools for zipalign and in SDK/platform/XYZ/tools/ for aapt
-    [[ -n $NEED_MGWZ ]] && cp -v "$TOOLS"/mgwz.dll "$PLATFORM_TOOLS"/
-
-    # Fix EOL chars to make window users happy - fix all files at the top level only
-    # as well as all batch files including those in platforms/<name>/tools/
-    find "$TEMP_SDK_DIR" -maxdepth 1 -type f -writable -print0 | xargs -0 unix2dos -D
-    find "$TEMP_SDK_DIR" -maxdepth 3 -name "*.bat" -type f -writable -print0 | xargs -0 unix2dos -D
-
-    # Done.. Zip it. Clean the temp folder ONLY if the zip worked (to ease debugging)
-    pushd "$TEMP_DIR" > /dev/null
-    [ -e "$DEST_NAME_ZIP" ] && rm -rfv "$DEST_NAME_ZIP"
-    zip -9r "$DEST_NAME_ZIP" "$DEST_NAME" && rm -rfv "$DEST_NAME"
-    popd > /dev/null
-
-    # Now move the final zip from the temp dest to the final dist dir
-    mv -v "$TEMP_DIR/$DEST_NAME_ZIP" "$DIST_DIR/$DEST_NAME_ZIP"
-
-    # We want fastboot and adb (and its DLLs) next to the new SDK
-    for i in fastboot.exe adb.exe AdbWinApi.dll AdbWinUsbApi.dll; do
-        cp -vf out/host/windows-x86/bin/$i "$DIST_DIR"/$i
-    done
-
-    echo "Done"
-    echo
-    echo "Resulting SDK is in $DIST_DIR/$DEST_NAME_ZIP"
-}
-
-check $*
-status
-build
-package
-
-echo "Done"
diff --git a/build/tools/patch_windows_sdk.sh b/build/tools/patch_windows_sdk.sh
index 2d3c707..3d9277a 100755
--- a/build/tools/patch_windows_sdk.sh
+++ b/build/tools/patch_windows_sdk.sh
@@ -1,13 +1,41 @@
 #!/bin/bash
 
+# This script takes a Linux SDK, cleans it and injects the necessary Windows
+# binaries needed by the SDK. The script has 2 parts:
+# - development/tools/build/path_windows_sdk.sh to process the
+#   platform-dependent folders and files.
+# - sdk/build/patch_windows_sdk.sh to process folder and files which
+#   depend on the sdk.git repo. This file will be invoked by this one.
+#
+# Input arguments:
+# -q = Optional arg to make this silent. Must be given first.
+# $1 = Temporary SDK directory, that is the Linux SDK being patched into
+#      a Windows one.
+# $2 = The out/host/windows directory, which contains the new Windows
+#      binaries to use.
+# $3 = An optional replacement for $TOPDIR (inherited from the Android
+#      build system), which is the top directory where Android is located.
+
 # Verbose by default. Use -q to make more silent.
 V="-v"
-if [[ "$1" == "-q" ]]; then V=""; shift; fi
+Q=""
+if [[ "$1" == "-q" ]]; then
+    Q="$1"
+    V=""
+    shift
+fi
 
 TEMP_SDK_DIR=$1
 WIN_OUT_DIR=$2
 TOPDIR=${TOPDIR:-$3}
 
+# The unix2dos is provided by the APT package "tofrodos". However
+# as for ubuntu lucid, the package renamed the command to "todos".
+UNIX2DOS=`which unix2dos`
+if [[ ! -x $UNIX2DOS ]]; then
+  UNIX2DOS=`which todos`
+fi
+
 PLATFORMS=( $TEMP_SDK_DIR/platforms/* )
 if [[ ${#PLATFORMS[@]} != 1 ]]; then
     echo "Error: Too many platforms found in $TEMP_SDK_DIR"
@@ -25,8 +53,7 @@
 TOOLS=$TEMP_SDK_DIR/tools
 PLATFORM_TOOLS=$TEMP_SDK_DIR/platform-tools
 LIB=$TEMP_SDK_DIR/tools/lib
-rm $V $TOOLS/{android,apkbuilder,ddms,dmtracedump,draw9patch,emulator,etc1tool}
-rm $V $TOOLS/{hierarchyviewer,hprof-conv,layoutopt,mksdcard,sqlite3,traceview,zipalign,monkeyrunner}
+rm $V $TOOLS/{dmtracedump,etc1tool,hprof-conv,sqlite3,zipalign}
 rm $V $TOOLS/proguard/bin/*.sh
 rm $V $LIB/*/swt.jar
 rm $V $PLATFORM_TOOLS/{adb,aapt,aidl,dx,dexdump}
@@ -39,30 +66,6 @@
 mkdir -pv $LIB/x86_64
 cp $V ${TOPDIR}prebuilt/windows-x86_64/swt/swt.jar  $LIB/x86_64/
 
-# Copy the SDK Manager (aka sdklauncher) to the root of the SDK (it was copied in tools above)
-# and move it also in SDK/tools/lib (so that tools updates can update the root one too)
-cp $TOOLS/sdklauncher.exe $TEMP_SDK_DIR/"SDK Manager.exe"
-mv $TOOLS/sdklauncher.exe $LIB/"SDK Manager.exe"
-
-# Copy the emulator NOTICE in the tools dir
-cp $V ${TOPDIR}external/qemu/NOTICE $TOOLS/emulator_NOTICE.txt
-
-# aapt under cygwin needs to have mgwz.dll
-[[ -n $NEED_MGWZ ]] && cp $V $CYG_MGWZ_PATH $TOOLS/
-
-# Update a bunch of bat files
-cp $V ${TOPDIR}sdk/files/post_tools_install.bat                 $LIB/
-cp $V ${TOPDIR}sdk/files/find_java.bat                          $LIB/
-cp $V ${TOPDIR}sdk/apkbuilder/etc/apkbuilder.bat                $TOOLS/
-cp $V ${TOPDIR}sdk/ddms/app/etc/ddms.bat                        $TOOLS/
-cp $V ${TOPDIR}sdk/traceview/etc/traceview.bat                  $TOOLS/
-cp $V ${TOPDIR}sdk/hierarchyviewer2/app/etc/hierarchyviewer.bat $TOOLS/
-cp $V ${TOPDIR}sdk/layoutopt/app/etc/layoutopt.bat              $TOOLS/
-cp $V ${TOPDIR}sdk/draw9patch/etc/draw9patch.bat                $TOOLS/
-cp $V ${TOPDIR}sdk/sdkmanager/app/etc/android.bat               $TOOLS/
-cp $V ${TOPDIR}sdk/monkeyrunner/etc/monkeyrunner.bat            $TOOLS/
-cp $V ${TOPDIR}sdk/files/proguard/bin/*.bat                     $TOOLS/proguard/bin/
-
 # Put the JetCreator tools, content and docs (not available in the linux SDK)
 JET=$TOOLS/Jet
 JETCREATOR=$JET/JetCreator
@@ -93,14 +96,15 @@
 cp $V ${TOPDIR}dalvik/dx/etc/dx.bat $PLATFORM_TOOLS/
 mv $V $TOOLS/{adb.exe,aapt.exe,aidl.exe,dexdump.exe} $TOOLS/Adb*.dll $PLATFORM_TOOLS/
 
-# When building under cygwin, mgwz.dll must be both in SDK/tools for zipalign
-# and in SDK/platform/XYZ/tools/ for aapt
-[[ -n $NEED_MGWZ ]] && cp $V $TOOLS/mgwz.dll $PLATFORM_TOOLS/
-
 # Fix EOL chars to make window users happy - fix all files at the top level
 # as well as all batch files including those in platforms/<name>/tools/
-find $TEMP_SDK_DIR -maxdepth 1 -name "*.[ht]*" -type f -print0 | xargs -0 unix2dos
-find $TEMP_SDK_DIR -maxdepth 3 -name "*.bat"   -type f -print0 | xargs -0 unix2dos
+if [[ -x $UNIX2DOS ]]; then
+  find $TEMP_SDK_DIR -maxdepth 1 -name "*.[ht]*" -type f -print0 | xargs -0 $UNIX2DOS
+  find $TEMP_SDK_DIR -maxdepth 3 -name "*.bat"   -type f -print0 | xargs -0 $UNIX2DOS
+fi
+
+# Execute the packaging script in the sdk directory
+${TOPDIR}sdk/build/patch_windows_sdk.sh $Q ${TEMP_SDK_DIR} ${WIN_OUT_DIR} ${TOPDIR}
 
 # Just to make it easier on the build servers, we want fastboot and adb (and its DLLs)
 # next to the new SDK, so up one dir.
diff --git a/build/tools/windows_sdk.mk b/build/tools/windows_sdk.mk
index 9609160..e7e63c7 100644
--- a/build/tools/windows_sdk.mk
+++ b/build/tools/windows_sdk.mk
@@ -18,20 +18,22 @@
 ifeq ($(strip $(shell which i586-mingw32msvc-gcc 2>/dev/null)),)
 $(error MinGW is required to build a Windows SDK. Please 'apt-get install mingw32')
 endif
-ifeq ($(strip $(shell which unix2dos 2>/dev/null)),)
+ifeq ($(strip $(shell which unix2dos todos 2>/dev/null)),)
 $(error Need a unix2dos command. Please 'apt-get install tofrodos')
 endif
 
+include $(TOPDIR)sdk/build/windows_sdk_tools.mk
+
 WIN_TARGETS := \
 	aapt adb aidl \
-	emulator etc1tool \
+	etc1tool \
 	dexdump dmtracedump \
 	fastboot \
 	hprof-conv \
-	mksdcard \
 	prebuilt \
-	sdklauncher sqlite3 \
-	zipalign
+	sqlite3 \
+	zipalign \
+	$(WIN_SDK_TARGETS)
 
 # LINUX_SDK_NAME/DIR is set in build/core/Makefile
 WIN_SDK_NAME  := $(subst $(HOST_OS)-$(HOST_ARCH),windows,$(LINUX_SDK_NAME))
@@ -72,6 +74,10 @@
 		$(TOPDIR)development/build/tools/patch_windows_sdk.sh \
 		$(subst @,-q,$(hide)) \
 		$(WIN_SDK_DIR)/$(WIN_SDK_NAME) $(OUT_DIR) $(TOPDIR)
+	$(hide) \
+		$(TOPDIR)sdk/build/patch_windows_sdk.sh \
+		$(subst @,-q,$(hide)) \
+		$(WIN_SDK_DIR)/$(WIN_SDK_NAME) $(OUT_DIR) $(TOPDIR)
 	$(hide) ( \
 		cd $(WIN_SDK_DIR) && \
 		rm -f $(WIN_SDK_NAME).zip && \