diff options
Diffstat (limited to 'mesonbuild/modules/pkgconfig.py')
-rw-r--r-- | mesonbuild/modules/pkgconfig.py | 60 |
1 files changed, 38 insertions, 22 deletions
diff --git a/mesonbuild/modules/pkgconfig.py b/mesonbuild/modules/pkgconfig.py index da0a60e..cfdae4f 100644 --- a/mesonbuild/modules/pkgconfig.py +++ b/mesonbuild/modules/pkgconfig.py @@ -266,7 +266,7 @@ class PkgConfigModule(ExtensionModule): def generate_pkgconfig_file(self, state, deps, subdirs, name, description, url, version, pcfile, conflicts, variables, - uninstalled=False): + uninstalled=False, dataonly=False): deps.remove_dups() coredata = state.environment.get_coredata() if uninstalled: @@ -283,12 +283,13 @@ class PkgConfigModule(ExtensionModule): incdir = PurePath(coredata.get_builtin_option('includedir')) fname = os.path.join(outdir, pcfile) with open(fname, 'w', encoding='utf-8') as ofile: - ofile.write('prefix={}\n'.format(self._escape(prefix))) - if uninstalled: - ofile.write('srcdir={}\n'.format(self._escape(srcdir))) - else: - ofile.write('libdir={}\n'.format(self._escape('${prefix}' / libdir))) - ofile.write('includedir={}\n'.format(self._escape('${prefix}' / incdir))) + if not dataonly: + ofile.write('prefix={}\n'.format(self._escape(prefix))) + if uninstalled: + ofile.write('srcdir={}\n'.format(self._escape(srcdir))) + else: + ofile.write('libdir={}\n'.format(self._escape('${prefix}' / libdir))) + ofile.write('includedir={}\n'.format(self._escape('${prefix}' / incdir))) if variables: ofile.write('\n') for k, v in variables: @@ -370,27 +371,28 @@ class PkgConfigModule(ExtensionModule): ofile.write('Libs: {}\n'.format(' '.join(generate_libs_flags(deps.pub_libs)))) if len(deps.priv_libs) > 0: ofile.write('Libs.private: {}\n'.format(' '.join(generate_libs_flags(deps.priv_libs)))) + + def generate_compiler_flags(): + cflags_buf = [] + for f in deps.cflags: + cflags_buf.append(self._escape(f)) + return cflags_buf + + cflags = generate_compiler_flags() ofile.write('Cflags:') if uninstalled: ofile.write(' '.join(generate_uninstalled_cflags(deps.pub_libs + deps.priv_libs))) - else: - for h in subdirs: - ofile.write(' ') - if h == '.': - ofile.write('-I${includedir}') - else: - ofile.write(self._escape(PurePath('-I${includedir}') / h)) - for f in deps.cflags: - ofile.write(' ') - ofile.write(self._escape(f)) - ofile.write('\n') + elif not dataonly and cflags: + ofile.write('{}\n'.format(' '.join(cflags))) @FeatureNewKwargs('pkgconfig.generate', '0.54.0', ['uninstalled_variables']) @FeatureNewKwargs('pkgconfig.generate', '0.42.0', ['extra_cflags']) @FeatureNewKwargs('pkgconfig.generate', '0.41.0', ['variables']) + @FeatureNewKwargs('pkgconfig.generate', '0.54.0', ['dataonly']) @permittedKwargs({'libraries', 'version', 'name', 'description', 'filebase', 'subdirs', 'requires', 'requires_private', 'libraries_private', - 'install_dir', 'extra_cflags', 'variables', 'url', 'd_module_versions'}) + 'install_dir', 'extra_cflags', 'variables', 'url', 'd_module_versions', + 'dataonly'}) def generate(self, state, args, kwargs): if 'variables' in kwargs: FeatureNew('custom pkgconfig variables', '0.41.0').use(state.subproject) @@ -399,6 +401,7 @@ class PkgConfigModule(ExtensionModule): default_description = None default_name = None mainlib = None + default_subdirs = ['.'] if not args and 'version' not in kwargs: FeatureNew('pkgconfig.generate implicit version keyword', '0.46.0').use(state.subproject) elif len(args) == 1: @@ -414,7 +417,14 @@ class PkgConfigModule(ExtensionModule): elif len(args) > 1: raise mesonlib.MesonException('Too many positional arguments passed to Pkgconfig_gen.') - subdirs = mesonlib.stringlistify(kwargs.get('subdirs', ['.'])) + dataonly = kwargs.get('dataonly', False) + if dataonly: + default_subdirs = [] + blocked_vars = ['libraries', 'libraries_private', 'require_private', 'extra_cflags', 'subdirs'] + if len(set(kwargs) & set(blocked_vars)) > 0: + raise mesonlib.MesonException('Cannot combine dataonly with any of {}'.format(blocked_vars)) + + subdirs = mesonlib.stringlistify(kwargs.get('subdirs', default_subdirs)) version = kwargs.get('version', default_version) if not isinstance(version, str): raise mesonlib.MesonException('Version must be specified.') @@ -440,6 +450,11 @@ class PkgConfigModule(ExtensionModule): libraries = [mainlib] + libraries deps = DependenciesHelper(state, filebase) + for d in subdirs: + if d == '.': + deps.add_cflags(['-I${includedir}']) + else: + deps.add_cflags(self._escape(PurePath('-I${includedir}') / d)) deps.add_pub_libs(libraries) deps.add_priv_libs(kwargs.get('libraries_private', [])) deps.add_pub_reqs(kwargs.get('requires', [])) @@ -488,13 +503,14 @@ class PkgConfigModule(ExtensionModule): if not isinstance(pkgroot, str): raise mesonlib.MesonException('Install_dir must be a string.') self.generate_pkgconfig_file(state, deps, subdirs, name, description, url, - version, pcfile, conflicts, variables) + version, pcfile, conflicts, variables, + False, dataonly) res = build.Data(mesonlib.File(True, state.environment.get_scratch_dir(), pcfile), pkgroot) variables = parse_variable_list(mesonlib.stringlistify(kwargs.get('uninstalled_variables', []))) pcfile = filebase + '-uninstalled.pc' self.generate_pkgconfig_file(state, deps, subdirs, name, description, url, version, pcfile, conflicts, variables, - uninstalled=True) + uninstalled=True, dataonly=dataonly) # Associate the main library with this generated pc file. If the library # is used in any subsequent call to the generated, it will generate a # 'Requires:' or 'Requires.private:'. |