From f06c89939d0d006090a8a8728b2a13d532b83047 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 368a4bc..9fc398e 100644
--- a/mesonbuild/dependencies/base.py
+++ b/mesonbuild/dependencies/base.py
@@ -183,7 +183,7 @@ class Dependency:
     def get_exe_args(self, compiler):
         return []

-    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):
@@ -261,7 +261,7 @@ class InternalDependency(Dependency):
                 setattr(result, k, copy.deepcopy(v, memo))
         return result

-    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')

@@ -634,15 +634,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()[0] + "-native"] + args
+        else:
+            cmd = self.pkgbin.get_command() + args
         p, out, err = Popen_safe(cmd, env=env)
         rc, out, err = p.returncode, out.strip(), err.strip()
         call = ' '.join(cmd)
         mlog.debug("Called `{}` -> {}\n{}".format(call, rc, out))
         return rc, out, err

-    def _call_pkgbin(self, args, env=None):
+    def _call_pkgbin(self, args, env=None, use_native=False):
         # Always copy the environment since we're going to modify it
         # with pkg-config variables
         if env is None:
@@ -668,7 +671,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: T.List[str]) -> T.List[str]:
@@ -877,7 +880,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:
@@ -890,7 +893,7 @@ class PkgConfigDependency(ExternalDependency):

             options = ['--define-variable=' + '='.join(definition)] + options

-        ret, out, err = self._call_pkgbin(options)
+        ret, out, err = 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 95dfe2b..5f82890 100644
--- a/mesonbuild/dependencies/ui.py
+++ b/mesonbuild/dependencies/ui.py
@@ -325,7 +325,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')

@@ -528,7 +528,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

@@ -538,7 +538,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)
