Merge pull request #2955 from xclaesse/unfound

pkgconfig: Also ignore not found deps passed directly to pc generator
pull/2949/merge
Jussi Pakkanen 7 years ago committed by GitHub
commit 2757d7fd12
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      mesonbuild/modules/pkgconfig.py
  2. 35
      run_unittests.py
  3. 3
      test cases/common/51 pkgconfig-gen/dependencies/exposed.c
  4. 3
      test cases/common/51 pkgconfig-gen/dependencies/internal.c
  5. 38
      test cases/common/51 pkgconfig-gen/dependencies/meson.build
  6. 33
      test cases/common/51 pkgconfig-gen/meson.build

@ -66,11 +66,13 @@ class DependenciesHelper:
elif hasattr(obj, 'generated_pc'): elif hasattr(obj, 'generated_pc'):
processed_reqs.append(obj.generated_pc) processed_reqs.append(obj.generated_pc)
elif isinstance(obj, dependencies.PkgConfigDependency): elif isinstance(obj, dependencies.PkgConfigDependency):
if obj.found():
processed_reqs.append(obj.name) processed_reqs.append(obj.name)
elif isinstance(obj, dependencies.ThreadDependency): elif isinstance(obj, dependencies.ThreadDependency):
processed_libs += obj.get_compiler().thread_link_flags(obj.env) processed_libs += obj.get_compiler().thread_link_flags(obj.env)
processed_cflags += obj.get_compiler().thread_flags(obj.env) processed_cflags += obj.get_compiler().thread_flags(obj.env)
elif isinstance(obj, dependencies.Dependency): elif isinstance(obj, dependencies.Dependency):
if obj.found():
processed_libs += obj.get_link_args() processed_libs += obj.get_link_args()
processed_cflags += obj.get_compile_args() processed_cflags += obj.get_compile_args()
elif isinstance(obj, (build.SharedLibrary, build.StaticLibrary)): elif isinstance(obj, (build.SharedLibrary, build.StaticLibrary)):
@ -79,7 +81,7 @@ class DependenciesHelper:
if not hasattr(obj, 'generated_pc'): if not hasattr(obj, 'generated_pc'):
obj.generated_pc = self.name obj.generated_pc = self.name
self.add_priv_libs(obj.get_dependencies()) 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): elif isinstance(obj, str):
processed_libs.append(obj) processed_libs.append(obj)
else: else:
@ -87,9 +89,6 @@ class DependenciesHelper:
return processed_libs, processed_reqs, processed_cflags 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): def remove_dups(self):
self.pub_libs = list(set(self.pub_libs)) self.pub_libs = list(set(self.pub_libs))
self.pub_reqs = list(set(self.pub_reqs)) self.pub_reqs = list(set(self.pub_reqs))

@ -433,15 +433,8 @@ class BasePlatformTests(unittest.TestCase):
src_root = os.path.dirname(__file__) src_root = os.path.dirname(__file__)
src_root = os.path.join(os.getcwd(), src_root) src_root = os.path.join(os.getcwd(), src_root)
self.src_root = src_root self.src_root = src_root
# In case the directory is inside a symlinked directory, find the real
# path otherwise we might not find the srcdir from inside the builddir.
self.builddir = os.path.realpath(tempfile.mkdtemp())
self.privatedir = os.path.join(self.builddir, 'meson-private')
self.logdir = os.path.join(self.builddir, 'meson-logs')
self.prefix = '/usr' self.prefix = '/usr'
self.libdir = os.path.join(self.prefix, 'lib') self.libdir = os.path.join(self.prefix, 'lib')
self.installdir = os.path.join(self.builddir, 'install')
self.distdir = os.path.join(self.builddir, 'meson-dist')
# Get the backend # Get the backend
# FIXME: Extract this from argv? # FIXME: Extract this from argv?
self.backend = getattr(Backend, os.environ.get('MESON_UNIT_TEST_BACKEND', 'ninja')) self.backend = getattr(Backend, os.environ.get('MESON_UNIT_TEST_BACKEND', 'ninja'))
@ -450,7 +443,6 @@ class BasePlatformTests(unittest.TestCase):
self.meson_command = meson_command + self.meson_args self.meson_command = meson_command + self.meson_args
self.mconf_command = meson_command + ['configure'] self.mconf_command = meson_command + ['configure']
self.mintro_command = meson_command + ['introspect'] self.mintro_command = meson_command + ['introspect']
self.mtest_command = meson_command + ['test', '-C', self.builddir]
self.wrap_command = meson_command + ['wrap'] self.wrap_command = meson_command + ['wrap']
# Backend-specific build commands # Backend-specific build commands
self.build_command, self.clean_command, self.test_command, self.install_command, \ self.build_command, self.clean_command, self.test_command, self.install_command, \
@ -469,6 +461,20 @@ class BasePlatformTests(unittest.TestCase):
# XCode backend is untested with unit tests, help welcome! # XCode backend is untested with unit tests, help welcome!
self.no_rebuild_stdout = 'UNKNOWN BACKEND {!r}'.format(self.backend.name) self.no_rebuild_stdout = 'UNKNOWN BACKEND {!r}'.format(self.backend.name)
self.builddirs = []
self.new_builddir()
def new_builddir(self):
# In case the directory is inside a symlinked directory, find the real
# path otherwise we might not find the srcdir from inside the builddir.
self.builddir = os.path.realpath(tempfile.mkdtemp())
self.privatedir = os.path.join(self.builddir, 'meson-private')
self.logdir = os.path.join(self.builddir, 'meson-logs')
self.installdir = os.path.join(self.builddir, 'install')
self.distdir = os.path.join(self.builddir, 'meson-dist')
self.mtest_command = meson_command + ['test', '-C', self.builddir]
self.builddirs.append(self.builddir)
def _print_meson_log(self): def _print_meson_log(self):
log = os.path.join(self.logdir, 'meson-log.txt') log = os.path.join(self.logdir, 'meson-log.txt')
if not os.path.isfile(log): if not os.path.isfile(log):
@ -478,8 +484,9 @@ class BasePlatformTests(unittest.TestCase):
print(f.read()) print(f.read())
def tearDown(self): def tearDown(self):
for path in self.builddirs:
try: try:
windows_proof_rmtree(self.builddir) windows_proof_rmtree(path)
except FileNotFoundError: except FileNotFoundError:
pass pass
os.environ = self.orig_env os.environ = self.orig_env
@ -2060,11 +2067,17 @@ class LinuxlikeTests(BasePlatformTests):
''' '''
Test that generated pkg-config files correctly handle dependencies Test that generated pkg-config files correctly handle dependencies
''' '''
testdir = os.path.join(self.common_test_dir, '51 pkgconfig-gen') testdir = os.path.join(self.common_test_dir, '51 pkgconfig-gen')
self.init(testdir) 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'] cmd = ['pkg-config', 'dependency-test']
out = self._run(cmd + ['--print-requires']).strip().split() out = self._run(cmd + ['--print-requires']).strip().split()

@ -0,0 +1,3 @@
int exposed_function() {
return 42;
}

@ -0,0 +1,3 @@
int internal_function() {
return 42;
}

@ -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.'
)

@ -46,36 +46,3 @@ pkgg.generate(
description : 'A foo library.', description : 'A foo library.',
variables : ['foo=bar', 'datadir=${prefix}/data'] 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.'
)

Loading…
Cancel
Save