From 5eef325ab61820ca0c3fa5673afc917dde2aa1ef Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Thu, 29 Mar 2018 15:46:12 -0400 Subject: pkgconfig generator: Only skip dependencies when using shared_library() It is weird and inconsistent to have different pc file depending on default_library value when using library() or build_target(). We should skip dependencies only when user explicitly want shared library only. --- mesonbuild/interpreter.py | 6 +++++- mesonbuild/modules/pkgconfig.py | 22 ++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 42a57d3..6bd0b97 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -605,6 +605,8 @@ class StaticLibraryHolder(BuildTargetHolder): class SharedLibraryHolder(BuildTargetHolder): def __init__(self, target, interp): super().__init__(target, interp) + # Set to True only when called from self.func_shared_lib(). + target.shared_library_only = False class SharedModuleHolder(BuildTargetHolder): def __init__(self, target, interp): @@ -2486,7 +2488,9 @@ root and issuing %s. @permittedKwargs(permitted_kwargs['shared_library']) def func_shared_lib(self, node, args, kwargs): - return self.build_target(node, args, kwargs, SharedLibraryHolder) + holder = self.build_target(node, args, kwargs, SharedLibraryHolder) + holder.held_object.shared_library_only = True + return holder @permittedKwargs(permitted_kwargs['shared_module']) def func_shared_module(self, node, args, kwargs): diff --git a/mesonbuild/modules/pkgconfig.py b/mesonbuild/modules/pkgconfig.py index ef74d63..c587f84 100644 --- a/mesonbuild/modules/pkgconfig.py +++ b/mesonbuild/modules/pkgconfig.py @@ -105,26 +105,24 @@ class DependenciesHelper: if obj.found(): processed_libs += obj.get_link_args() processed_cflags += obj.get_compile_args() - elif isinstance(obj, build.SharedLibrary): + elif isinstance(obj, build.SharedLibrary) and obj.shared_library_only: + # Do not pull dependencies for shared libraries because they are + # only required for static linking. Adding private requires has + # the side effect of exposing their cflags, which is the + # intended behaviour of pkg-config but force Debian to add more + # than needed build deps. + # See https://bugs.freedesktop.org/show_bug.cgi?id=105572 processed_libs.append(obj) if public: if not hasattr(obj, 'generated_pc'): obj.generated_pc = self.name - elif isinstance(obj, build.StaticLibrary): - # Due to a "feature" in pkgconfig, it leaks out private dependencies. - # Thus we will not add them to the pc file unless the target - # we are processing is a static library. - # - # This way (hopefully) "pkgconfig --libs --static foobar" works - # and "pkgconfig --cflags/--libs foobar" does not have any trace - # of dependencies that the build file creator has not explicitly - # added to the dependency list. + 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 - self.add_priv_libs(obj.get_dependencies()) - self.add_priv_libs(obj.get_external_deps()) elif isinstance(obj, str): processed_libs.append(obj) else: -- cgit v1.1