From e762d85c823adfefc27ba6128c7b997aa50166ce Mon Sep 17 00:00:00 2001
From: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
Date: Wed, 15 Nov 2017 15:05:01 +0100
Subject: [PATCH] native_bindir

Some libraries, like QT, have pre-processors that convert their input
files into something that the cross-compiler can process. We find the
path of those pre-processors via pkg-config-native instead of
pkg-config.

This path forces the use of pkg-config-native for host_bins arguments.

There are some discussions upstream to merge this patch, but I presonaly believe
that is is OE only. https://github.com/mesonbuild/meson/issues/1849#issuecomment-303730323

Upstream-Status: Inappropriate [OE specific]
Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>

---
 mesonbuild/dependencies/base.py | 19 +++++++++++--------
 mesonbuild/dependencies/ui.py   |  6 +++---
 2 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py
index 6d3678f..90fdb80 100644
--- a/mesonbuild/dependencies/base.py
+++ b/mesonbuild/dependencies/base.py
@@ -146,7 +146,7 @@ class Dependency:
     def need_threads(self):
         return False
 
-    def get_pkgconfig_variable(self, variable_name, kwargs):
+    def get_pkgconfig_variable(self, variable_name, kwargs, use_native=False):
         raise DependencyException('{!r} is not a pkgconfig dependency'.format(self.name))
 
     def get_configtool_variable(self, variable_name):
@@ -183,7 +183,7 @@ class InternalDependency(Dependency):
         self.sources = sources
         self.ext_deps = ext_deps
 
-    def get_pkgconfig_variable(self, variable_name, kwargs):
+    def get_pkgconfig_variable(self, variable_name, kwargs, use_native=False):
         raise DependencyException('Method "get_pkgconfig_variable()" is '
                                   'invalid for an internal dependency')
 
@@ -523,15 +523,18 @@ class PkgConfigDependency(ExternalDependency):
         return s.format(self.__class__.__name__, self.name, self.is_found,
                         self.version_reqs)
 
-    def _call_pkgbin_real(self, args, env):
-        cmd = self.pkgbin.get_command() + args
+    def _call_pkgbin_real(self, args, env, use_native=False):
+        if use_native:
+            cmd = self.pkgbin.get_command() + "-native" + args
+        else:
+            cmd = self.pkgbin.get_command() + args
         p, out = Popen_safe(cmd, env=env)[0:2]
         rc, out = p.returncode, out.strip()
         call = ' '.join(cmd)
         mlog.debug("Called `{}` -> {}\n{}".format(call, rc, out))
         return rc, out
 
-    def _call_pkgbin(self, args, env=None):
+    def _call_pkgbin(self, args, env=None, use_native=False):
         if env is None:
             fenv = env
             env = os.environ
@@ -540,7 +543,7 @@ class PkgConfigDependency(ExternalDependency):
         targs = tuple(args)
         cache = PkgConfigDependency.pkgbin_cache
         if (self.pkgbin, targs, fenv) not in cache:
-            cache[(self.pkgbin, targs, fenv)] = self._call_pkgbin_real(args, env)
+            cache[(self.pkgbin, targs, fenv)] = self._call_pkgbin_real(args, env, use_native)
         return cache[(self.pkgbin, targs, fenv)]
 
     def _convert_mingw_paths(self, args):
@@ -718,7 +721,7 @@ class PkgConfigDependency(ExternalDependency):
                                       (self.name, out_raw))
         self.link_args, self.raw_link_args = self._search_libs(out, out_raw)
 
-    def get_pkgconfig_variable(self, variable_name, kwargs):
+    def get_pkgconfig_variable(self, variable_name, kwargs, use_native=False):
         options = ['--variable=' + variable_name, self.name]
 
         if 'define_variable' in kwargs:
@@ -731,7 +734,7 @@ class PkgConfigDependency(ExternalDependency):
 
             options = ['--define-variable=' + '='.join(definition)] + options
 
-        ret, out = self._call_pkgbin(options)
+        ret, out = self._call_pkgbin(options, use_native=use_native)
         variable = ''
         if ret != 0:
             if self.required:
diff --git a/mesonbuild/dependencies/ui.py b/mesonbuild/dependencies/ui.py
index 197d22c..c683d21 100644
--- a/mesonbuild/dependencies/ui.py
+++ b/mesonbuild/dependencies/ui.py
@@ -285,7 +285,7 @@ class QtBaseDependency(ExternalDependency):
         self.bindir = self.get_pkgconfig_host_bins(core)
         if not self.bindir:
             # If exec_prefix is not defined, the pkg-config file is broken
-            prefix = core.get_pkgconfig_variable('exec_prefix', {})
+            prefix = core.get_pkgconfig_variable('exec_prefix', {}, use_native=True)
             if prefix:
                 self.bindir = os.path.join(prefix, 'bin')
 
@@ -427,7 +427,7 @@ class Qt4Dependency(QtBaseDependency):
         applications = ['moc', 'uic', 'rcc', 'lupdate', 'lrelease']
         for application in applications:
             try:
-                return os.path.dirname(core.get_pkgconfig_variable('%s_location' % application, {}))
+                return os.path.dirname(core.get_pkgconfig_variable('%s_location' % application, {}, use_native=True))
             except MesonException:
                 pass
 
@@ -437,7 +437,7 @@ class Qt5Dependency(QtBaseDependency):
         QtBaseDependency.__init__(self, 'qt5', env, kwargs)
 
     def get_pkgconfig_host_bins(self, core):
-        return core.get_pkgconfig_variable('host_bins', {})
+        return core.get_pkgconfig_variable('host_bins', {}, use_native=True)
 
     def get_private_includes(self, mod_inc_dir, module):
         return _qt_get_private_includes(mod_inc_dir, module, self.version)
