diff options
-rw-r--r-- | docs/markdown/Pkgconfig-module.md | 5 | ||||
-rw-r--r-- | docs/markdown/snippets/pkgconfig-requires-non-string.md | 5 | ||||
-rw-r--r-- | mesonbuild/modules/pkgconfig.py | 30 | ||||
-rwxr-xr-x | run_unittests.py | 8 | ||||
-rw-r--r-- | test cases/common/51 pkgconfig-gen/dependencies/meson.build | 16 | ||||
-rw-r--r-- | test cases/common/51 pkgconfig-gen/meson.build | 6 |
6 files changed, 61 insertions, 9 deletions
diff --git a/docs/markdown/Pkgconfig-module.md b/docs/markdown/Pkgconfig-module.md index cbe01b4..853cf50 100644 --- a/docs/markdown/Pkgconfig-module.md +++ b/docs/markdown/Pkgconfig-module.md @@ -38,8 +38,9 @@ keyword arguments. search path, for example if you install headers into `${PREFIX}/include/foobar-1`, the correct value for this argument would be `foobar-1` -- `requires` list of strings to put in the `Requires` field -- `requires_private` list of strings to put in the `Requires.private` +- `requires` list of strings, pkgconfig-dependencies or libraries that + `pkgconfig.generate()` was used on to put in the `Requires` field +- `requires_private` same as `requires` but for `Requires.private` field field - `url` a string with a url for the library - `variables` a list of strings with custom variables to add to the diff --git a/docs/markdown/snippets/pkgconfig-requires-non-string.md b/docs/markdown/snippets/pkgconfig-requires-non-string.md new file mode 100644 index 0000000..fc848a8 --- /dev/null +++ b/docs/markdown/snippets/pkgconfig-requires-non-string.md @@ -0,0 +1,5 @@ +# pkgconfig.generate() requires parameters non-string arguments + +`pkgconfig.generate()` `requires` and `requires_private` parameters +accept pkgconfig-dependencies and libraries that pkgconfig-files were +generated for. diff --git a/mesonbuild/modules/pkgconfig.py b/mesonbuild/modules/pkgconfig.py index 5573a2e..2f4dfae 100644 --- a/mesonbuild/modules/pkgconfig.py +++ b/mesonbuild/modules/pkgconfig.py @@ -44,22 +44,40 @@ class DependenciesHelper: self.priv_reqs += reqs def add_pub_reqs(self, reqs): - self.pub_reqs += mesonlib.stringlistify(reqs) + self.pub_reqs += self._process_reqs(reqs) def add_priv_reqs(self, reqs): - self.priv_reqs += mesonlib.stringlistify(reqs) + self.priv_reqs += self._process_reqs(reqs) + + def _process_reqs(self, reqs): + '''Returns string names of requirements''' + processed_reqs = [] + for obj in mesonlib.listify(reqs, unholder=True): + if hasattr(obj, 'generated_pc'): + processed_reqs.append(obj.generated_pc) + elif hasattr(obj, 'pcdep'): + pcdeps = mesonlib.listify(obj.pcdep) + processed_reqs += [i.name for i in pcdeps] + elif isinstance(obj, dependencies.PkgConfigDependency): + if obj.found(): + processed_reqs.append(obj.name) + elif isinstance(obj, str): + processed_reqs.append(obj) + else: + raise mesonlib.MesonException('requires argument not a string, ' + 'library with pkgconfig-generated file ' + 'or pkgconfig-dependency object.') + return processed_reqs def add_cflags(self, cflags): self.cflags += mesonlib.stringlistify(cflags) def _process_libs(self, libs, public): - libs = mesonlib.listify(libs) + libs = mesonlib.listify(libs, unholder=True) processed_libs = [] processed_reqs = [] processed_cflags = [] for obj in libs: - if hasattr(obj, 'held_object'): - obj = obj.held_object if hasattr(obj, 'pcdep'): pcdeps = mesonlib.listify(obj.pcdep) processed_reqs += [i.name for i in pcdeps] @@ -96,7 +114,7 @@ class DependenciesHelper: self.priv_reqs = list(set(self.priv_reqs)) self.cflags = list(set(self.cflags)) - # Remove from pivate libs/reqs if they are in public already + # Remove from private libs/reqs if they are in public already self.priv_libs = [i for i in self.priv_libs if i not in self.pub_libs] self.priv_reqs = [i for i in self.priv_reqs if i not in self.pub_reqs] diff --git a/run_unittests.py b/run_unittests.py index 38728ab..9c7b16b 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -2234,6 +2234,14 @@ class LinuxlikeTests(BasePlatformTests): '-llibinternal', '-lcustom2', '-lfoo'])) + cmd = ['pkg-config', 'requires-test'] + out = self._run(cmd + ['--print-requires']).strip().split() + self.assertEqual(sorted(out), sorted(['libexposed', 'libfoo', 'libhello'])) + + cmd = ['pkg-config', 'requires-private-test'] + out = self._run(cmd + ['--print-requires-private']).strip().split() + self.assertEqual(sorted(out), sorted(['libexposed', 'libfoo', 'libhello'])) + def test_pkg_unfound(self): testdir = os.path.join(self.unit_test_dir, '22 unfound pkgconfig') self.init(testdir) diff --git a/test cases/common/51 pkgconfig-gen/dependencies/meson.build b/test cases/common/51 pkgconfig-gen/dependencies/meson.build index a767eb5..018b72f 100644 --- a/test cases/common/51 pkgconfig-gen/dependencies/meson.build +++ b/test cases/common/51 pkgconfig-gen/dependencies/meson.build @@ -21,7 +21,7 @@ custom_dep = declare_dependency(link_args : ['-lcustom'], compile_args : ['-DCUS custom2_dep = declare_dependency(link_args : ['-lcustom2'], compile_args : ['-DCUSTOM2']) # Generate a PC file: -# - Having libmain in libraries should pull implicitely libexposed and libinternal in Libs.private +# - Having libmain in libraries should pull implicitly libexposed and libinternal in Libs.private # - Having libexposed in libraries should remove it from Libs.private # - We generated a pc file for libexposed so it should be in Requires instead of Libs # - Having threads_dep in libraries should add '-pthread' in both Libs and Cflags @@ -36,3 +36,17 @@ pkgg.generate(libraries : [main_lib, exposed_lib, threads_dep , custom_dep], filebase : 'dependency-test', description : 'A dependency test.' ) + +pkgg.generate( + name : 'requires-test', + version : '1.0', + description : 'Dependency Requires field test.', + requires : [exposed_lib, pc_dep, 'libhello'], +) + +pkgg.generate( + name : 'requires-private-test', + version : '1.0', + description : 'Dependency Requires.private field test.', + requires_private : [exposed_lib, pc_dep, 'libhello', notfound_dep], +) diff --git a/test cases/common/51 pkgconfig-gen/meson.build b/test cases/common/51 pkgconfig-gen/meson.build index f9d7f7f..7e6c670 100644 --- a/test cases/common/51 pkgconfig-gen/meson.build +++ b/test cases/common/51 pkgconfig-gen/meson.build @@ -46,3 +46,9 @@ pkgg.generate( description : 'A foo library.', variables : ['foo=bar', 'datadir=${prefix}/data'] ) + +pkgg.generate( + name : 'libhello', + description : 'A minimalistic pkgconfig file.', + version : libver, +) |