Support GPU emulation standalone build.

This patch modifies the emulator's standalone build system
to rebuild all GPU emulation libraries directly from sources,
assuming their are located under ../../sdk/emulator/opengl/
or ../opengl/

Change-Id: I2ac8fc4bc2d06561dc52298689840f74171397aa
diff --git a/Android.mk b/Android.mk
index 0b02fdb..de7b9d4 100644
--- a/Android.mk
+++ b/Android.mk
@@ -2,9 +2,5 @@
 # through the 'm' or 'mm' build commands. if not, we use the
 # standard QEMU Makefile
 #
-ifeq ($(DEFAULT_GOAL),droid)
-    LOCAL_PATH:= $(call my-dir)
-    include $(LOCAL_PATH)/Makefile.android
-else
-    include Makefile.qemu
-endif
+LOCAL_PATH:= $(call my-dir)
+include $(LOCAL_PATH)/Makefile.android
diff --git a/Makefile.android b/Makefile.android
index a60c424..e377549 100644
--- a/Makefile.android
+++ b/Makefile.android
@@ -21,6 +21,7 @@
 
 MY_CC  := $(HOST_CC)
 MY_CXX := $(HOST_CXX)
+MY_LD  := $(HOST_LD)
 MY_AR  := $(HOST_AR)
 
 MY_CFLAGS := $(CONFIG_INCLUDES) -O2 -g -fno-PIC -falign-functions=0 -fomit-frame-pointer
@@ -34,6 +35,7 @@
 endif
 
 MY_LDLIBS :=
+MY_LDFLAGS :=
 
 ifeq ($(HOST_OS),freebsd)
   MY_CFLAGS += -I /usr/local/include
@@ -76,6 +78,17 @@
     endif
 endif
 
+# NOTE: The following definitions are only used by the standalone build.
+MY_EXEEXT :=
+MY_DLLEXT := .so
+ifeq ($(HOST_OS),windows)
+  MY_EXEEXT := .exe
+  MY_DLLEXT := .dll
+endif
+ifeq ($(HOST_OS),darwin)
+  MY_DLLEXT := .dylib
+endif
+
 # Some CFLAGS below use -Wno-missing-field-initializers but this is not
 # supported on GCC 3.x which is still present under Cygwin.
 # Find out by probing GCC for support of this flag. Note that the test
@@ -121,11 +134,11 @@
 ifneq ($(combo_target)$(TARGET_SIMULATOR),HOST_true)
   ifneq ($(BUILD_HOST_64bit),)
     MY_CFLAGS += -m64
-    MY_LDLIBS += -m64
+    MY_LDFLAGS += -m64
   else
     ifneq ($(HOST_ARCH),x86_64)
       MY_CFLAGS += -m32
-      MY_LDLIBS += -m32
+      MY_LDFLAGS += -m32
     endif
   endif
 
@@ -148,6 +161,12 @@
 # android-configure.sh
 MY_CFLAGS += -I$(LOCAL_PATH)/qapi-auto-generated
 
+ifneq (true,$(BUILD_STANDALONE_EMULATOR))
+my-host-tool = $(MY_$1)
+else
+my-host-tool = $(if $(strip $(LOCAL_HOST_BUILD)),$(BUILD_$1),$(MY_$1))
+endif
+
 # A useful function that can be used to start the declaration of a host
 # module. Avoids repeating the same stuff again and again.
 # Usage:
@@ -161,16 +180,12 @@
 start-emulator-library = \
     $(eval include $(CLEAR_VARS)) \
     $(eval LOCAL_NO_DEFAULT_COMPILER_FLAGS := true) \
-    $(eval LOCAL_CC := $(MY_CC)) \
-    $(eval LOCAL_CXX := $(MY_CXX)) \
-    $(eval LOCAL_CFLAGS := $(MY_CFLAGS)) \
-    $(eval LOCAL_AR := $(MY_AR)) \
-    $(eval LOCAL_LDLIBS := $(MY_LDLIBS)) \
     $(eval LOCAL_MODULE := $1) \
     $(eval LOCAL_MODULE_CLASS := STATIC_LIBRARIES)
 
 # Used with start-emulator-library
 end-emulator-library = \
+    $(eval $(end-emulator-module-ev)) \
     $(eval include $(BUILD_HOST_STATIC_LIBRARY))
 
 # A variant of start-emulator-library to start the definition of a host
@@ -182,8 +197,18 @@
 # A varient of end-emulator-library for host programs instead
 end-emulator-program = \
     $(eval LOCAL_LDLIBS += $(QEMU_SYSTEM_LDLIBS)) \
+    $(eval $(end-emulator-module-ev)) \
     $(eval include $(BUILD_HOST_EXECUTABLE))
 
+define end-emulator-module-ev
+LOCAL_CC := $$(call my-host-tool,CC)
+LOCAL_CXX := $$(call my-host-tool,CXX)
+LOCAL_AR := $$(call my-host-tool,AR)
+LOCAL_LD := $$(call my-host-tool,LD)
+LOCAL_CFLAGS := $$(call my-host-tool,CFLAGS) $$(LOCAL_CFLAGS)
+LOCAL_LDFLAGS := $$(call my-host-tool,LDFLAGS) $$(LOCAL_LDFLAGS)
+LOCAL_LDLIBS := $$(LOCAL_LDLIBS) $$(call my-host-tool,LDLIBS)
+endef
 
 # The common libraries
 #
@@ -283,6 +308,22 @@
 
 include $(LOCAL_PATH)/Makefile.tests
 
+##############################################################################
+##############################################################################
+###
+###  GPU emulation libraries
+###
+###  Build directly from sources when using the standalone build.
+###
+ifeq (true,$(BUILD_STANDALONE_EMULATOR))
+  ifeq (,$(strip $(wildcard $(EMULATOR_EMUGL_SOURCES_DIR))))
+    $(error Cannot find GPU emulation sources directory: $(EMULATOR_EMUGL_SOURCES_DIR))
+  endif
+
+  BUILD_EMULATOR_OPENGL := true
+  include $(EMULATOR_EMUGL_SOURCES_DIR)/Android.mk
+endif
+
 ## VOILA!!
 
 endif  # BUILD_EMULATOR == true || BUILD_STANDALONE_EMULATOR == true
diff --git a/android-configure.sh b/android-configure.sh
index 8abfd52..bfda5e2 100755
--- a/android-configure.sh
+++ b/android-configure.sh
@@ -24,7 +24,7 @@
 OPTION_STATIC=no
 OPTION_MINGW=no
 
-GLES_LIBS=
+GLES_DIR=
 GLES_SUPPORT=no
 GLES_PROBE=yes
 
@@ -63,8 +63,7 @@
   ;;
   --static) OPTION_STATIC=yes
   ;;
-  --gles-libs=*) GLES_LIBS=$optarg
-  GLES_SUPPORT=yes
+  --gles-dir=*) GLES_DIR=$optarg
   ;;
   --no-gles) GLES_PROBE=no
   ;;
@@ -97,7 +96,7 @@
     echo "  --static                 build a completely static executable"
     echo "  --verbose                verbose configuration"
     echo "  --debug                  build debug version of the emulator"
-    echo "  --gles-libs=PATH         specify path to GLES emulation host libraries"
+    echo "  --gles-dir=PATH          specify path to GLES host emulation sources [auto-detected]"
     echo "  --no-gles                disable GLES emulation support"
     echo "  --no-pcbios              disable copying of PC Bios files"
     echo ""
@@ -139,6 +138,18 @@
 esac
 
 TARGET_OS=$OS
+
+setup_toolchain
+
+BUILD_AR=$AR
+BUILD_CC=$CC
+BUILD_CXX=$CC
+BUILD_LD=$LD
+BUILD_AR=$AR
+BUILD_CFLAGS=$CFLAGS
+BUILD_CXXFLAGS=$CXXFLAGS
+BUILD_LDFLAGS=$LDFLAGS
+
 if [ "$OPTION_MINGW" = "yes" ] ; then
     enable_linux_mingw
     TARGET_OS=windows
@@ -161,27 +172,6 @@
     IN_ANDROID_BUILD=no
 fi
 
-# This is the list of static and shared host libraries we need to link
-# against in order to support OpenGLES emulation properly. Note that in
-# the case of a standalone build, we will find these libraries inside the
-# platform build tree and copy them into objs/lib/ automatically, unless
-# you use --gles-libs to point explicitely to a different directory.
-#
-GLES_SHARED_LIBRARIES="\
-  libOpenglRender \
-  libGLES_CM_translator \
-  libGLES_V2_translator \
-  libEGL_translator"
-
-if [ "$OPTION_MINGW" != "yes" ]; then
-  # There are no 64-bit libraries for Windows yet!
-  GLES_SHARED_LIBRARIES="$GLES_SHARED_LIBRARIES \
-    lib64OpenglRender \
-    lib64GLES_CM_translator \
-    lib64GLES_V2_translator \
-    lib64EGL_translator"
-fi
-
 if [ "$IN_ANDROID_BUILD" = "yes" ] ; then
     locate_android_prebuilt
 
@@ -214,22 +204,10 @@
     else
         log "Tools      : Could not locate $TOOLS_PROPS !?"
     fi
-
-    GLES_PROBE_LIB_DIR=$(dirname "$HOST_BIN")/lib
-    case $GLES_PROBE_LIB_DIR in
-        */windows/lib)
-            GLES_PROBE_LIB_DIR=${GLES_PROBE_LIB_DIR%%/windows/lib}/windows-x86/lib
-            ;;
-    esac
 else
     if [ "$USE_CCACHE" != 0 ]; then
         CCACHE=$(which ccache 2>/dev/null)
     fi
-    GLES_PROBE_OS=$TARGET_OS
-    if [ "$GLES_PROBE_OS" = "windows" ]; then
-      GLES_PROBE_OS=windows-x86
-    fi
-    GLES_PROBE_LIB_DIR=../../out/host/$GLES_PROBE_OS/lib
 fi  # IN_ANDROID_BUILD = no
 
 if [ -n "$CCACHE" -a -f "$CCACHE" ] ; then
@@ -243,41 +221,26 @@
 # Try to find the GLES emulation headers and libraries automatically
 if [ "$GLES_PROBE" = "yes" ]; then
     GLES_SUPPORT=yes
-    if [ -z "$GLES_LIBS" ]; then
-        log "GLES       : Probing for host libraries"
-        GLES_LIBS=$GLES_PROBE_LIB_DIR
-        if [ -d "$GLES_LIBS" ]; then
-            echo "GLES       : Libs in $GLES_LIBS"
-        else
-            echo "Warning: Could nof find OpenGLES emulation libraries in: $GLES_LIBS"
+    if [ -z "$GLES_DIR" ]; then
+        GLES_DIR=../../sdk/emulator/opengl
+        log2 "GLES       : Probing source dir: $GLES_DIR"
+        if [ ! -d "$GLES_DIR" ]; then
+            GLES_DIR=../opengl
+            log2 "GLES       : Probing source dir: $GLES_DIR"
+            if [ ! -d "$GLES_DIR" ]; then
+                GLES_DIR=
+            fi
+        fi
+        if [ -z "$GLES_DIR" ]; then
+            echo "GLES       : Could not find GPU emulation sources!"
             GLES_SUPPORT=no
+        else
+            echo "GLES       : Found GPU emulation sources: $GLES_DIR"
+            GLES_SUPPORT=yes
         fi
     fi
 fi
 
-if [ "$GLES_SUPPORT" = "yes" ]; then
-    mkdir -p objs/lib
-
-    for lib in $GLES_SHARED_LIBRARIES; do
-        GLES_LIB=$GLES_LIBS/${lib}$TARGET_DLL_SUFFIX
-        if [ ! -f "$GLES_LIB" ]; then
-            echo "ERROR: Missing OpenGLES emulation host library: $GLES_LIB"
-            echo "Please fix this by using --gles-libs to point to the right directory!"
-            if [ "$IN_ANDROID_BUILD" = "true" ]; then
-                echo "You might also be missing the library because you forgot to rebuild the whole platform!"
-            fi
-            exit 1
-        fi
-        cp $GLES_LIB objs/lib
-        if [ $? != 0 ]; then
-            echo "ERROR: Could not find required OpenGLES emulation library: $GLES_LIB"
-            exit 1
-        else
-            log "GLES       : Copying $GLES_LIB"
-        fi
-    done
-fi
-
 if [ "$PCBIOS_PROBE" = "yes" ]; then
     PCBIOS_DIR=$(dirname "$0")/../../prebuilts/qemu-kernel/x86/pc-bios
     if [ ! -d "$PCBIOS_DIR" ]; then
@@ -531,6 +494,21 @@
 # Build the config.make file
 #
 
+case $OS in
+    windows)
+        HOST_EXEEXT=.exe
+        HOST_DLLEXT=.dll
+        ;;
+    darwin)
+        HOST_EXEEXT=
+        HOST_DLLEXT=.dylib
+        ;;
+    *)
+        HOST_EXEEXT=
+        HOST_DLLEXT=
+        ;;
+esac
+
 case $TARGET_OS in
     windows)
         TARGET_EXEEXT=.exe
@@ -566,6 +544,18 @@
 echo "PREBUILT          := $ANDROID_PREBUILT" >> $config_mk
 echo "PREBUILTS         := $ANDROID_PREBUILTS" >> $config_mk
 
+echo "" >> $config_mk
+echo "BUILD_OS          := $HOST_OS" >> $config_mk
+echo "BUILD_ARCH        := $HOST_ARCH" >> $config_mk
+echo "BUILD_EXEEXT      := $HOST_EXEEXT" >> $config_mk
+echo "BUILD_DLLEXT      := $HOST_DLLEXT" >> $config_mk
+echo "BUILD_AR          := $BUILD_AR" >> $config_mk
+echo "BUILD_CC          := $BUILD_CC" >> $config_mk
+echo "BUILD_CXX         := $BUILD_CXX" >> $config_mk
+echo "BUILD_LD          := $BUILD_LD" >> $config_mk
+echo "BUILD_CFLAGS      := $BUILD_CFLAGS" >> $config_mk
+echo "BUILD_LDFLAGS     := $BUILD_LDFLAGS" >> $config_mk
+
 PWD=`pwd`
 echo "SRC_PATH          := $PWD" >> $config_mk
 if [ -n "$SDL_CONFIG" ] ; then
@@ -584,6 +574,10 @@
 if [ $OPTION_STATIC = yes ] ; then
     echo "CONFIG_STATIC_EXECUTABLE := true" >> $config_mk
 fi
+if [ "$GLES_SUPPORT" = "yes" ]; then
+    echo "EMULATOR_BUILD_EMUGL       := true" >> $config_mk
+    echo "EMULATOR_EMUGL_SOURCES_DIR := $GLES_DIR" >> $config_mk
+fi
 
 if [ -n "$ANDROID_SDK_TOOLS_REVISION" ] ; then
     echo "ANDROID_SDK_TOOLS_REVISION := $ANDROID_SDK_TOOLS_REVISION" >> $config_mk
diff --git a/android-rebuild.sh b/android-rebuild.sh
index 71400f3..875afb0 100755
--- a/android-rebuild.sh
+++ b/android-rebuild.sh
@@ -77,14 +77,22 @@
 fi
 
 echo "Running 32-bit unit test suite."
-UNIT_TEST=objs/emulator_unittests$EXE_SUFFIX
-run $TEST_SHELL $UNIT_TEST ||
-panic "For details, run: $UNIT_TEST"
+FAILURES=""
+for UNIT_TEST in emulator_unittests emugl_common_host_unittests; do
+  echo "   - $UNIT_TEST"
+  run $TEST_SHELL objs/$UNIT_TEST$EXE_SUFFIX || FAILURES="$FAILURES $UNIT_TEST"
+done
 
 if [ "$RUN_64BIT_TESTS" ]; then
     echo "Running 64-bit unit test suite."
-    UNIT_TEST=objs/emulator64_unittests$EXE_SUFFIX
-    run $TEST_SHELL $UNIT_TEST || panic "For details, run: $UNIT_TEST"
+    for UNIT_TEST in emulator64_unittests emugl64_common_host_unittests; do
+        echo "   - $UNIT_TEST"
+        run $TEST_SHELL objs/$UNIT_TEST$EXE_SUFFIX || FAILURES="$FAILURES $UNIT_TEST"
+    done
+fi
+
+if [ "$FAILURES" ]; then
+    panic "Unit test failures: $FAILURES"
 fi
 
 echo "Done. !!"
diff --git a/android/build/binary.make b/android/build/binary.make
index 0290d58..a3a4437 100644
--- a/android/build/binary.make
+++ b/android/build/binary.make
@@ -19,7 +19,8 @@
 # the directory where we're going to place our object files
 LOCAL_OBJS_DIR  := $(call intermediates-dir-for,EXECUTABLES,$(LOCAL_MODULE))
 LOCAL_OBJECTS   :=
-LOCAL_CC        ?= $(CC)
+$(call local-host-define,CC)
+$(call local-host-define,LD)
 LOCAL_C_SOURCES := $(filter  %.c,$(LOCAL_SRC_FILES))
 LOCAL_GENERATED_C_SOURCES := $(filter %.c,$(LOCAL_GENERATED_SOURCES))
 LOCAL_GENERATED_CXX_SOURCES := $(filter %$(LOCAL_CPP_EXTENSION),$(LOCAL_GENERATED_SOURCES))
@@ -28,6 +29,18 @@
 
 LOCAL_CFLAGS := $(strip $(patsubst %,-I%,$(LOCAL_C_INCLUDES)) $(LOCAL_CFLAGS))
 
+# HACK ATTACK: For the Darwin x86 build, we need to add
+# '-read_only_relocs suppress' to the linker command to avoid errors.
+# The only way to detect if we're building 32-bit or 64-bit binaries
+# is to look at -m32 and -m64 statements in the final link line, and
+# only keep the last one.
+ifeq ($(HOST_OS),darwin)
+  my_bitness := $(lastword $(filter -m32 -m64,$(LOCAL_LDFLAGS) $(LOCAL_LDLIBS) $(LOCAL_CFLAGS)))
+  ifeq (-m32,$(my_bitness))
+    LOCAL_LDLIBS += -Wl,-read_only_relocs,suppress
+  endif
+endif
+
 $(foreach src,$(LOCAL_C_SOURCES), \
     $(eval $(call compile-c-source,$(src))) \
 )
diff --git a/android/build/clear_vars.make b/android/build/clear_vars.make
index fa7d628..6dfc7a3 100644
--- a/android/build/clear_vars.make
+++ b/android/build/clear_vars.make
@@ -22,6 +22,7 @@
 LOCAL_ADDITIONAL_DEPENDENCIES :=
 LOCAL_AR :=
 LOCAL_CFLAGS :=
+LOCAL_HOST_BUILD :=
 LOCAL_LDFLAGS :=
 LOCAL_LDLIBS :=
 LOCAL_SRC_FILES :=
diff --git a/android/build/common.sh b/android/build/common.sh
index 5808570..9849bb2 100644
--- a/android/build/common.sh
+++ b/android/build/common.sh
@@ -559,11 +559,13 @@
     echo "HOST_OS     := $HOST_OS" >> $config_mk
     echo "HOST_ARCH   := $HOST_ARCH" >> $config_mk
     echo "CC          := $CC" >> $config_mk
-    echo "HOST_CC     := $CC" >> $config_mk
     echo "LD          := $LD" >> $config_mk
     echo "AR          := $AR" >> $config_mk
     echo "CFLAGS      := $CFLAGS" >> $config_mk
     echo "LDFLAGS     := $LDFLAGS" >> $config_mk
+    echo "HOST_CC     := $CC" >> $config_mk
+    echo "HOST_LD     := $LD" >> $config_mk
+    echo "HOST_AR     := $AR" >> $config_mk
 }
 
 add_android_config_mk ()
diff --git a/android/build/definitions.make b/android/build/definitions.make
index 4656374..664b28c 100644
--- a/android/build/definitions.make
+++ b/android/build/definitions.make
@@ -38,33 +38,44 @@
 hide :=
 endif
 
+# Return the parent directory of a given path.
+# $1: path
 parent-dir = $(dir $1)
+
+# Return the directory of the current Makefile / Android.mk.
 my-dir = $(call parent-dir,$(lastword $(MAKEFILE_LIST)))
 
-# return the directory containing the intermediate files for a given
+# Return the directory containing the intermediate files for a given
 # kind of executable
-# $1 = type (EXECUTABLES or STATIC_LIBRARIES)
+# $1 = type (EXECUTABLES, STATIC_LIBRARIES or SHARED_LIBRARIES).
 # $2 = module name
 # $3 = ignored
 #
-define intermediates-dir-for
-$(OBJS_DIR)/intermediates/$(2)
-endef
+intermediates-dir-for = $(OBJS_DIR)/intermediates/$(2)
 
+# Return the name of a given host tool, based on the value of
+# LOCAL_HOST_BUILD. If the variable is defined, return $(BUILD_$1),
+# otherwise return $(HOST_$1).
+# $1: Tool name (e.g. CC, LD, etc...)
+#
+local-host-tool = $(if $(strip $(LOCAL_HOST_BUILD)),$(BUILD_$1),$(MY_$1))
+local-host-exe = $(call local-host-tool,EXEEXT)
+local-host-dll = $(call local-host-tool,DLLEXT)
+
+local-host-define = $(if $(strip $(LOCAL_$1)),,$(eval LOCAL_$1 := $$(call local-host-tool,$1)))
+
+# Return the directory containing the intermediate files for the current
+# module. LOCAL_MODULE must be defined before calling this.
 local-intermediates-dir = $(OBJS_DIR)/intermediates/$(LOCAL_MODULE)
 
-# Generate the full path of a given static library
-define library-path
-$(OBJS_DIR)/libs/$(1).a
-endef
+local-library-path = $(OBJS_DIR)/libs/$(1).a
+local-executable-path = $(OBJS_DIR)/$(1)$(call local-host-tool,EXEEXT)
+local-shared-library-path = $(OBJS_DIR)/lib/$(1)$(call local-host-tool,DLLEXT)
 
-define executable-path
-$(OBJS_DIR)/$(1)$(EXE)
-endef
 
-define shared-library-path
-$(OBJS_DIR)/lib/$(1)$(HOST_DLLEXT)
-endef
+# Toolchain control support.
+# It's possible to switch between the regular toolchain and the host one
+# in certain cases.
 
 # Compile a C source file
 #
@@ -73,7 +84,7 @@
 OBJ:=$$(LOCAL_OBJS_DIR)/$$(SRC:%.c=%.o)
 LOCAL_OBJECTS += $$(OBJ)
 DEPENDENCY_DIRS += $$(dir $$(OBJ))
-$$(OBJ): PRIVATE_CFLAGS := $$(CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR)
+$$(OBJ): PRIVATE_CFLAGS := $$(call local-host-tool,CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR)
 $$(OBJ): PRIVATE_CC     := $$(LOCAL_CC)
 $$(OBJ): PRIVATE_OBJ    := $$(OBJ)
 $$(OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE)
@@ -93,7 +104,7 @@
 OBJ:=$$(LOCAL_OBJS_DIR)/$$(SRC:%$(LOCAL_CPP_EXTENSION)=%.o)
 LOCAL_OBJECTS += $$(OBJ)
 DEPENDENCY_DIRS += $$(dir $$(OBJ))
-$$(OBJ): PRIVATE_CFLAGS := $$(CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR)
+$$(OBJ): PRIVATE_CFLAGS := $$(call local-host-tool,CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR)
 $$(OBJ): PRIVATE_CXX    := $$(LOCAL_CC)
 $$(OBJ): PRIVATE_OBJ    := $$(OBJ)
 $$(OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE)
@@ -113,7 +124,7 @@
 OBJ:=$$(LOCAL_OBJS_DIR)/$$(notdir $$(SRC:%.m=%.o))
 LOCAL_OBJECTS += $$(OBJ)
 DEPENDENCY_DIRS += $$(dir $$(OBJ))
-$$(OBJ): PRIVATE_CFLAGS := $$(CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR)
+$$(OBJ): PRIVATE_CFLAGS := $$(call local-host-tool,CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR)
 $$(OBJ): PRIVATE_CC     := $$(LOCAL_CC)
 $$(OBJ): PRIVATE_OBJ    := $$(OBJ)
 $$(OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE)
@@ -133,7 +144,7 @@
 OBJ:=$$(LOCAL_OBJS_DIR)/$$(notdir $$(SRC:%.c=%.o))
 LOCAL_OBJECTS += $$(OBJ)
 DEPENDENCY_DIRS += $$(dir $$(OBJ))
-$$(OBJ): PRIVATE_CFLAGS := $$(CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR)
+$$(OBJ): PRIVATE_CFLAGS := $$(call local-host-tool,CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR)
 $$(OBJ): PRIVATE_CC     := $$(LOCAL_CC)
 $$(OBJ): PRIVATE_OBJ    := $$(OBJ)
 $$(OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE)
@@ -151,7 +162,7 @@
 OBJ:=$$(LOCAL_OBJS_DIR)/$$(notdir $$(SRC:%$(LOCAL_CPP_EXTENSION)=%.o))
 LOCAL_OBJECTS += $$(OBJ)
 DEPENDENCY_DIRS += $$(dir $$(OBJ))
-$$(OBJ): PRIVATE_CFLAGS := $$(CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR)
+$$(OBJ): PRIVATE_CFLAGS := $$(call local-host-tool,CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR)
 $$(OBJ): PRIVATE_CXX    := $$(LOCAL_CC)
 $$(OBJ): PRIVATE_OBJ    := $$(OBJ)
 $$(OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE)
@@ -204,4 +215,3 @@
 @mkdir -p $(dir $@)
 $(hide) $(PRIVATE_CUSTOM_TOOL)
 endef
-
diff --git a/android/build/host_executable.make b/android/build/host_executable.make
index 6331044..ba504c3 100644
--- a/android/build/host_executable.make
+++ b/android/build/host_executable.make
@@ -14,27 +14,26 @@
 #
 
 # first, call a library containing all object files
-LOCAL_BUILT_MODULE := $(call executable-path,$(LOCAL_MODULE))$(HOST_EXEEXT)
-LOCAL_CC ?= $(CC)
+LOCAL_BUILT_MODULE := $(call local-executable-path,$(LOCAL_MODULE))
 include $(BUILD_SYSTEM)/binary.make
 
-LOCAL_LIBRARIES := $(foreach lib,$(LOCAL_STATIC_LIBRARIES),$(call library-path,$(lib)))
+LOCAL_LIBRARIES := $(foreach lib,$(LOCAL_STATIC_LIBRARIES),$(call local-library-path,$(lib)))
 
 LOCAL_LDLIBS := \
-    $(foreach lib,$(LOCAL_STATIC_LIBRARIES),$(call library-path,$(lib))) \
-    $(foreach lib,$(LOCAL_SHARED_LIBRARIES),$(call shared-library-path,$(lib))) \
+    $(foreach lib,$(LOCAL_STATIC_LIBRARIES),$(call local-library-path,$(lib))) \
+    $(foreach lib,$(LOCAL_SHARED_LIBRARIES),$(call local-shared-library-path,$(lib))) \
     $(LOCAL_LDLIBS)
 
 $(LOCAL_BUILT_MODULE): PRIVATE_LDFLAGS := $(LDFLAGS) $(LOCAL_LDFLAGS)
 $(LOCAL_BUILT_MODULE): PRIVATE_LDLIBS  := $(LOCAL_LDLIBS)
+$(LOCAL_BUILT_MODULE): PRIVATE_LD      := $(LOCAL_LD)
 $(LOCAL_BUILT_MODULE): PRIVATE_OBJS    := $(LOCAL_OBJECTS)
 
 $(LOCAL_BUILT_MODULE): $(LOCAL_OBJECTS) $(LOCAL_LIBRARIES)
 	@ mkdir -p $(dir $@)
 	@ echo "Executable: $@"
-	$(hide) $(LD) $(PRIVATE_LDFLAGS) -o $@ $(PRIVATE_LIBRARY) $(PRIVATE_OBJS) $(PRIVATE_LDLIBS)
+	$(hide) $(PRIVATE_LD) $(PRIVATE_LDFLAGS) -o $@ $(PRIVATE_LIBRARY) $(PRIVATE_OBJS) $(PRIVATE_LDLIBS)
 
 EXECUTABLES += $(LOCAL_BUILT_MODULE)
-$(LOCAL_BUILT_MODULE): $(foreach lib,$(LOCAL_STATIC_LIBRARIES),$(call library-path,$(lib)))
-$(LOCAL_BUILT_MODULE): $(foreach lib,$(LOCAL_SHARED_LIBRARIES),$(call shared-library-path,$(lib)))
-
+$(LOCAL_BUILT_MODULE): $(foreach lib,$(LOCAL_STATIC_LIBRARIES),$(call local-library-path,$(lib)))
+$(LOCAL_BUILT_MODULE): $(foreach lib,$(LOCAL_SHARED_LIBRARIES),$(call local-shared-library-path,$(lib)))
diff --git a/android/build/host_shared_library.make b/android/build/host_shared_library.make
index 7ce2e9a..911be8e 100644
--- a/android/build/host_shared_library.make
+++ b/android/build/host_shared_library.make
@@ -14,13 +14,12 @@
 #
 
 # first, call a library containing all object files
-LOCAL_BUILT_MODULE := $(call shared-library-path,$(LOCAL_MODULE))$(HOST_DLLEXT)
-LOCAL_CC ?= $(CC)
+LOCAL_BUILT_MODULE := $(call local-shared-library-path,$(LOCAL_MODULE))
 include $(BUILD_SYSTEM)/binary.make
 
-LOCAL_LIBRARIES := $(foreach lib,$(LOCAL_STATIC_LIBRARIES),$(call library-path,$(lib)))
+LOCAL_LIBRARIES := $(foreach lib,$(LOCAL_STATIC_LIBRARIES),$(call local-library-path,$(lib)))
 
-LOCAL_LDLIBS := $(foreach lib,$(LOCAL_STATIC_LIBRARIES),$(call library-path,$(lib))) $(LOCAL_LDLIBS)
+LOCAL_LDLIBS := $(foreach lib,$(LOCAL_STATIC_LIBRARIES),$(call local-library-path,$(lib))) $(LOCAL_LDLIBS)
 
 $(LOCAL_BUILT_MODULE): PRIVATE_LDFLAGS := $(LDFLAGS) $(LOCAL_LDFLAGS)
 $(LOCAL_BUILT_MODULE): PRIVATE_LDLIBS  := $(LOCAL_LDLIBS)
@@ -32,6 +31,6 @@
 	$(hide) $(LD) $(PRIVATE_LDFLAGS) -shared -o $@ $(PRIVATE_LIBRARY) $(PRIVATE_OBJS) $(PRIVATE_LDLIBS)
 
 EXECUTABLES += $(LOCAL_BUILT_MODULE)
-$(LOCAL_BUILT_MODULE): $(foreach lib,$(LOCAL_STATIC_LIBRARIES),$(call library-path,$(lib)))
-$(LOCAL_BUILT_MODULE): $(foreach lib,$(LOCAL_SHARED_LIBRARIES),$(call shared-library-path,$(lib)))
+$(LOCAL_BUILT_MODULE): $(foreach lib,$(LOCAL_STATIC_LIBRARIES),$(call local-library-path,$(lib)))
+$(LOCAL_BUILT_MODULE): $(foreach lib,$(LOCAL_SHARED_LIBRARIES),$(call local-shared-library-path,$(lib)))
 
diff --git a/android/build/host_static_library.make b/android/build/host_static_library.make
index 38ff625..b02fda7 100644
--- a/android/build/host_static_library.make
+++ b/android/build/host_static_library.make
@@ -18,13 +18,13 @@
 #
 
 #$(info STATIC_LIBRARY SRCS=$(LOCAL_SRC_FILES))
-LOCAL_BUILT_MODULE := $(call library-path,$(LOCAL_MODULE))
-LOCAL_CC ?= $(CC)
+LOCAL_BUILT_MODULE := $(call local-library-path,$(LOCAL_MODULE))
+LOCAL_CC ?= $(call local-host-tool,CC)
 include $(BUILD_SYSTEM)/binary.make
 
 LOCAL_AR := $(strip $(LOCAL_AR))
 ifndef LOCAL_AR
-    LOCAL_AR := $(AR)
+    LOCAL_AR := $(call local-host-tool,AR)
 endif
 ARFLAGS := crs
 
diff --git a/distrib/googletest/Android.mk b/distrib/googletest/Android.mk
index e6a7d29..151a3b3 100644
--- a/distrib/googletest/Android.mk
+++ b/distrib/googletest/Android.mk
@@ -10,6 +10,7 @@
 ###  Android.mk there, define a module here instead.
 
 EMULATOR_GTEST_SOURCES_DIR ?= $(LOCAL_PATH)/../gtest
+EMULATOR_GTEST_SOURCES_DIR := $(EMULATOR_GTEST_SOURCES_DIR)
 ifeq (,$(strip $(wildcard $(EMULATOR_GTEST_SOURCES_DIR))))
     $(error Cannot find GoogleTest sources directory: $(EMULATOR_GTEST_SOURCES_DIR))
 endif
diff --git a/distrib/package-release.sh b/distrib/package-release.sh
index 1df4c68..ac62573 100755
--- a/distrib/package-release.sh
+++ b/distrib/package-release.sh
@@ -146,7 +146,8 @@
   dump "Retrieving Darwin binaries from: $HOST"
   rm -rf objs/*
   run scp $HOST:$DST_DIR/$PKG_FILE_PREFIX/qemu/objs/emulator* objs/
-  # TODO(digit): Retrieve GPU emulation libraries + PC Bios files.
+  run scp -r $HOST:$DST_DIR/$PKG_FILE_PREFIX/qemu/objs/lib objs/lib
+  # TODO(digit): Retrieve PC BIOS files.
   run ssh $HOST rm -rf $DST_DIR/$PKG_FILE_PREFIX
 }
 
@@ -353,6 +354,12 @@
 fi
 log "Found GoogleTest directory: $GTEST_DIR"
 
+EMUGL_DIR=$QEMU_DIR/../../sdk/emulator/opengl
+if [ ! -d "$EMUGL_DIR" ]; then
+  panic "Cannot find GPU emulation source directory: $EMUGL_DIR"
+fi
+log "Found GPU emulation directory: $EMUGL_DIR"
+
 SOURCES_PKG_FILE=
 if [ "$OPT_SOURCES" ]; then
     BUILD_DIR=$TEMP_BUILD_DIR/sources/$PKG_PREFIX-$PKG_REVISION
@@ -363,6 +370,9 @@
     dump "[$PKG_NAME] Copying Emulator source files."
     copy_directory_git_files "$QEMU_DIR" "$BUILD_DIR"/qemu
 
+    dump "[$PKG_NAME] Copying GPU emulation library sources."
+    copy_directory_git_files "$EMUGL_DIR" "$BUILD_DIR"/opengl
+
     dump "[$PKG_NAME] Generating README file."
     cat > "$BUILD_DIR"/README <<EOF
 This directory contains the sources of the Android emulator.
diff --git a/distrib/sdl-1.2.15/sources.make b/distrib/sdl-1.2.15/sources.make
index b44b86d..76e57f8 100644
--- a/distrib/sdl-1.2.15/sources.make
+++ b/distrib/sdl-1.2.15/sources.make
@@ -51,8 +51,17 @@
     SDL_CONFIG_MAIN_MACOSX := yes
 
     SDL_CFLAGS += -D_GNU_SOURCE=1 -DTHREAD_SAFE
-    FRAMEWORKS := OpenGL Cocoa QuickTime ApplicationServices Carbon IOKit
+    FRAMEWORKS := OpenGL Cocoa ApplicationServices Carbon IOKit
     SDL_LDLIBS += $(FRAMEWORKS:%=-Wl,-framework,%)
+
+    # SDK 10.6+ deprecates __dyld_func_lookup required by dlcompat_init_func
+    # in SDL_dlcompat.o this module depends.  Instruct linker to resolve it
+    # at runtime.
+    OSX_VERSION_MAJOR := $(shell echo $(mac_sdk_version) | cut -d . -f 2)
+    OSX_VERSION_MAJOR_GREATER_THAN_OR_EQUAL_TO_6 := $(shell [ $(OSX_VERSION_MAJOR) -ge 6 ] && echo true)
+    ifeq ($(OSX_VERSION_MAJOR_GREATER_THAN_OR_EQUAL_TO_6),true)
+        LOCAL_LDLIBS += -Wl,-undefined,dynamic_lookup
+    endif
 endif
 
 ifeq ($(HOST_OS),windows)