From d502c6e9d09803dd268100f8c53cf7bc563e3d1d Mon Sep 17 00:00:00 2001
From: Michal Klocek <michal.klocek@qt.io>
Date: Fri, 15 Dec 2017 17:52:47 +0100
Subject: [PATCH] Add pkg-host wrapper script

Currently we need pkg-config host for cross-builds to build
build tools. Unfortunately if build environment exports
PKG_CONFIG_* variables pkg-config will pick them up also for host builds,
which can lead to compile errors. Create pkg-config-host_wrapper
which explicitly unsets PKG_CONFIG_* variables.

This is a temporary workaround till proper solution is implemented
in qtbase.

Task-number: QTBUG-65079
Change-Id: I9aff4a27ba62e096ed4c023cf022a41833260178
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
---
 configure.json                 | 18 ++++++++++++++++++
 configure.pri                  | 14 ++++++++++++++
 mkspecs/features/configure.prf |  6 ++++++
 mkspecs/features/functions.prf | 15 +++++++++++++++
 src/core/config/linux.pri      |  9 ++++++++-
 5 files changed, 61 insertions(+), 1 deletion(-)

diff --git a/configure.json b/configure.json
index 7ef1f5003..fecd83ed4 100644
--- a/configure.json
+++ b/configure.json
@@ -223,6 +223,11 @@
             "type": "detectPython2",
             "log": "location"
         },
+        "webengine-host-pkg-config": {
+            "label": "host pkg-config",
+            "type": "detectHostPkgConfig",
+            "log": "path"
+        },
         "webengine-gperf": {
             "label": "gperf",
             "type": "detectGperf"
@@ -355,6 +360,14 @@
                 { "type": "varAssign", "name": "QMAKE_PYTHON2", "value": "tests.webengine-python2.location" }
             ]
         },
+        "webengine-host-pkg-config": {
+            "label": "host-pkg-config",
+            "condition": "config.unix && tests.webengine-host-pkg-config",
+            "output": [
+                "privateFeature",
+                { "type": "varAssign", "name": "QMAKE_PKG_CONFIG_HOST", "value": "tests.webengine-host-pkg-config.path" }
+            ]
+        },
         "webengine-gperf": {
             "label": "gperf",
             "condition": "tests.webengine-gperf",
@@ -566,6 +579,11 @@
             "type": "warning",
             "condition": "config.sanitizer && !tests.webengine-sanitizer && !features.webengine-sanitizer",
             "message": "Qt WebEngine cannot be built with the chosen sanitizer configuration. Check config.log for details or use -feature-webengine-sanitizer to force the build."
+        },
+        {
+            "type": "warning",
+            "condition": "config.unix && !features.webengine-host-pkg-config",
+            "message": "host pkg-config not found"
         }
     ],
 
diff --git a/configure.pri b/configure.pri
index 497557262..ecf2ce4d3 100644
--- a/configure.pri
+++ b/configure.pri
@@ -157,6 +157,20 @@ defineTest(qtConfTest_detectIcuuc) {
    return(false)
 }
 
+defineTest(qtConfTest_detectHostPkgConfig) {
+   PKG_CONFIG = $$qtConfPkgConfig(true)
+   isEmpty(PKG_CONFIG) {
+       qtLog("Could not find host pkg-config")
+       return(false)
+   }
+   qtLog("Found host pkg-config: $$PKG_CONFIG")
+   $${1}.path = $$PKG_CONFIG
+   export($${1}.path)
+   $${1}.cache += path
+   export($${1}.cache)
+   return(true)
+}
+
 defineTest(qtConfTest_isSanitizerSupported) {
   sanitizer_combo_supported = true
 
diff --git a/mkspecs/features/configure.prf b/mkspecs/features/configure.prf
index 8b8fd3efe..2c0908598 100644
--- a/mkspecs/features/configure.prf
+++ b/mkspecs/features/configure.prf
@@ -53,6 +53,12 @@ defineTest(runConfigure) {
     }
 
     linux {
+
+        !qtConfig(webengine-host-pkg-config) {
+            skipBuild("Host pkg-config is required")
+            return(false)
+        }
+
         !qtConfig(webengine-system-glibc) {
             skipBuild("A suitable version of libc could not be found. See: https://sourceware.org/bugzilla/show_bug.cgi?id=14898")
             return(false)
diff --git a/mkspecs/features/functions.prf b/mkspecs/features/functions.prf
index 3b9a400b1..8564bad8a 100644
--- a/mkspecs/features/functions.prf
+++ b/mkspecs/features/functions.prf
@@ -115,3 +115,18 @@ defineTest(skipBuild) {
     skipBuildReason = "$$skipBuildReason $${EOL}$$1"
     export(skipBuildReason)
 }
+
+defineReplace(pkgConfigHostExecutable) {
+    wrapper_name = $$OUT_PWD/pkg-config-host_wrapper.sh
+    wrapper_cmd = $$QMAKE_PKG_CONFIG_HOST
+    isEmpty(wrapper_cmd): wrapper_cmd = pkg-config
+    wrapper_content = \
+        "$$LITERAL_HASH!/bin/sh" \
+        "unset PKG_CONFIG_LIBDIR" \
+        "unset PKG_CONFIG_SYSROOT_DIR" \
+        "exec $$wrapper_cmd \"$@\""
+    !build_pass:!write_file($$wrapper_name, wrapper_content, exe): error()
+    QMAKE_DISTCLEAN += $$wrapper_name
+    export(QMAKE_DISTCLEAN)
+    return($$system_quote($$system_path($$wrapper_name)))
+}
diff --git a/src/core/config/linux.pri b/src/core/config/linux.pri
index 6f7b27f10..d337f686f 100644
--- a/src/core/config/linux.pri
+++ b/src/core/config/linux.pri
@@ -113,7 +113,14 @@ host_build {
         PKGCONFIG = $$first($$list($$pkgConfigExecutable()))
         gn_args += pkg_config=\"$$PKGCONFIG\"
         PKG_CONFIG_HOST = $$(GN_PKG_CONFIG_HOST)
-        isEmpty(PKG_CONFIG_HOST): PKG_CONFIG_HOST = pkg-config
+        pkgConfigLibDir = $$(PKG_CONFIG_LIBDIR)
+        pkgConfigSysrootDir = $$(PKG_CONFIG_SYSROOT_DIR)
+        isEmpty(PKG_CONFIG_HOST): PKG_CONFIG_HOST = $$QMAKE_PKG_CONFIG_HOST
+        cross_compile {
+            !isEmpty(pkgConfigLibDir)|!isEmpty(pkgConfigSysrootDir) {
+                PKG_CONFIG_HOST = $$pkgConfigHostExecutable()
+            }
+        }
         gn_args += host_pkg_config=\"$$PKG_CONFIG_HOST\"
     }
 
-- 
GitLab