From c434884af121faf9c172dc660e61e384539cd003 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Tue, 22 Sep 2015 09:01:28 +1000 Subject: Fix pkgconfig for MSYS to allow QEMU to build. --- source-builder/config/qemu-1-1.cfg | 5 +++ source-builder/sb/pkgconfig.py | 62 +++++++++++++++++++++++++------------- 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/source-builder/config/qemu-1-1.cfg b/source-builder/config/qemu-1-1.cfg index 8be7ea4..c19419f 100644 --- a/source-builder/config/qemu-1-1.cfg +++ b/source-builder/config/qemu-1-1.cfg @@ -65,6 +65,11 @@ BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n) # # The --extra-cflags and --extra-ldflags do not work as expected. # + # Hack warning: MSYS2 does not seem to convert the path to + # a shell path from Windows so we keep them + # separate and handle it in the pkgconfig tool. + # + PKG_CONFIG_DEFAULT_PATH=${PKG_CONFIG_PATH} \ PKG_CONFIG_PATH=$SYSROOT/lib/pkgconfig \ PKG_CONFIG_BUILD_TOP_DIR=$SB_TMPROOT \ %{_ld_library_path}=$SYSROOT/lib \ diff --git a/source-builder/sb/pkgconfig.py b/source-builder/sb/pkgconfig.py index 1299178..0a9c87d 100755 --- a/source-builder/sb/pkgconfig.py +++ b/source-builder/sb/pkgconfig.py @@ -41,16 +41,32 @@ import re import shlex import sys +import path + def default_prefix(common = True): paths = [] + # + # We have two paths to work around an issue in MSYS2 and the + # conversion of Windows paths to shell paths. + # + if 'PKG_CONFIG_DEFAULT_PATH' in os.environ: + for p in os.environ['PKG_CONFIG_DEFAULT_PATH'].split(os.pathsep): + paths += [path.shell(p)] if 'PKG_CONFIG_PATH' in os.environ: - paths += os.environ['PKG_CONFIG_PATH'].split(':') + for p in os.environ['PKG_CONFIG_PATH'].split(os.pathsep): + paths += [path.shell(p)] if common: - defaults = ['/usr', '/usr/share', '/lib', '/lib64', '/usr/lib', '/usr/lib64', '/usr/local'] + defaults = ['/usr', + '/usr/share', + '/lib', + '/lib64', + '/usr/lib', + '/usr/lib64', + '/usr/local'] for d in defaults: for cp in package.config_prefixes: - prefix = os.path.join(d, cp, 'pkgconfig') - if os.path.exists(prefix): + prefix = path.join(d, cp, 'pkgconfig') + if path.exists(prefix): paths += [prefix] return paths @@ -64,7 +80,9 @@ class error(Exception): class package(object): node_types = ['requires', 'requires.private'] - node_type_labels = { 'requires': 'r', 'requires.private': 'rp', 'failed': 'F' } + node_type_labels = { 'requires': 'r', + 'requires.private': 'rp', + 'failed': 'F' } version_ops = ['=', '<', '>', '<=', '>=', '!='] config_prefixes = ['lib', 'libdata'] get_recursion = ['cflags', 'libs'] @@ -180,7 +198,8 @@ class package(object): for n in sorted(package.loaded): print package.loaded[n]._str() - def __init__(self, name = None, prefix = None, libs_scan = False, output = None, src = None): + def __init__(self, name = None, prefix = None, + libs_scan = False, output = None, src = None): self._clean() self.name_ = name self.libs_scan = libs_scan @@ -191,14 +210,16 @@ class package(object): if prefix is None: prefix = default_prefix() if prefix: + self._log('prefix: %s' % (prefix)) if type(prefix) is str: - self.prefix = prefix.split(os.pathsep) + for p in prefix.split(os.pathsep): + self.prefix += [path.shell(p)] elif type(prefix) is list: self.prefix = prefix else: raise error('invalid type of prefix: %s' % (type(prefix))) for p in self.prefix: - if os.path.exists(p): + if path.exists(p): self.paths += [p] self._log('paths: %s' % (', '.join(self.paths))) if 'sysroot' in self.defines: @@ -264,9 +285,9 @@ class package(object): def _find_package(self, name): if len(self.paths): - for path in self.paths: - pc = os.path.join(path, '%s.pc' % (name)) - if os.path.isfile(pc): + for p in self.paths: + pc = path.join(p, '%s.pc' % (name)) + if path.isfile(pc): return pc; return None @@ -274,11 +295,11 @@ class package(object): libraries = [] if self.libs_scan: for prefix in self.prefix: - prefix = os.path.join(prefix, 'lib') - if os.path.exists(prefix): - for l in os.listdir(prefix): + prefix = path.join(prefix, 'lib') + if path.exists(prefix): + for l in os.listdir(path.host(prefix)): if l.startswith(name + '.'): - libraries += [os.path.join(prefix, l)] + libraries += [path.join(prefix, l)] break return libraries @@ -305,9 +326,9 @@ class package(object): if dash < 0: break if offset + dash + 2 < len(s) and s[offset + dash + 1] in 'LI': - path = s[offset + dash + 2:] - if not path.startswith(top_builddir): - s = s[:offset + dash + 2] + top_builddir + path + p = s[offset + dash + 2:] + if not p.startswith(top_builddir): + s = s[:offset + dash + 2] + top_builddir + p offset += dash + 1 return s @@ -372,7 +393,7 @@ class package(object): file = self.file_ if file is None: return None - name = os.path.basename(file) + name = path.basename(file) if name.endswith('.pc'): name = name[:-3] return name @@ -406,7 +427,7 @@ class package(object): self.src('==%s%s' % ('=' * 80, os.linesep)) self.src(' %s %s%s' % (file, '=' * (80 - len(file)), os.linesep)) self.src('==%s%s' % ('=' * 80, os.linesep)) - f = open(file) + f = open(path.host(file)) tm = False for l in f.readlines(): if self.src: @@ -558,4 +579,3 @@ def check_package(libraries, args, output, src): if ec > 0: break return ec, pkg, flags - -- cgit v1.2.3