Blame 0016-pkgconfig-Don-t-expose-internal-libraries-in-.pc-fil.patch

Igor Gnatenko ef6081
From a3b2ae8ebcdcebd68b8a217d03102c6d03fcb766 Mon Sep 17 00:00:00 2001
Igor Gnatenko ef6081
From: Nirbheek Chauhan <nirbheek@centricular.com>
Igor Gnatenko ef6081
Date: Tue, 1 May 2018 17:54:54 +0530
Igor Gnatenko ef6081
Subject: [PATCH 16/16] pkgconfig: Don't expose internal libraries in .pc files
Igor Gnatenko ef6081
Igor Gnatenko ef6081
Libraries that have been linked with link_whole: are internal
Igor Gnatenko ef6081
implementation details and should never be exposed to the outside
Igor Gnatenko ef6081
world in either Libs: or Libs.private:
Igor Gnatenko ef6081
Igor Gnatenko ef6081
Closes https://github.com/mesonbuild/meson/issues/3509
Igor Gnatenko ef6081
---
Igor Gnatenko ef6081
 mesonbuild/build.py                             | 12 +++++++++---
Igor Gnatenko ef6081
 mesonbuild/modules/pkgconfig.py                 |  4 ++--
Igor Gnatenko ef6081
 run_unittests.py                                | 11 ++++++-----
Igor Gnatenko ef6081
 test cases/unit/31 pkgconfig format/meson.build |  5 +++--
Igor Gnatenko ef6081
 test cases/unit/31 pkgconfig format/somelib.c   |  4 +++-
Igor Gnatenko ef6081
 test cases/unit/31 pkgconfig format/someret.c   |  3 +++
Igor Gnatenko ef6081
 6 files changed, 26 insertions(+), 13 deletions(-)
Igor Gnatenko ef6081
 create mode 100644 test cases/unit/31 pkgconfig format/someret.c
Igor Gnatenko ef6081
Igor Gnatenko ef6081
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
Igor Gnatenko ef6081
index 3d531d18..a2d024ae 100644
Igor Gnatenko ef6081
--- a/mesonbuild/build.py
Igor Gnatenko ef6081
+++ b/mesonbuild/build.py
Igor Gnatenko ef6081
@@ -817,16 +817,22 @@ This will become a hard error in a future Meson release.''')
Igor Gnatenko ef6081
     def get_extra_args(self, language):
Igor Gnatenko ef6081
         return self.extra_args.get(language, [])
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
-    def get_dependencies(self, exclude=None):
Igor Gnatenko ef6081
+    def get_dependencies(self, exclude=None, internal=True):
Igor Gnatenko ef6081
         transitive_deps = []
Igor Gnatenko ef6081
         if exclude is None:
Igor Gnatenko ef6081
             exclude = []
Igor Gnatenko ef6081
-        for t in itertools.chain(self.link_targets, self.link_whole_targets):
Igor Gnatenko ef6081
+        if internal:
Igor Gnatenko ef6081
+            link_targets = itertools.chain(self.link_targets, self.link_whole_targets)
Igor Gnatenko ef6081
+        else:
Igor Gnatenko ef6081
+            # We don't want the 'internal' libraries when generating the
Igor Gnatenko ef6081
+            # `Libs:` and `Libs.private:` lists in pkg-config files.
Igor Gnatenko ef6081
+            link_targets = self.link_targets
Igor Gnatenko ef6081
+        for t in link_targets:
Igor Gnatenko ef6081
             if t in transitive_deps or t in exclude:
Igor Gnatenko ef6081
                 continue
Igor Gnatenko ef6081
             transitive_deps.append(t)
Igor Gnatenko ef6081
             if isinstance(t, StaticLibrary):
Igor Gnatenko ef6081
-                transitive_deps += t.get_dependencies(transitive_deps + exclude)
Igor Gnatenko ef6081
+                transitive_deps += t.get_dependencies(transitive_deps + exclude, internal)
Igor Gnatenko ef6081
         return transitive_deps
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
     def get_source_subdir(self):
Igor Gnatenko ef6081
diff --git a/mesonbuild/modules/pkgconfig.py b/mesonbuild/modules/pkgconfig.py
Igor Gnatenko ef6081
index 419a14c7..365d3cd3 100644
Igor Gnatenko ef6081
--- a/mesonbuild/modules/pkgconfig.py
Igor Gnatenko ef6081
+++ b/mesonbuild/modules/pkgconfig.py
Igor Gnatenko ef6081
@@ -123,10 +123,10 @@ class DependenciesHelper:
Igor Gnatenko ef6081
                     if not hasattr(obj, 'generated_pc'):
Igor Gnatenko ef6081
                         obj.generated_pc = self.name
Igor Gnatenko ef6081
                 if isinstance(obj, build.StaticLibrary) and public:
Igor Gnatenko ef6081
-                    self.add_pub_libs(obj.get_dependencies())
Igor Gnatenko ef6081
+                    self.add_pub_libs(obj.get_dependencies(internal=False))
Igor Gnatenko ef6081
                     self.add_pub_libs(obj.get_external_deps())
Igor Gnatenko ef6081
                 else:
Igor Gnatenko ef6081
-                    self.add_priv_libs(obj.get_dependencies())
Igor Gnatenko ef6081
+                    self.add_priv_libs(obj.get_dependencies(internal=False))
Igor Gnatenko ef6081
                     self.add_priv_libs(obj.get_external_deps())
Igor Gnatenko ef6081
             elif isinstance(obj, str):
Igor Gnatenko ef6081
                 processed_libs.append(obj)
Igor Gnatenko ef6081
diff --git a/run_unittests.py b/run_unittests.py
Igor Gnatenko ef6081
index 6773bbd1..befba2d1 100755
Igor Gnatenko ef6081
--- a/run_unittests.py
Igor Gnatenko ef6081
+++ b/run_unittests.py
Igor Gnatenko ef6081
@@ -2989,11 +2989,12 @@ endian = 'little'
Igor Gnatenko ef6081
         self.init(testdir)
Igor Gnatenko ef6081
         myenv = os.environ.copy()
Igor Gnatenko ef6081
         myenv['PKG_CONFIG_PATH'] = self.privatedir
Igor Gnatenko ef6081
-        ro = subprocess.run(['pkg-config', '--libs', 'libsomething'], stdout=subprocess.PIPE,
Igor Gnatenko ef6081
-                            env=myenv)
Igor Gnatenko ef6081
-        self.assertEqual(ro.returncode, 0)
Igor Gnatenko ef6081
-        self.assertIn(b'-lgobject-2.0', ro.stdout)
Igor Gnatenko ef6081
-        self.assertIn(b'-lgio-2.0', ro.stdout)
Igor Gnatenko ef6081
+        stdo = subprocess.check_output(['pkg-config', '--libs-only-l', 'libsomething'], env=myenv)
Igor Gnatenko ef6081
+        deps = [b'-lgobject-2.0', b'-lgio-2.0', b'-lglib-2.0', b'-lsomething']
Igor Gnatenko ef6081
+        if is_windows() or is_cygwin():
Igor Gnatenko ef6081
+            # On Windows, libintl is a separate library
Igor Gnatenko ef6081
+            deps.append(b'-lintl')
Igor Gnatenko ef6081
+        self.assertEqual(set(deps), set(stdo.split()))
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
 class LinuxArmCrossCompileTests(BasePlatformTests):
Igor Gnatenko ef6081
     '''
Igor Gnatenko ef6081
diff --git a/test cases/unit/31 pkgconfig format/meson.build b/test cases/unit/31 pkgconfig format/meson.build
Igor Gnatenko ef6081
index bbd3b125..ea00f5df 100644
Igor Gnatenko ef6081
--- a/test cases/unit/31 pkgconfig format/meson.build	
Igor Gnatenko ef6081
+++ b/test cases/unit/31 pkgconfig format/meson.build	
Igor Gnatenko ef6081
@@ -8,10 +8,11 @@ endif
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
 pkgg = import('pkgconfig')
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
-l = shared_library('something', 'somelib.c')
Igor Gnatenko ef6081
+s = static_library('returner', 'someret.c')
Igor Gnatenko ef6081
+l = library('something', 'somelib.c', link_whole: s)
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
 pkgg.generate(libraries: l,
Igor Gnatenko ef6081
               version: '1.0',
Igor Gnatenko ef6081
               name: 'libsomething',
Igor Gnatenko ef6081
               description: 'A library that does something',
Igor Gnatenko ef6081
-              requires: 'gobject-2.0 >= 2.54, gio-2.0 >= 2.54')
Igor Gnatenko ef6081
+              requires: 'gobject-2.0 >= 2.0, gio-2.0 >= 2.0')
Igor Gnatenko ef6081
diff --git a/test cases/unit/31 pkgconfig format/somelib.c b/test cases/unit/31 pkgconfig format/somelib.c
Igor Gnatenko ef6081
index 6d876c8f..0558024b 100644
Igor Gnatenko ef6081
--- a/test cases/unit/31 pkgconfig format/somelib.c	
Igor Gnatenko ef6081
+++ b/test cases/unit/31 pkgconfig format/somelib.c	
Igor Gnatenko ef6081
@@ -1,5 +1,7 @@
Igor Gnatenko ef6081
 #include<stdio.h>
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
+int get_returnvalue (void);
Igor Gnatenko ef6081
+
Igor Gnatenko ef6081
 int some_func() {
Igor Gnatenko ef6081
-    return 0;
Igor Gnatenko ef6081
+    return get_returnvalue();
Igor Gnatenko ef6081
 }
Igor Gnatenko ef6081
diff --git a/test cases/unit/31 pkgconfig format/someret.c b/test cases/unit/31 pkgconfig format/someret.c
Igor Gnatenko ef6081
new file mode 100644
Igor Gnatenko ef6081
index 00000000..69f42992
Igor Gnatenko ef6081
--- /dev/null
Igor Gnatenko ef6081
+++ b/test cases/unit/31 pkgconfig format/someret.c	
Igor Gnatenko ef6081
@@ -0,0 +1,3 @@
Igor Gnatenko ef6081
+int get_returnvalue (void) {
Igor Gnatenko ef6081
+  return 0;
Igor Gnatenko ef6081
+}
Igor Gnatenko ef6081
-- 
Igor Gnatenko ef6081
2.17.0
Igor Gnatenko ef6081