diff --git a/mesonbuild/modules/pkgconfig.py b/mesonbuild/modules/pkgconfig.py index c95192003..5573a2e41 100644 --- a/mesonbuild/modules/pkgconfig.py +++ b/mesonbuild/modules/pkgconfig.py @@ -66,20 +66,22 @@ class DependenciesHelper: elif hasattr(obj, 'generated_pc'): processed_reqs.append(obj.generated_pc) elif isinstance(obj, dependencies.PkgConfigDependency): - processed_reqs.append(obj.name) + if obj.found(): + processed_reqs.append(obj.name) elif isinstance(obj, dependencies.ThreadDependency): processed_libs += obj.get_compiler().thread_link_flags(obj.env) processed_cflags += obj.get_compiler().thread_flags(obj.env) elif isinstance(obj, dependencies.Dependency): - processed_libs += obj.get_link_args() - processed_cflags += obj.get_compile_args() + if obj.found(): + processed_libs += obj.get_link_args() + processed_cflags += obj.get_compile_args() elif isinstance(obj, (build.SharedLibrary, build.StaticLibrary)): processed_libs.append(obj) if public: if not hasattr(obj, 'generated_pc'): obj.generated_pc = self.name self.add_priv_libs(obj.get_dependencies()) - self.add_priv_libs(self.strip_unfound(obj.get_external_deps())) + self.add_priv_libs(obj.get_external_deps()) elif isinstance(obj, str): processed_libs.append(obj) else: @@ -87,9 +89,6 @@ class DependenciesHelper: return processed_libs, processed_reqs, processed_cflags - def strip_unfound(self, deps): - return [x for x in deps if not hasattr(x, 'found') or x.found()] - def remove_dups(self): self.pub_libs = list(set(self.pub_libs)) self.pub_reqs = list(set(self.pub_reqs)) diff --git a/run_unittests.py b/run_unittests.py index 536c0f927..7abbe6ceb 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -2067,11 +2067,17 @@ class LinuxlikeTests(BasePlatformTests): ''' Test that generated pkg-config files correctly handle dependencies ''' - testdir = os.path.join(self.common_test_dir, '51 pkgconfig-gen') self.init(testdir) + privatedir1 = self.privatedir - os.environ['PKG_CONFIG_LIBDIR'] = self.privatedir + self.new_builddir() + os.environ['PKG_CONFIG_LIBDIR'] = privatedir1 + testdir = os.path.join(self.common_test_dir, '51 pkgconfig-gen', 'dependencies') + self.init(testdir) + privatedir2 = self.privatedir + + os.environ['PKG_CONFIG_LIBDIR'] = os.pathsep.join([privatedir1, privatedir2]) cmd = ['pkg-config', 'dependency-test'] out = self._run(cmd + ['--print-requires']).strip().split() diff --git a/test cases/common/51 pkgconfig-gen/dependencies/exposed.c b/test cases/common/51 pkgconfig-gen/dependencies/exposed.c new file mode 100644 index 000000000..005202e67 --- /dev/null +++ b/test cases/common/51 pkgconfig-gen/dependencies/exposed.c @@ -0,0 +1,3 @@ +int exposed_function() { + return 42; +} diff --git a/test cases/common/51 pkgconfig-gen/dependencies/internal.c b/test cases/common/51 pkgconfig-gen/dependencies/internal.c new file mode 100644 index 000000000..1a41b11c8 --- /dev/null +++ b/test cases/common/51 pkgconfig-gen/dependencies/internal.c @@ -0,0 +1,3 @@ +int internal_function() { + return 42; +} diff --git a/test cases/common/51 pkgconfig-gen/dependencies/meson.build b/test cases/common/51 pkgconfig-gen/dependencies/meson.build new file mode 100644 index 000000000..a767eb545 --- /dev/null +++ b/test cases/common/51 pkgconfig-gen/dependencies/meson.build @@ -0,0 +1,38 @@ +project('pkgconfig-gen-dependencies', 'c') + +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 = shared_library('libmain', link_with : [exposed_lib, internal_lib]) + +pkgg.generate(libraries : exposed_lib, + version : '1.0', + name : 'libexposed', + description : 'An exposed library in dependency test.' +) + +# Declare a few different Dependency objects +pc_dep = dependency('libfoo') +notfound_dep = dependency('notfound', required : false) +threads_dep = dependency('threads') +custom_dep = declare_dependency(link_args : ['-lcustom'], compile_args : ['-DCUSTOM']) +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 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 +# - Having custom_dep in libraries and libraries_private should only add it in Libs +# - Having custom2_dep in libraries_private should not add its Cflags +# - Having pc_dep in libraries_private should add it in Requires.private +# - notfound_dep is not required so it shouldn't appear in the pc file. +pkgg.generate(libraries : [main_lib, exposed_lib, threads_dep , custom_dep], + libraries_private : [custom_dep, custom2_dep, pc_dep, notfound_dep], + version : '1.0', + name : 'dependency-test', + filebase : 'dependency-test', + description : 'A dependency test.' +) diff --git a/test cases/common/51 pkgconfig-gen/meson.build b/test cases/common/51 pkgconfig-gen/meson.build index a8dd09275..f9d7f7fd1 100644 --- a/test cases/common/51 pkgconfig-gen/meson.build +++ b/test cases/common/51 pkgconfig-gen/meson.build @@ -46,36 +46,3 @@ pkgg.generate( description : 'A foo library.', variables : ['foo=bar', 'datadir=${prefix}/data'] ) - -# libmain internally use libinternal and expose libexpose in its API -exposed_lib = shared_library('libexposed', 'simple.c') -internal_lib = shared_library('libinternal', 'simple.c') -main_lib = shared_library('libmain', link_with : [exposed_lib, internal_lib]) - -pkgg.generate(libraries : exposed_lib, - version : libver, - name : 'libexposed', - description : 'An exposed library in dependency test.' -) - -# Declare a few different Dependency objects -pc_dep = dependency('libfoo', required : false) -threads_dep = dependency('threads', required : false) -custom_dep = declare_dependency(link_args : ['-lcustom'], compile_args : ['-DCUSTOM']) -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 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 -# - Having custom_dep in libraries and libraries_private should only add it in Libs -# - Having custom2_dep in libraries_private should not add its Cflags -# - Having pc_dep in libraries_private should add it in Requires.private -pkgg.generate(libraries : [main_lib, exposed_lib, threads_dep , custom_dep], - libraries_private : [custom_dep, custom2_dep, pc_dep], - version : libver, - name : 'dependency-test', - filebase : 'dependency-test', - description : 'A dependency test.' -)