[libsoup/wip/pkg-config-tweaks] Use Requires.internal in pkg-config file




commit 6de99cf344aee817176494451a995366fe020f76
Author: Patrick Griffis <pgriffis igalia com>
Date:   Wed Oct 19 11:56:03 2022 -0500

    Use Requires.internal in pkg-config file
    
    The Requires.private field in pkg-config is vague and does not express
    what these dependencies are well. They are internal dependencies
    that are not part of our public API.

 examples/meson.build      | 11 +++++-----
 libsoup/libsoup-3.0.pc.in | 14 ++++++++++++
 libsoup/meson.build       | 55 +++++++++++++++++++++++++++++++++++------------
 meson.build               |  6 ++----
 4 files changed, 62 insertions(+), 24 deletions(-)
---
diff --git a/examples/meson.build b/examples/meson.build
index 189616b2..f1eeab1a 100644
--- a/examples/meson.build
+++ b/examples/meson.build
@@ -1,7 +1,4 @@
-deps = [
-  glib_deps,
-  libsoup_dep
-]
+example_deps = [libsoup_dep]
 
 examples = [
   'get',
@@ -12,9 +9,11 @@ examples = [
 if unix_socket_dep.found()
   examples += [ 'unix-socket-client' ]
   examples += [ 'unix-socket-server' ]
-  deps += [ unix_socket_dep ]
+  example_deps += [ unix_socket_dep ]
 endif
 
 foreach example: examples
-  executable(example, example + '.c', dependencies: deps)
+  executable(example, example + '.c',
+    dependencies: example_deps,
+  )
 endforeach
diff --git a/libsoup/libsoup-3.0.pc.in b/libsoup/libsoup-3.0.pc.in
new file mode 100644
index 00000000..bea1cd58
--- /dev/null
+++ b/libsoup/libsoup-3.0.pc.in
@@ -0,0 +1,14 @@
+prefix=@PREFIX@
+includedir=@INCLUDEDIR@
+libdir=@LIBDIR@
+exec_prefix=${prefix}
+
+Name: libsoup
+Description: A glib-based HTTP library
+Version: @VERSION@
+URL: https://libsoup.org
+Conflicts: libsoup-2.4
+Requires: @REQUIRES@
+Requires.internal: @REQUIRES_INTERNAL@
+Libs: -L${libdir} -lsoup-3.0
+Cflags: -I${includedir}/libsoup-3.0
diff --git a/libsoup/meson.build b/libsoup/meson.build
index d920b522..309dd9d4 100644
--- a/libsoup/meson.build
+++ b/libsoup/meson.build
@@ -1,8 +1,6 @@
 includedir = join_paths(libsoup_api_name, meson.project_name())
 subdir('include')
 
-pkg = import('pkgconfig')
-
 soup_sources = [
   'auth/soup-auth.c',
   'auth/soup-auth-basic.c',
@@ -182,16 +180,24 @@ libsoup_c_args  = [
   '-DLIBSOUP_COMPILATION'
 ]
 
-deps = [
+# These are dependencies that are *not* part of our public API
+internal_deps = [
   libsysprof_capture_dep,
-  glib_deps,
   sqlite_dep,
   libpsl_dep,
   brotlidec_dep,
-  platform_deps,
   gssapi_dep,
   libz_dep,
   libnghttp2_dep,
+  gmodule_dep,
+]
+
+deps = [
+  glib_dep,
+  gobject_dep,
+  gio_dep,
+  platform_deps,
+  internal_deps,
 ]
 
 libsoup_includes = [
@@ -236,18 +242,39 @@ libsoup_static = static_library('soup-@0@-static'.format(apiversion),
   dependencies : deps,
 )
 
-pkg.generate(libsoup,
-  libraries : glib_deps,
-  name : meson.project_name(),
-  description : 'A glib-based HTTP library',
-  filebase : libsoup_api_name,
-  subdirs: libsoup_api_name,
-  variables: 'exec_prefix=${prefix}')
+# We generate our own pkg-config file instead of using the pkgconfig module
+# to set the Requires.internal property instead of Requires.private.
+# This is supported by `pkgconf` and correctly expresses what these
+# dependencies are since we do not actually depend on them for public
+# API and they are only ever necessary for static linking.
+pkgconfig_data = configuration_data()
+
+required_internal_deps = []
+foreach dep : internal_deps
+  if dep.found()
+    required_internal_deps += '@0@ >= @1@'.format(dep.name(), dep.version())
+  endif
+endforeach
+
+pkgconfig_data.set('REQUIRES', 'gio-2.0 @0@'.format(glib_required_version))
+pkgconfig_data.set('REQUIRES_INTERNAL', ', '.join(required_internal_deps))
+pkgconfig_data.set('VERSION', meson.project_version())
+pkgconfig_data.set('PREFIX', get_option('prefix'))
+pkgconfig_data.set('LIBDIR', get_option('prefix') / get_option('libdir'))
+pkgconfig_data.set('INCLUDEDIR', get_option('prefix') / get_option('includedir'))
+
+configure_file(
+  input: 'libsoup-3.0.pc.in',
+  output: 'libsoup-3.0.pc',
+  configuration: pkgconfig_data,
+  install: true,
+  install_dir: get_option('libdir') / 'pkgconfig'
+)
 
 libsoup_dep = declare_dependency(link_with : libsoup,
   include_directories : libsoup_includes,
   sources : soup_enum_h,
-  dependencies : [ platform_deps, gssapi_dep, glib_deps ]
+  dependencies : [ platform_deps, glib_dep, gobject_dep, gio_dep ]
 )
 
 meson.override_dependency('libsoup-3.0', libsoup_dep)
@@ -255,7 +282,7 @@ meson.override_dependency('libsoup-3.0', libsoup_dep)
 libsoup_static_dep = declare_dependency(link_with : libsoup_static,
   include_directories : libsoup_includes,
   sources : soup_enum_h,
-  dependencies : [ platform_deps, gssapi_dep, glib_deps ]
+  dependencies : [ platform_deps, glib_dep, gobject_dep, gio_dep ]
 )
 
 if enable_introspection or enable_vapi
diff --git a/meson.build b/meson.build
index 0487fbc1..bc265c01 100644
--- a/meson.build
+++ b/meson.build
@@ -98,7 +98,7 @@ endif
 
 add_project_arguments(common_flags, language : 'c')
 
-glib_required_version = '>= 2.69.1'
+glib_required_version = '>= 2.69.1' # Note this string is included in the pkg-config file.
 glib_dep = dependency('glib-2.0', version : glib_required_version,
                        fallback: ['glib', 'libglib_dep'])
 gmodule_dep = dependency('gmodule-2.0', version : glib_required_version,
@@ -108,8 +108,6 @@ gobject_dep = dependency('gobject-2.0', version : glib_required_version,
 gio_dep = dependency('gio-2.0', version : glib_required_version,
                        fallback: ['glib', 'libgio_dep'])
 
-glib_deps = [glib_dep, gmodule_dep, gobject_dep, gio_dep]
-
 cdata = configuration_data()
 
 libnghttp2_dep = dependency('libnghttp2')
@@ -193,7 +191,7 @@ if enable_tls_check
     }
     '''
 
-    rres = cc.run(check_gio_tls_src, name : 'GIO has real TLS support', dependencies : glib_deps)
+    rres = cc.run(check_gio_tls_src, name : 'GIO has real TLS support', dependencies : gio_dep)
     assert(rres.compiled() and rres.returncode() == 0, 'libsoup requires glib-networking for TLS support')
   endif
 endif


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]