From 9529fdce0bd5516f86de1cb18aa6d18a66317ba5 Mon Sep 17 00:00:00 2001
From: Martin Jansa <Martin.Jansa@gmail.com>
Date: Sat, 6 Apr 2013 13:15:07 +0200
Subject: [PATCH 03/10] Add -external-hostbindir option

* when cross-compiling it's sometimes useful to use existing tools from machine
  (or in OpenEmbedded built with separate native recipe) when building for target

* this way we can skip bootstraping tools we already have

* qt_functions: temporary remove isEmpty check
* now we assume that every build will provide QT_EXTERNAL_HOST_BINS value
* isEmpty works correctly only with qmake variables (e.g. $$FOO -
  isEmpty(FOO)), but doesn't work with system properties like $$[FOO].

* cmake: Use OE_QMAKE_PATH_EXTERNAL_HOST_BINS to determine path to host binaries

Upstream-Status: Pending
  is a lot better for upstreaming (and it was already sort of approved by
  Oswald) but in 5.2.0 I've noticed that he added something similar for
  android builds

Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
Signed-off-by: Simon Busch <morphis@gravedo.de>
Signed-off-by: Jonathan Liu <net147@gmail.com>

Conflicts:
        configure
---
 configure                                   | 14 ++++++++++++++
 mkspecs/features/qt_functions.prf           |  6 +++++-
 mkspecs/features/qt_tool.prf                |  4 ++--
 qtbase.pro                                  | 13 ++++++++++---
 src/corelib/Qt5CoreConfigExtras.cmake.in    |  6 +++---
 src/dbus/Qt5DBusConfigExtras.cmake.in       |  4 ++--
 src/widgets/Qt5WidgetsConfigExtras.cmake.in |  2 +-
 7 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/configure b/configure
index e1929e7..a757ce5 100755
--- a/configure
+++ b/configure
@@ -809,6 +809,7 @@ QT_HOST_BINS=
 QT_HOST_LIBS=
 QT_HOST_DATA=
 QT_EXT_PREFIX=
+QT_EXTERNAL_HOST_BINS=
 
 #flags for SQL drivers
 QT_CFLAGS_PSQL=
@@ -928,6 +929,7 @@ while [ "$#" -gt 0 ]; do
     -testsdir| \
     -hostdatadir| \
     -hostbindir| \
+    -external-hostbindir| \
     -hostlibdir| \
     -extprefix| \
     -sysroot| \
@@ -1157,6 +1159,9 @@ while [ "$#" -gt 0 ]; do
     extprefix)
         QT_EXT_PREFIX="$VAL"
         ;;
+    external-hostbindir)
+        QT_EXTERNAL_HOST_BINS="$VAL"
+        ;;
     pkg-config)
         if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
             CFG_PKGCONFIG="$VAL"
@@ -2383,6 +2388,10 @@ Installation options:
     -hostdatadir <dir> . Data used by qmake will be installed to <dir>
                          (default HOSTPREFIX)
 
+    -external-hostbindir <dir> Use external host executables instead of building them
+                         (not used by defaut)
+
+
 Configure options:
 
  The defaults (*) are usually acceptable. A plus (+) denotes a default value
@@ -3110,6 +3119,11 @@ fi
 # command line and environment validation
 #-------------------------------------------------------------------------------
 
+# default is empty, don't call makeabs if it is empty
+if [ ! -z "$QT_EXTERNAL_HOST_BINS" ]; then
+    QT_EXTERNAL_HOST_BINS=`"$relpath/config.tests/unix/makeabs" "$QT_EXTERNAL_HOST_BINS"`
+fi
+
 # update QT_CONFIG to show our current predefined configuration
 CFG_QCONFIG_PATH=$relpath/src/corelib/global/qconfig-${CFG_QCONFIG}.h
 case "$CFG_QCONFIG" in
diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf
index a1c4996..fca679c 100644
--- a/mkspecs/features/qt_functions.prf
+++ b/mkspecs/features/qt_functions.prf
@@ -198,7 +198,11 @@ defineTest(qtAddRpathLink) {
 defineTest(qtPrepareTool) {
     cmd = $$eval(QT_TOOL.$${2}.binary)
     isEmpty(cmd) {
-        cmd = $$[QT_HOST_BINS]/$$2
+        QT_EXTERNAL_HOST_BINS = $$[QT_EXTERNAL_HOST_BINS]
+        isEmpty(QT_EXTERNAL_HOST_BINS): \
+            cmd = $$[QT_HOST_BINS]/$$2
+        else: \
+            cmd = $$[QT_EXTERNAL_HOST_BINS]/$$2
         exists($${cmd}.pl) {
             cmd = perl -w $$system_path($${cmd}.pl)
         } else: contains(QMAKE_HOST.os, Windows) {
diff --git a/mkspecs/features/qt_tool.prf b/mkspecs/features/qt_tool.prf
index 1d3e88c..9b26adf 100644
--- a/mkspecs/features/qt_tool.prf
+++ b/mkspecs/features/qt_tool.prf
@@ -12,11 +12,11 @@
 load(qt_app)
 
 CONFIG += console
+QT_EXTERNAL_HOST_BINS = $$[QT_EXTERNAL_HOST_BINS]
 
 # If we are doing a prefix build, create a "module" pri which enables
 # qtPrepareTool() to work with the non-installed build.
-# Non-bootstrapped tools always need this because of the environment setup.
-!build_pass:if(!host_build|!force_bootstrap|force_independent) {
+!build_pass:if(!host_build|!force_bootstrap|force_independent):isEmpty(QT_EXTERNAL_HOST_BINS) {
     isEmpty(MODULE):MODULE = $$TARGET
 
     !host_build|!force_bootstrap: MODULE_DEPENDS = $$replace(QT, -private$, _private)
diff --git a/qtbase.pro b/qtbase.pro
index 24d0f52..d3d79b3 100644
--- a/qtbase.pro
+++ b/qtbase.pro
@@ -37,12 +37,16 @@ CONFIG -= qt
 
 ### installations ####
 
+QT_EXTERNAL_HOST_BINS = $$[QT_EXTERNAL_HOST_BINS]
+
 #qmake
 qmake.path = $$[QT_HOST_BINS]
+qmake.files = $$OUT_PWD/bin/qmake
+!isEmpty(QT_EXTERNAL_HOST_BINS) {
+   qmake.files = $$[QT_EXTERNAL_HOST_BINS]/qmake
+}
 equals(QMAKE_HOST.os, Windows) {
-   qmake.files = $$OUT_PWD/bin/qmake.exe
-} else {
-   qmake.files = $$OUT_PWD/bin/qmake
+   qmake.files = $${qmake.files}.exe
 }
 INSTALLS += qmake
 
@@ -54,6 +58,9 @@ licheck.files = $$PWD/bin/$$QT_LICHECK
 #syncqt
 syncqt.path = $$[QT_HOST_BINS]
 syncqt.files = $$PWD/bin/syncqt.pl
+!isEmpty(QT_EXTERNAL_HOST_BINS) {
+   syncqt.files = $$[QT_EXTERNAL_HOST_BINS]/syncqt.pl
+}
 INSTALLS += syncqt
 
 # If we are doing a prefix build, create a "module" pri which enables
diff --git a/src/corelib/Qt5CoreConfigExtras.cmake.in b/src/corelib/Qt5CoreConfigExtras.cmake.in
index 65fd1f9..457518b 100644
--- a/src/corelib/Qt5CoreConfigExtras.cmake.in
+++ b/src/corelib/Qt5CoreConfigExtras.cmake.in
@@ -5,7 +5,7 @@ if (NOT TARGET Qt5::qmake)
 !!IF isEmpty(CMAKE_BIN_DIR_IS_ABSOLUTE)
     set(imported_location \"${_qt5Core_install_prefix}/$${CMAKE_BIN_DIR}qmake$$CMAKE_BIN_SUFFIX\")
 !!ELSE
-    set(imported_location \"$${CMAKE_BIN_DIR}qmake$$CMAKE_BIN_SUFFIX\")
+    set(imported_location \"${OE_QMAKE_PATH_EXTERNAL_HOST_BINS}/qmake$$CMAKE_BIN_SUFFIX\")
 !!ENDIF
     _qt5_Core_check_file_exists(${imported_location})
 
@@ -20,7 +20,7 @@ if (NOT TARGET Qt5::moc)
 !!IF isEmpty(CMAKE_BIN_DIR_IS_ABSOLUTE)
     set(imported_location \"${_qt5Core_install_prefix}/$${CMAKE_BIN_DIR}moc$$CMAKE_BIN_SUFFIX\")
 !!ELSE
-    set(imported_location \"$${CMAKE_BIN_DIR}moc$$CMAKE_BIN_SUFFIX\")
+    set(imported_location \"${OE_QMAKE_PATH_EXTERNAL_HOST_BINS}/moc$$CMAKE_BIN_SUFFIX\")
 !!ENDIF
     _qt5_Core_check_file_exists(${imported_location})
 
@@ -37,7 +37,7 @@ if (NOT TARGET Qt5::rcc)
 !!IF isEmpty(CMAKE_BIN_DIR_IS_ABSOLUTE)
     set(imported_location \"${_qt5Core_install_prefix}/$${CMAKE_BIN_DIR}rcc$$CMAKE_BIN_SUFFIX\")
 !!ELSE
-    set(imported_location \"$${CMAKE_BIN_DIR}rcc$$CMAKE_BIN_SUFFIX\")
+    set(imported_location \"${OE_QMAKE_PATH_EXTERNAL_HOST_BINS}/rcc$$CMAKE_BIN_SUFFIX\")
 !!ENDIF
     _qt5_Core_check_file_exists(${imported_location})
 
diff --git a/src/dbus/Qt5DBusConfigExtras.cmake.in b/src/dbus/Qt5DBusConfigExtras.cmake.in
index 1d94715..301af8f 100644
--- a/src/dbus/Qt5DBusConfigExtras.cmake.in
+++ b/src/dbus/Qt5DBusConfigExtras.cmake.in
@@ -5,7 +5,7 @@ if (NOT TARGET Qt5::qdbuscpp2xml)
 !!IF isEmpty(CMAKE_BIN_DIR_IS_ABSOLUTE)
     set(imported_location \"${_qt5DBus_install_prefix}/$${CMAKE_BIN_DIR}qdbuscpp2xml$$CMAKE_BIN_SUFFIX\")
 !!ELSE
-    set(imported_location \"$${CMAKE_BIN_DIR}qdbuscpp2xml$$CMAKE_BIN_SUFFIX\")
+    set(imported_location \"${OE_QMAKE_PATH_EXTERNAL_HOST_BINS}/qdbuscpp2xml$$CMAKE_BIN_SUFFIX\")
 !!ENDIF
     _qt5_DBus_check_file_exists(${imported_location})
 
@@ -20,7 +20,7 @@ if (NOT TARGET Qt5::qdbusxml2cpp)
 !!IF isEmpty(CMAKE_BIN_DIR_IS_ABSOLUTE)
     set(imported_location \"${_qt5DBus_install_prefix}/$${CMAKE_BIN_DIR}qdbusxml2cpp$$CMAKE_BIN_SUFFIX\")
 !!ELSE
-    set(imported_location \"$${CMAKE_BIN_DIR}qdbusxml2cpp$$CMAKE_BIN_SUFFIX\")
+    set(imported_location \"${OE_QMAKE_PATH_EXTERNAL_HOST_BINS}/qdbusxml2cpp$$CMAKE_BIN_SUFFIX\")
 !!ENDIF
     _qt5_DBus_check_file_exists(${imported_location})
 
diff --git a/src/widgets/Qt5WidgetsConfigExtras.cmake.in b/src/widgets/Qt5WidgetsConfigExtras.cmake.in
index 99d87e2..5621dc0 100644
--- a/src/widgets/Qt5WidgetsConfigExtras.cmake.in
+++ b/src/widgets/Qt5WidgetsConfigExtras.cmake.in
@@ -5,7 +5,7 @@ if (NOT TARGET Qt5::uic)
 !!IF isEmpty(CMAKE_BIN_DIR_IS_ABSOLUTE)
     set(imported_location \"${_qt5Widgets_install_prefix}/$${CMAKE_BIN_DIR}uic$$CMAKE_BIN_SUFFIX\")
 !!ELSE
-    set(imported_location \"$${CMAKE_BIN_DIR}uic$$CMAKE_BIN_SUFFIX\")
+    set(imported_location \"${OE_QMAKE_PATH_EXTERNAL_HOST_BINS}/uic$$CMAKE_BIN_SUFFIX\")
 !!ENDIF
     _qt5_Widgets_check_file_exists(${imported_location})
 
-- 
2.6.1

