diff --git a/.cirrus.yml b/.cirrus.yml index 531cfe96f6..9f2282471a 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -447,7 +447,7 @@ task: # Use /DEBUG:FASTLINK to avoid high memory usage during linking configure_script: | vcvarsall x64 - meson setup --backend ninja --buildtype debug -Dc_link_args=/DEBUG:FASTLINK -Dcassert=true -Dssl=openssl -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build + meson setup --backend ninja --buildtype debug -Dc_link_args=/DEBUG:FASTLINK -Dcassert=true -Db_pch=true -Dssl=openssl -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build build_script: | vcvarsall x64 diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build index 16f3b83e4d..163a93c98f 100644 --- a/contrib/bloom/meson.build +++ b/contrib/bloom/meson.build @@ -15,6 +15,7 @@ endif bloom = shared_module('bloom', bloom_sources, + c_pch: pch_postgres_h, kwargs: contrib_mod_args, ) contrib_targets += bloom diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build index e98c91dacc..bfb7865d21 100644 --- a/contrib/btree_gist/meson.build +++ b/contrib/btree_gist/meson.build @@ -33,6 +33,7 @@ endif btree_gist = shared_module('btree_gist', btree_gist_sources, + c_pch: pch_postgres_h, kwargs: contrib_mod_args, ) contrib_targets += btree_gist diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build index 2bb26bb772..a2a4ec36cb 100644 --- a/contrib/hstore/meson.build +++ b/contrib/hstore/meson.build @@ -18,6 +18,7 @@ endif hstore = shared_module('hstore', hstore_sources, + c_pch: pch_postgres_h, kwargs: contrib_mod_args, ) contrib_targets += hstore diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build index c8c7c07b30..839d6c4a7f 100644 --- a/contrib/pg_trgm/meson.build +++ b/contrib/pg_trgm/meson.build @@ -13,6 +13,7 @@ endif pg_trgm = shared_module('pg_trgm', pg_trgm_sources, + c_pch: pch_postgres_h, kwargs: contrib_mod_args, ) contrib_targets += pg_trgm diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build index 7fc7bbc7ca..cc782578b4 100644 --- a/contrib/pgcrypto/meson.build +++ b/contrib/pgcrypto/meson.build @@ -78,6 +78,7 @@ endif pgcrypto = shared_module('pgcrypto', pgcrypto_sources, link_with: pgcrypto_link_with, + c_pch: pch_postgres_h, kwargs: contrib_mod_args + { 'dependencies': [pgcrypto_deps, contrib_mod_args['dependencies']] }, diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build index 05e4cd46a5..42d0b0e6ce 100644 --- a/contrib/pgstattuple/meson.build +++ b/contrib/pgstattuple/meson.build @@ -12,6 +12,7 @@ endif pgstattuple = shared_module('pgstattuple', pgstattuple_sources, + c_pch: pch_postgres_h, kwargs: contrib_mod_args, ) contrib_targets += pgstattuple diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build index 8bef239e3c..1ac0fa388a 100644 --- a/contrib/sepgsql/meson.build +++ b/contrib/sepgsql/meson.build @@ -22,6 +22,7 @@ endif sepgsql = shared_module('sepgsql', sepgsql_sources, + c_pch: pch_postgres_h, kwargs: contrib_mod_args + { 'dependencies': [selinux, contrib_mod_args['dependencies']], } diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build index 89b0d67751..92ab336842 100644 --- a/contrib/xml2/meson.build +++ b/contrib/xml2/meson.build @@ -15,6 +15,7 @@ endif xml2 = shared_module('pgxml', xml2_sources, + c_pch: pch_postgres_h, kwargs: contrib_mod_args + { 'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']], }, diff --git a/meson.build b/meson.build index 25a6fa941c..f0cb01c001 100644 --- a/meson.build +++ b/meson.build @@ -15,6 +15,7 @@ project('postgresql', meson_version: '>=0.54', default_options: [ 'warning_level=1', #-Wall equivalent + 'b_pch=false', 'buildtype=release', # 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 diff --git a/src/backend/meson.build b/src/backend/meson.build index 6f4cd6ceb0..37562bae13 100644 --- a/src/backend/meson.build +++ b/src/backend/meson.build @@ -62,6 +62,7 @@ postgres_lib = static_library('postgres_lib', backend_sources + timezone_sources + generated_backend_sources, link_whole: backend_link_with, dependencies: backend_build_deps, + c_pch: pch_postgres_h, kwargs: internal_lib_args, ) @@ -81,6 +82,10 @@ if cc.get_id() == 'msvc' backend_link_args += '/DEF:@0@'.format(postgres_def.full_path()) backend_link_depends += postgres_def + # Due to the way msvc and meson's precompiled headers implementation + # interact, we need to have symbols from the full library available. Could + # be restricted to b_pch=true. + backend_link_with += postgres_lib elif host_system == 'aix' # The '.' argument leads mkldexport.sh to emit "#! .", which refers to the diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build index 974401d187..72959fa29d 100644 --- a/src/backend/snowball/meson.build +++ b/src/backend/snowball/meson.build @@ -66,6 +66,7 @@ endif dict_snowball = shared_module('dict_snowball', dict_snowball_sources, + c_pch: pch_postgres_h, kwargs: pg_mod_args + { 'include_directories': [stemmer_inc], } diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build index 3527a25c28..e66f632b54 100644 --- a/src/bin/pg_dump/meson.build +++ b/src/bin/pg_dump/meson.build @@ -13,6 +13,7 @@ pg_dump_common_sources = files( pg_dump_common = static_library('libpgdump_common', pg_dump_common_sources, + c_pch: pch_postgres_fe_h, dependencies: [frontend_code, libpq, zlib], kwargs: internal_lib_args, ) diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build index a7b927a45c..212bc9ce6e 100644 --- a/src/bin/pg_upgrade/meson.build +++ b/src/bin/pg_upgrade/meson.build @@ -24,6 +24,7 @@ endif pg_upgrade = executable('pg_upgrade', pg_upgrade_sources, + c_pch: pch_postgres_fe_h, dependencies: [frontend_code, libpq], kwargs: default_bin_args, ) diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build index 3cc393d17e..1a3ec5d129 100644 --- a/src/bin/pgbench/meson.build +++ b/src/bin/pgbench/meson.build @@ -27,6 +27,7 @@ pgbench = executable('pgbench', pgbench_sources, dependencies: [frontend_code, libpq, thread_dep], include_directories: include_directories('.'), + c_pch: pch_postgres_fe_h, c_args: host_system == 'windows' ? ['-DFD_SETSIZE=1024'] : [], kwargs: default_bin_args, ) diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build index 1264fc19fb..a4c46bf538 100644 --- a/src/bin/psql/meson.build +++ b/src/bin/psql/meson.build @@ -44,6 +44,7 @@ endif psql = executable('psql', psql_sources, + c_pch: pch_postgres_fe_h, include_directories: include_directories('.'), dependencies: [frontend_code, libpq, readline], kwargs: default_bin_args, diff --git a/src/common/meson.build b/src/common/meson.build index 23842e1ffe..1c9b8a3a01 100644 --- a/src/common/meson.build +++ b/src/common/meson.build @@ -147,6 +147,7 @@ foreach name, opts : pgcommon_variants endif c_args = opts.get('c_args', []) + common_cflags[cflagname] cflag_libs += static_library('libpgcommon@0@_@1@'.format(name, cflagname), + c_pch: pch_c_h, include_directories: include_directories('.'), kwargs: opts + { 'sources': sources, @@ -159,6 +160,7 @@ foreach name, opts : pgcommon_variants lib = static_library('libpgcommon@0@'.format(name), link_with: cflag_libs, + c_pch: pch_c_h, include_directories: include_directories('.'), kwargs: opts + { 'dependencies': opts['dependencies'] + [ssl], diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build index 3e226c260a..fe0b801387 100644 --- a/src/fe_utils/meson.build +++ b/src/fe_utils/meson.build @@ -23,6 +23,7 @@ fe_utils_sources += psqlscan fe_utils = static_library('libpgfeutils', fe_utils_sources + generated_headers, + c_pch: pch_postgres_fe_h, include_directories: [postgres_inc, libpq_inc], c_args: host_system == 'windows' ? ['-DFD_SETSIZE=1024'] : [], dependencies: frontend_common_code, diff --git a/src/include/meson.build b/src/include/meson.build index f2f7d03ff2..35c06c4856 100644 --- a/src/include/meson.build +++ b/src/include/meson.build @@ -114,6 +114,7 @@ install_headers( subdir('catalog') subdir('nodes') +subdir('pch') subdir('storage') subdir('utils') diff --git a/src/include/pch/c_pch.h b/src/include/pch/c_pch.h new file mode 100644 index 0000000000..f40c757ca6 --- /dev/null +++ b/src/include/pch/c_pch.h @@ -0,0 +1 @@ +#include "c.h" diff --git a/src/include/pch/meson.build b/src/include/pch/meson.build new file mode 100644 index 0000000000..2bcec49c3a --- /dev/null +++ b/src/include/pch/meson.build @@ -0,0 +1,4 @@ +# See https://github.com/mesonbuild/meson/issues/10338 +pch_c_h = meson.source_root() / meson.current_source_dir() / 'c_pch.h' +pch_postgres_h = meson.source_root() / meson.current_source_dir() / 'postgres_pch.h' +pch_postgres_fe_h = meson.source_root() / meson.current_source_dir() / 'postgres_fe_pch.h' diff --git a/src/include/pch/postgres_fe_pch.h b/src/include/pch/postgres_fe_pch.h new file mode 100644 index 0000000000..f3ea20912d --- /dev/null +++ b/src/include/pch/postgres_fe_pch.h @@ -0,0 +1 @@ +#include "postgres_fe.h" diff --git a/src/include/pch/postgres_pch.h b/src/include/pch/postgres_pch.h new file mode 100644 index 0000000000..71b2f35f76 --- /dev/null +++ b/src/include/pch/postgres_pch.h @@ -0,0 +1 @@ +#include "postgres.h" diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build index 7e6e6fbf5c..2d07da1ff4 100644 --- a/src/interfaces/ecpg/ecpglib/meson.build +++ b/src/interfaces/ecpg/ecpglib/meson.build @@ -27,6 +27,7 @@ ecpglib_st = static_library('libecpg', ecpglib_sources, include_directories: ecpglib_inc, c_args: ecpglib_c_args, + c_pch: pch_postgres_fe_h, dependencies: [frontend_stlib_code, thread_dep, libpq], link_with: [ecpg_pgtypes_st], kwargs: default_lib_args, @@ -37,6 +38,7 @@ 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], link_with: ecpg_pgtypes_so, soversion: host_system != 'windows' ? '6' : '', diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build index 530dd2c602..d7e1a94d24 100644 --- a/src/interfaces/ecpg/pgtypeslib/meson.build +++ b/src/interfaces/ecpg/pgtypeslib/meson.build @@ -23,6 +23,7 @@ ecpg_pgtypes_st = static_library('libpgtypes', ecpg_pgtypes_sources, include_directories: ecpg_pgtypes_inc, c_args: ecpg_pgtypes_c_args, + c_pch: pch_postgres_fe_h, dependencies: frontend_stlib_code, kwargs: default_lib_args, ) @@ -32,6 +33,7 @@ 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, version: '3.' + pg_version_major.to_string(), soversion: host_system != 'windows' ? '3' : '', diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build index 74876f039c..3d42ee439f 100644 --- a/src/interfaces/ecpg/preproc/meson.build +++ b/src/interfaces/ecpg/preproc/meson.build @@ -102,6 +102,7 @@ endif ecpg_exe = executable('ecpg', ecpg_sources, include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc], + c_pch: pch_postgres_fe_h, dependencies: [frontend_code], kwargs: default_bin_args, ) diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build index 533b2e6f77..8e696f1183 100644 --- a/src/interfaces/libpq/meson.build +++ b/src/interfaces/libpq/meson.build @@ -58,6 +58,7 @@ libpq_st = static_library('libpq', libpq_sources, include_directories: [libpq_inc], c_args: libpq_c_args, + c_pch: pch_postgres_fe_h, dependencies: [frontend_stlib_code, libpq_deps], kwargs: default_lib_args, ) @@ -66,6 +67,7 @@ libpq_so = shared_library('libpq', libpq_sources + libpq_so_sources, include_directories: [libpq_inc, postgres_inc], c_args: libpq_c_args, + c_pch: pch_postgres_fe_h, version: '5.' + pg_version_major.to_string(), soversion: host_system != 'windows' ? '5' : '', darwin_versions: ['5', '5.' + pg_version_major.to_string()], diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build index 535660085d..cd3894e6a7 100644 --- a/src/pl/plperl/meson.build +++ b/src/pl/plperl/meson.build @@ -45,6 +45,7 @@ endif plperl = shared_module('plperl', plperl_sources, + c_pch: pch_postgres_h, include_directories: [plperl_inc, postgres_inc], kwargs: pg_mod_args + { 'dependencies': [perl_dep, pg_mod_args['dependencies']], diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build index c46c0a1da2..27b2f5ef52 100644 --- a/src/pl/plpgsql/src/meson.build +++ b/src/pl/plpgsql/src/meson.build @@ -48,6 +48,7 @@ endif plpgsql = shared_module('plpgsql', plpgsql_sources, + c_pch: pch_postgres_h, include_directories: include_directories('.'), kwargs: pg_mod_args, ) diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build index 40888386b5..7bd683580e 100644 --- a/src/pl/plpython/meson.build +++ b/src/pl/plpython/meson.build @@ -36,6 +36,7 @@ endif plpython = shared_module('plpython3', plpython_sources, + c_pch: pch_postgres_h, include_directories: [plpython_inc, postgres_inc], kwargs: pg_mod_args + { 'dependencies': [python3_dep, pg_mod_args['dependencies']], diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build index f09bb14c95..7a708776c9 100644 --- a/src/pl/tcl/meson.build +++ b/src/pl/tcl/meson.build @@ -22,6 +22,7 @@ endif pltcl = shared_module('pltcl', pltcl_sources, + c_pch: pch_postgres_h, include_directories: [include_directories('.'), postgres_inc], kwargs: pg_mod_args + { 'dependencies': [tcl_dep, pg_mod_args['dependencies']], diff --git a/src/port/meson.build b/src/port/meson.build index ced2e014db..c2222696f1 100644 --- a/src/port/meson.build +++ b/src/port/meson.build @@ -161,6 +161,7 @@ foreach name, opts : pgport_variants c_args = opts.get('c_args', []) + pgport_cflags[cflagname] cflag_libs += static_library('libpgport@0@_@1@'.format(name, cflagname), sources, + c_pch: pch_c_h, kwargs: opts + { 'c_args': c_args, 'build_by_default': false, @@ -172,6 +173,7 @@ foreach name, opts : pgport_variants lib = static_library('libpgport@0@'.format(name), pgport_sources, link_with: cflag_libs, + c_pch: pch_c_h, kwargs: opts + { 'dependencies': opts['dependencies'] + [ssl], }