diff options
-rw-r--r-- | docs/markdown/snippets/pkg-config-fix-static-only.md | 12 | ||||
-rw-r--r-- | mesonbuild/modules/pkgconfig.py | 8 | ||||
-rwxr-xr-x | run_unittests.py | 21 | ||||
-rw-r--r-- | test cases/common/51 pkgconfig-gen/dependencies/meson.build | 2 | ||||
-rw-r--r-- | test cases/unit/28 pkgconfig use libraries/app/app.c | 6 | ||||
-rw-r--r-- | test cases/unit/28 pkgconfig use libraries/app/meson.build | 5 | ||||
-rw-r--r-- | test cases/unit/28 pkgconfig use libraries/lib/liba.c | 2 | ||||
-rw-r--r-- | test cases/unit/28 pkgconfig use libraries/lib/libb.c | 5 | ||||
-rw-r--r-- | test cases/unit/28 pkgconfig use libraries/lib/meson.build | 16 |
9 files changed, 74 insertions, 3 deletions
diff --git a/docs/markdown/snippets/pkg-config-fix-static-only.md b/docs/markdown/snippets/pkg-config-fix-static-only.md new file mode 100644 index 0000000..31cd389 --- /dev/null +++ b/docs/markdown/snippets/pkg-config-fix-static-only.md @@ -0,0 +1,12 @@ +## Improved generation of pkg-config files for static only libraries. + +Previously pkg-config files generated by the pkgconfig modules for static libraries +with dependencies could only be used in a dependencies with `static: true`. + +Now the generated file contains the needed dependencies libraries directly within +`Requires` and `Libs` for build static libraries passed via the `libraries` keyword +argument. + +Projects that install both a static and a shared version of a library should use +the result of `both_libraries` to the pkg config file generator or use +configure_file for more complicated setups. diff --git a/mesonbuild/modules/pkgconfig.py b/mesonbuild/modules/pkgconfig.py index 6a7e962..6f0e717 100644 --- a/mesonbuild/modules/pkgconfig.py +++ b/mesonbuild/modules/pkgconfig.py @@ -119,11 +119,15 @@ class DependenciesHelper: obj.generated_pc = self.name elif isinstance(obj, (build.SharedLibrary, build.StaticLibrary)): processed_libs.append(obj) - self.add_priv_libs(obj.get_dependencies()) - self.add_priv_libs(obj.get_external_deps()) if public: if not hasattr(obj, 'generated_pc'): obj.generated_pc = self.name + if isinstance(obj, build.StaticLibrary) and public: + self.add_pub_libs(obj.get_dependencies()) + self.add_pub_libs(obj.get_external_deps()) + else: + self.add_priv_libs(obj.get_dependencies()) + self.add_priv_libs(obj.get_external_deps()) elif isinstance(obj, str): processed_libs.append(obj) else: diff --git a/run_unittests.py b/run_unittests.py index 1e8a778..0f9a50b 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -2841,6 +2841,27 @@ endian = 'little' self.assertTrue(os.path.isfile(test_exe)) subprocess.check_call(test_exe, env=myenv) + @unittest.skipIf(shutil.which('pkg-config') is None, 'Pkg-config not found.') + def test_pkgconfig_internal_libraries(self): + ''' + ''' + with tempfile.TemporaryDirectory() as tempdirname: + # build library + testdirbase = os.path.join(self.unit_test_dir, '28 pkgconfig use libraries') + testdirlib = os.path.join(testdirbase, 'lib') + self.init(testdirlib, extra_args=['--prefix=' + tempdirname, + '--libdir=lib', + '--default-library=static'], default_args=False) + self.build() + self.install(use_destdir=False) + + # build user of library + pkg_dir = os.path.join(tempdirname, 'lib/pkgconfig') + os.environ['PKG_CONFIG_PATH'] = pkg_dir + self.new_builddir() + self.init(os.path.join(testdirbase, 'app')) + self.build() + class LinuxArmCrossCompileTests(BasePlatformTests): ''' diff --git a/test cases/common/51 pkgconfig-gen/dependencies/meson.build b/test cases/common/51 pkgconfig-gen/dependencies/meson.build index 640115a..047e7e7 100644 --- a/test cases/common/51 pkgconfig-gen/dependencies/meson.build +++ b/test cases/common/51 pkgconfig-gen/dependencies/meson.build @@ -5,7 +5,7 @@ pkgg = import('pkgconfig') # libmain internally use libinternal and expose libexpose in its API exposed_lib = shared_library('libexposed', 'exposed.c') internal_lib = shared_library('libinternal', 'internal.c') -main_lib = static_library('libmain', link_with : [exposed_lib, internal_lib]) +main_lib = both_libraries('libmain', link_with : [exposed_lib, internal_lib]) pkgg.generate(exposed_lib) diff --git a/test cases/unit/28 pkgconfig use libraries/app/app.c b/test cases/unit/28 pkgconfig use libraries/app/app.c new file mode 100644 index 0000000..b271a9e --- /dev/null +++ b/test cases/unit/28 pkgconfig use libraries/app/app.c @@ -0,0 +1,6 @@ +void libb_func(); + +int main() { + libb_func(); + return 0; +} diff --git a/test cases/unit/28 pkgconfig use libraries/app/meson.build b/test cases/unit/28 pkgconfig use libraries/app/meson.build new file mode 100644 index 0000000..3d85a32 --- /dev/null +++ b/test cases/unit/28 pkgconfig use libraries/app/meson.build @@ -0,0 +1,5 @@ +project('app', ['c']) + +b = dependency('test-b') + +executable('app', 'app.c', dependencies : [b]) diff --git a/test cases/unit/28 pkgconfig use libraries/lib/liba.c b/test cases/unit/28 pkgconfig use libraries/lib/liba.c new file mode 100644 index 0000000..e98906b --- /dev/null +++ b/test cases/unit/28 pkgconfig use libraries/lib/liba.c @@ -0,0 +1,2 @@ +void liba_func() { +} diff --git a/test cases/unit/28 pkgconfig use libraries/lib/libb.c b/test cases/unit/28 pkgconfig use libraries/lib/libb.c new file mode 100644 index 0000000..3160e5f --- /dev/null +++ b/test cases/unit/28 pkgconfig use libraries/lib/libb.c @@ -0,0 +1,5 @@ +void liba_func(); + +void libb_func() { + liba_func(); +} diff --git a/test cases/unit/28 pkgconfig use libraries/lib/meson.build b/test cases/unit/28 pkgconfig use libraries/lib/meson.build new file mode 100644 index 0000000..748adf4 --- /dev/null +++ b/test cases/unit/28 pkgconfig use libraries/lib/meson.build @@ -0,0 +1,16 @@ +project('lib', ['c']) + +a = library('test-a', 'liba.c', install: true) + +b = library('test-b', 'libb.c', link_with: a, install: true) + +import('pkgconfig').generate( + version: '0.0', + description: 'test library', + filebase: 'test-b', + name: 'test library', + libraries: [b], + subdirs: ['.'] +) + + |