This patch allows disabling the build of static libraries using the standard meson option -Ddefault_library=shared (defaults to "both"). This option would work out of the box if you use the library() function to build libraries, but we use shared_library() and static_library() separately, for reasons that are explained in src/interfaces/libpq/meson.build. So now with this, the option works again as expected from the end user's perspective.

This approach was suggested by Tristan Partin over in the AIX thread[0], but I figured this could be a generally usable feature, as some distributions don't want to build static libraries.

For illustration and continuous testing, I disabled static libraries in the CI SanityCheck task.

The internal use static libraries like libpgcommon.a are still built in any case, but if you disable static libraries, they are not installed.

The opposite case of disabling shared libraries doesn't work at the moment. I think that is much less useful, but if someone wanted to, they could implement it in this same framework.


[0]: https://www.postgresql.org/message-id/SJ4PPFB817783261597674B9814FE523944DB8EA%40SJ4PPFB81778326.namprd15.prod.outlook.com
From 09849b06eaa8e752674fe102015899562696eead Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Tue, 20 Jan 2026 07:21:13 +0100
Subject: [PATCH] meson: Allow disabling static libraries

---
 .cirrus.tasks.yml                          |  1 +
 meson.build                                | 26 +++++++++++++++++-----
 src/common/meson.build                     |  1 +
 src/fe_utils/meson.build                   |  4 +++-
 src/interfaces/ecpg/compatlib/meson.build  |  8 ++++---
 src/interfaces/ecpg/ecpglib/meson.build    |  8 ++++---
 src/interfaces/ecpg/pgtypeslib/meson.build |  8 ++++---
 src/interfaces/libpq-oauth/meson.build     |  1 +
 src/interfaces/libpq/meson.build           |  4 ++--
 src/port/meson.build                       |  1 +
 10 files changed, 45 insertions(+), 17 deletions(-)

diff --git a/.cirrus.tasks.yml b/.cirrus.tasks.yml
index 2a821593ce5..4841a204248 100644
--- a/.cirrus.tasks.yml
+++ b/.cirrus.tasks.yml
@@ -133,6 +133,7 @@ task:
       meson setup \
         --buildtype=debug \
         --auto-features=disabled \
+        -Ddefault_library=shared \
         -Dtap_tests=enabled \
         build
     EOF
diff --git a/meson.build b/meson.build
index 6d304f32fb0..f7177b7bf62 100644
--- a/meson.build
+++ b/meson.build
@@ -20,6 +20,7 @@ project('postgresql',
     'warning_level=1', #-Wall equivalent
     'b_pch=false',
     'buildtype=debugoptimized', # -O2 + debug
+    'default_library=both',
     # For compatibility with the autoconf build, set a default prefix. This
     # works even on windows, where it's a drive-relative path (i.e. when on
     # d:/somepath it'll install to d:/usr/local/pgsql)
@@ -50,6 +51,19 @@ not_found_dep = dependency('', required: false)
 thread_dep = dependency('threads')
 auto_features = get_option('auto_features')
 
+# Declare dependencies to disable static or shared libraries.  This
+# makes the 'default_library' option work even though we don't use the
+# library() function but instead shared_library() and static_library()
+# separately.
+default_library_opt = get_option('default_library')
+dep_shared_lib = declare_dependency()
+dep_static_lib = declare_dependency()
+if default_library_opt == 'shared'
+  dep_static_lib = disabler()
+elif default_library_opt == 'static'
+  dep_shared_lib = disabler()
+endif
+
 
 
 ###############################################################
@@ -3499,18 +3513,20 @@ endif
 installed_targets = [
   backend_targets,
   bin_targets,
-  libpq_st,
   pl_targets,
   contrib_targets,
   nls_mo_targets,
   ecpg_targets,
 ]
+if dep_static_lib.found()
+  installed_targets += [libpq_st]
+endif
 
 if oauth_flow_supported
-  installed_targets += [
-    libpq_oauth_so,
-    libpq_oauth_st,
-  ]
+  installed_targets += libpq_oauth_so
+  if dep_static_lib.found()
+    installed_targets += libpq_oauth_st
+  endif
 endif
 
 # all targets that require building code
diff --git a/src/common/meson.build b/src/common/meson.build
index b757618a9c9..1417ac3bbb7 100644
--- a/src/common/meson.build
+++ b/src/common/meson.build
@@ -192,6 +192,7 @@ foreach name, opts : pgcommon_variants
           opts.get('include_directories', []),
         ],
         'dependencies': opts['dependencies'] + [ssl],
+        'install': dep_static_lib.found(),
       }
     )
   pgcommon += {name: lib}
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
index a2420ea2d5c..9c9e0bcc0da 100644
--- a/src/fe_utils/meson.build
+++ b/src/fe_utils/meson.build
@@ -35,5 +35,7 @@ fe_utils = static_library('libpgfeutils',
   include_directories: [postgres_inc, libpq_inc],
   c_args: host_system == 'windows' ? ['-DFD_SETSIZE=1024'] : [],
   dependencies: frontend_common_code,
-  kwargs: default_lib_args,
+  kwargs: default_lib_args + {
+            'install': dep_static_lib.found(),
+          },
 )
diff --git a/src/interfaces/ecpg/compatlib/meson.build 
b/src/interfaces/ecpg/compatlib/meson.build
index 6cb1be73407..94dcc67c03c 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -20,17 +20,19 @@ ecpg_compat_st = static_library('libecpg_compat',
   ecpg_compat_sources,
   include_directories: ecpg_compat_inc,
   c_args: ecpg_compat_c_args,
-  dependencies: [frontend_stlib_code, thread_dep],
+  dependencies: [dep_static_lib, frontend_stlib_code, thread_dep],
   link_with: [ecpglib_st, ecpg_pgtypes_st],
   kwargs: default_lib_args,
 )
-ecpg_targets += ecpg_compat_st
+if dep_static_lib.found()
+  ecpg_targets += ecpg_compat_st
+endif
 
 ecpg_compat_so = shared_library('libecpg_compat',
   ecpg_compat_sources + ecpg_compat_so_sources,
   include_directories: ecpg_compat_inc,
   c_args: ecpg_compat_c_args,
-  dependencies: [frontend_shlib_code, thread_dep],
+  dependencies: [dep_shared_lib, frontend_shlib_code, thread_dep],
   link_with: [ecpglib_so, ecpg_pgtypes_so],
   soversion: host_system != 'windows' ? '3' : '',
   darwin_versions: ['3', '3.' + pg_version_major.to_string()],
diff --git a/src/interfaces/ecpg/ecpglib/meson.build 
b/src/interfaces/ecpg/ecpglib/meson.build
index 889bd9efd65..a81d772aa69 100644
--- a/src/interfaces/ecpg/ecpglib/meson.build
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -30,18 +30,20 @@ ecpglib_st = static_library('libecpg',
   include_directories: ecpglib_inc,
   c_args: ecpglib_c_args,
   c_pch: pch_postgres_fe_h,
-  dependencies: [frontend_stlib_code, thread_dep, libpq],
+  dependencies: [dep_static_lib, frontend_stlib_code, thread_dep, libpq],
   link_with: [ecpg_pgtypes_st],
   kwargs: default_lib_args,
 )
-ecpg_targets += ecpglib_st
+if dep_static_lib.found()
+  ecpg_targets += ecpglib_st
+endif
 
 ecpglib_so = shared_library('libecpg',
   ecpglib_sources + ecpglib_so_sources,
   include_directories: ecpglib_inc,
   c_args: ecpglib_c_args,
   c_pch: pch_postgres_fe_h,
-  dependencies: [frontend_shlib_code, libpq, thread_dep],
+  dependencies: [dep_shared_lib, frontend_shlib_code, libpq, thread_dep],
   link_with: ecpg_pgtypes_so,
   soversion: host_system != 'windows' ? '6' : '',
   darwin_versions: ['6', '6.' + pg_version_major.to_string()],
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build 
b/src/interfaces/ecpg/pgtypeslib/meson.build
index 6b78f529e53..897a8febc76 100644
--- a/src/interfaces/ecpg/pgtypeslib/meson.build
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -26,17 +26,19 @@ ecpg_pgtypes_st = static_library('libpgtypes',
   include_directories: ecpg_pgtypes_inc,
   c_args: ecpg_pgtypes_c_args,
   c_pch: pch_postgres_fe_h,
-  dependencies: frontend_stlib_code,
+  dependencies: [dep_static_lib, frontend_stlib_code],
   kwargs: default_lib_args,
 )
-ecpg_targets += ecpg_pgtypes_st
+if dep_static_lib.found()
+  ecpg_targets += ecpg_pgtypes_st
+endif
 
 ecpg_pgtypes_so = shared_library('libpgtypes',
   ecpg_pgtypes_sources + ecpg_pgtypes_so_sources,
   include_directories: ecpg_pgtypes_inc,
   c_args: ecpg_pgtypes_c_args,
   c_pch: pch_postgres_fe_h,
-  dependencies: frontend_shlib_code,
+  dependencies: [dep_shared_lib, frontend_shlib_code],
   version: '3.' + pg_version_major.to_string(),
   soversion: host_system != 'windows' ? '3' : '',
   darwin_versions: ['3', '3.' + pg_version_major.to_string()],
diff --git a/src/interfaces/libpq-oauth/meson.build 
b/src/interfaces/libpq-oauth/meson.build
index d8a0c04095a..b0083f279aa 100644
--- a/src/interfaces/libpq-oauth/meson.build
+++ b/src/interfaces/libpq-oauth/meson.build
@@ -26,6 +26,7 @@ libpq_oauth_st = static_library('libpq-oauth',
   include_directories: [libpq_oauth_inc, postgres_inc],
   c_pch: pch_postgres_fe_h,
   dependencies: [
+    dep_static_lib,
     frontend_stlib_code,
     libpq_oauth_deps,
     ssl, # libpq-int.h includes OpenSSL headers
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index c5ecd9c3a87..cb75f96c6a2 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -62,7 +62,7 @@ libpq_st = static_library('libpq',
   include_directories: [libpq_inc],
   c_args: libpq_c_args,
   c_pch: pch_postgres_fe_h,
-  dependencies: [frontend_stlib_code, libpq_deps],
+  dependencies: [dep_static_lib, frontend_stlib_code, libpq_deps],
   kwargs: default_lib_args,
 )
 
@@ -74,7 +74,7 @@ libpq_so = shared_library('libpq',
   version: '5.' + pg_version_major.to_string(),
   soversion: host_system != 'windows' ? '5' : '',
   darwin_versions: ['5', '5.' + pg_version_major.to_string()],
-  dependencies: [frontend_shlib_code, libpq_deps],
+  dependencies: [dep_shared_lib, frontend_shlib_code, libpq_deps],
   link_depends: export_file,
   link_args: export_fmt.format(export_file.full_path()),
   kwargs: default_lib_args,
diff --git a/src/port/meson.build b/src/port/meson.build
index 28655142ebe..1cc20ac770f 100644
--- a/src/port/meson.build
+++ b/src/port/meson.build
@@ -192,6 +192,7 @@ foreach name, opts : pgport_variants
       c_pch: pch_c_h,
       kwargs: opts + {
         'dependencies': opts['dependencies'] + [ssl],
+        'install': dep_static_lib.found(),
       }
     )
   pgport += {name: lib}
-- 
2.52.0

Reply via email to