meson: Add windows resource files
authorAndres Freund <[email protected]>
Wed, 5 Oct 2022 16:56:05 +0000 (09:56 -0700)
committerAndres Freund <[email protected]>
Wed, 5 Oct 2022 16:56:05 +0000 (09:56 -0700)
The generated resource files aren't exactly the same ones as the old
buildsystems generate. Previously "InternalName" and "OriginalFileName" were
mostly wrong / not set (despite being required), but that was hard to fix in
at least the make build. Additionally, the meson build falls back to a
"auto-generated" description when not set, and doesn't set it in a few cases -
unlikely that anybody looks at these descriptions in detail.

Author: Andres Freund <[email protected]>
Author: Nazir Bilal Yavuz <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
118 files changed:
contrib/adminpack/meson.build
contrib/amcheck/meson.build
contrib/auth_delay/meson.build
contrib/auto_explain/meson.build
contrib/basebackup_to_shell/meson.build
contrib/basic_archive/meson.build
contrib/bloom/meson.build
contrib/bool_plperl/meson.build
contrib/btree_gin/meson.build
contrib/btree_gist/meson.build
contrib/citext/meson.build
contrib/cube/meson.build
contrib/dblink/meson.build
contrib/dict_int/meson.build
contrib/dict_xsyn/meson.build
contrib/earthdistance/meson.build
contrib/file_fdw/meson.build
contrib/fuzzystrmatch/meson.build
contrib/hstore/meson.build
contrib/hstore_plperl/meson.build
contrib/hstore_plpython/meson.build
contrib/intarray/meson.build
contrib/isn/meson.build
contrib/jsonb_plperl/meson.build
contrib/jsonb_plpython/meson.build
contrib/lo/meson.build
contrib/ltree/meson.build
contrib/ltree_plpython/meson.build
contrib/oid2name/meson.build
contrib/old_snapshot/meson.build
contrib/pageinspect/meson.build
contrib/passwordcheck/meson.build
contrib/pg_buffercache/meson.build
contrib/pg_freespacemap/meson.build
contrib/pg_prewarm/meson.build
contrib/pg_stat_statements/meson.build
contrib/pg_surgery/meson.build
contrib/pg_trgm/meson.build
contrib/pg_visibility/meson.build
contrib/pg_walinspect/meson.build
contrib/pgcrypto/meson.build
contrib/pgrowlocks/meson.build
contrib/pgstattuple/meson.build
contrib/postgres_fdw/meson.build
contrib/seg/meson.build
contrib/sepgsql/meson.build
contrib/spi/meson.build
contrib/sslinfo/meson.build
contrib/tablefunc/meson.build
contrib/tcn/meson.build
contrib/test_decoding/meson.build
contrib/tsm_system_rows/meson.build
contrib/tsm_system_time/meson.build
contrib/unaccent/meson.build
contrib/uuid-ossp/meson.build
contrib/vacuumlo/meson.build
contrib/xml2/meson.build
meson.build
src/backend/jit/llvm/meson.build
src/backend/replication/libpqwalreceiver/meson.build
src/backend/replication/pgoutput/meson.build
src/backend/snowball/meson.build
src/backend/utils/mb/conversion_procs/meson.build
src/bin/initdb/meson.build
src/bin/pg_amcheck/meson.build
src/bin/pg_archivecleanup/meson.build
src/bin/pg_basebackup/meson.build
src/bin/pg_checksums/meson.build
src/bin/pg_config/meson.build
src/bin/pg_controldata/meson.build
src/bin/pg_ctl/meson.build
src/bin/pg_dump/meson.build
src/bin/pg_resetwal/meson.build
src/bin/pg_rewind/meson.build
src/bin/pg_test_fsync/meson.build
src/bin/pg_test_timing/meson.build
src/bin/pg_upgrade/meson.build
src/bin/pg_verifybackup/meson.build
src/bin/pg_waldump/meson.build
src/bin/pgbench/meson.build
src/bin/pgevent/meson.build
src/bin/psql/meson.build
src/bin/scripts/meson.build
src/interfaces/ecpg/compatlib/meson.build
src/interfaces/ecpg/ecpglib/meson.build
src/interfaces/ecpg/pgtypeslib/meson.build
src/interfaces/ecpg/preproc/meson.build
src/interfaces/ecpg/test/meson.build
src/interfaces/libpq/meson.build
src/interfaces/libpq/test/meson.build
src/pl/plperl/meson.build
src/pl/plpgsql/src/meson.build
src/pl/plpython/meson.build
src/pl/tcl/meson.build
src/test/isolation/meson.build
src/test/modules/delay_execution/meson.build
src/test/modules/dummy_index_am/meson.build
src/test/modules/dummy_seclabel/meson.build
src/test/modules/libpq_pipeline/meson.build
src/test/modules/plsample/meson.build
src/test/modules/spgist_name_ops/meson.build
src/test/modules/ssl_passphrase_callback/meson.build
src/test/modules/test_bloomfilter/meson.build
src/test/modules/test_ddl_deparse/meson.build
src/test/modules/test_ginpostinglist/meson.build
src/test/modules/test_integerset/meson.build
src/test/modules/test_lfind/meson.build
src/test/modules/test_oat_hooks/meson.build
src/test/modules/test_parser/meson.build
src/test/modules/test_predtest/meson.build
src/test/modules/test_rbtree/meson.build
src/test/modules/test_regex/meson.build
src/test/modules/test_rls_hooks/meson.build
src/test/modules/test_shm_mq/meson.build
src/test/modules/worker_spi/meson.build
src/test/regress/meson.build
src/timezone/meson.build
src/tools/rcgen [new file with mode: 0755]

index fc2368d02cf83471e178199dfdc9bbebbaddddf9..7efec0efbc044708d79985b20583984fa5afc76c 100644 (file)
@@ -1,5 +1,15 @@
+adminpack_sources = files(
+  'adminpack.c',
+)
+
+if host_system == 'windows'
+  adminpack_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'adminpack',
+    '--FILEDESC', 'adminpack - support functions for pgAdmin',])
+endif
+
 adminpack = shared_module('adminpack',
-  ['adminpack.c'],
+  adminpack_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += adminpack
index e958c128eb5013f6c8016b844bf5a3859190fc3e..2194a9112460f12454f33d0d2ac78b39a080d15b 100644 (file)
@@ -1,7 +1,16 @@
-amcheck = shared_module('amcheck', [
-    'verify_heapam.c',
-    'verify_nbtree.c',
-  ],
+amcheck_sources = files(
+  'verify_heapam.c',
+  'verify_nbtree.c',
+)
+
+if host_system == 'windows'
+  amcheck_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'amcheck',
+    '--FILEDESC', 'amcheck - function for verifying relation integrity',])
+endif
+
+amcheck = shared_module('amcheck',
+  amcheck_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += amcheck
index d2e01968f548afed821e50b9cfe5d6b37272c503..c4ffb0663bc80de31ad3c97241ab1bd0d24799e9 100644 (file)
@@ -1,5 +1,15 @@
+auth_delay_sources = files(
+  'auth_delay.c',
+)
+
+if host_system == 'windows'
+  auth_delay_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'auth_delay',
+    '--FILEDESC', 'auth_delay - delay authentication failure reports',])
+endif
+
 autoinc = shared_module('auth_delay',
-  ['auth_delay.c'],
+  auth_delay_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += autoinc
index 249a8376faabb3663b932f3def60d8cfaae1bb9a..76f86617850c73eb33059f093c2a735edf8d5c50 100644 (file)
@@ -1,5 +1,15 @@
+auto_explain_sources = files(
+  'auto_explain.c',
+)
+
+if host_system == 'windows'
+  auto_explain_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'auto_explain',
+    '--FILEDESC', 'auto_explain - logging facility for execution plans',])
+endif
+
 auto_explain = shared_module('auto_explain',
-  files('auto_explain.c'),
+  auto_explain_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += auto_explain
index 9f0517f170141d626ee91292d63e6afdb0ed2fd1..3a389de9175fb7e40177db78edaa7c882c658dab 100644 (file)
@@ -2,6 +2,12 @@ basebackup_to_shell_sources = files(
   'basebackup_to_shell.c',
 )
 
+if host_system == 'windows'
+  basebackup_to_shell_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'basebackup_to_shell',
+    '--FILEDESC', 'basebackup_to_shell - target basebackup to shell command',])
+endif
+
 basebackup_to_shell = shared_module('basebackup_to_shell',
   basebackup_to_shell_sources,
   kwargs: contrib_mod_args,
index b67cbef60bd26d5eb2c565de838b7e35b18e68b9..c30dcfa5d41f9232f96159ed8456fff7d7648ef3 100644 (file)
@@ -2,6 +2,12 @@ basic_archive_sources = files(
   'basic_archive.c',
 )
 
+if host_system == 'windows'
+  basic_archive_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'basic_archive',
+    '--FILEDESC', 'basic_archive - basic archive module',])
+endif
+
 basic_archive = shared_module('basic_archive',
   basic_archive_sources,
   kwargs: contrib_mod_args,
index 1fe7632bdbee80205e918af305b8abf2c610b983..16f3b83e4d2f1d4f4f5c82914d5a0e07c7cd5036 100644 (file)
@@ -7,6 +7,12 @@ bloom_sources = files(
   'blvalidate.c',
 )
 
+if host_system == 'windows'
+  bloom_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'bloom',
+    '--FILEDESC', 'bloom access method - signature file based index',])
+endif
+
 bloom = shared_module('bloom',
   bloom_sources,
   kwargs: contrib_mod_args,
index c20b667d75f5f775ab81ef769950f496f5a997dd..a68daab0dcdd5a74ad6e1c2974e896d90bd8e536 100644 (file)
@@ -6,6 +6,12 @@ bool_plperl_sources = files(
   'bool_plperl.c',
 )
 
+if host_system == 'windows'
+  bool_plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'bool_plperl',
+    '--FILEDESC', 'bool_plperl - bool transform for plperl',])
+endif
+
 bool_plperl = shared_module('bool_plperl',
   bool_plperl_sources,
   include_directories: [plperl_inc, include_directories('.')],
index 15d6d31a6eeb86a957d572e50c8318308481e8d1..fd4c76767a7dc3f209d9f07e99392cbe1455041d 100644 (file)
@@ -1,5 +1,15 @@
+btree_gin_sources = files(
+  'btree_gin.c',
+)
+
+if host_system == 'windows'
+  btree_gin_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'btree_gin',
+    '--FILEDESC', 'btree_gin - B-tree equivalent GIN operator classes',])
+endif
+
 btree_gin = shared_module('btree_gin',
-  files('btree_gin.c'),
+  btree_gin_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += btree_gin
index c0a8d2385400e64f4deb5cbb25bea8b284657a60..e98c91dacc8114c56667d2ce70a5c6a6b379e693 100644 (file)
@@ -25,6 +25,12 @@ btree_gist_sources = files(
   'btree_uuid.c',
 )
 
+if host_system == 'windows'
+  btree_gist_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'btree_gist',
+    '--FILEDESC', 'btree_gist - B-tree equivalent GiST operator classes',])
+endif
+
 btree_gist = shared_module('btree_gist',
   btree_gist_sources,
   kwargs: contrib_mod_args,
index ca60eded80bc317c2b05f3cbe50ba3d3a5e6c4c3..26a101a19bdda3cb2fbb7a28f1a16a993aae2682 100644 (file)
@@ -2,6 +2,12 @@ citext_sources = files(
   'citext.c',
 )
 
+if host_system == 'windows'
+  citext_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'citext',
+    '--FILEDESC', 'citext - case-insensitive character string data type',])
+endif
+
 citext = shared_module('citext',
   citext_sources,
   kwargs: contrib_mod_args,
index 72342b0c82ce9394d40fc3d9a41268dcb4c69f98..041acf95a90025a5511736f510bc581b22c6b4ce 100644 (file)
@@ -17,6 +17,12 @@ cube_parse = custom_target('cubeparse',
 generated_sources += cube_parse.to_list()
 cube_sources += cube_parse
 
+if host_system == 'windows'
+  cube_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'cube',
+    '--FILEDESC', 'cube - multidimensional cube data type',])
+endif
+
 cube = shared_module('cube',
   cube_sources,
   include_directories: include_directories('.'),
index d35f7b5d49ec586a112b30e65f63f0977cfa85ec..66eeb03b736dcf19e160524e4ad10c35d7d7c967 100644 (file)
@@ -2,6 +2,12 @@ dblink_sources = files(
   'dblink.c',
 )
 
+if host_system == 'windows'
+  dblink_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dblink',
+    '--FILEDESC', 'dblink - connect to other PostgreSQL databases',])
+endif
+
 dblink = shared_module('dblink',
   dblink_sources,
   kwargs: contrib_mod_args + {
index f00e80856198ad0053e1de8270dd96aa92cbd1b1..6fff921adda09ed6e0118674970e263e3b57bbd3 100644 (file)
@@ -1,5 +1,15 @@
+dict_int_sources = files(
+  'dict_int.c',
+)
+
+if host_system == 'windows'
+  dict_int_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dict_int',
+    '--FILEDESC', 'dict_int - add-on dictionary template for full-text search',])
+endif
+
 dict_int = shared_module('dict_int',
-  files('dict_int.c'),
+  dict_int_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += dict_int
index be53f55bb79b078878af9916c687e22f79547124..fabd505a7df7e9a012cd3417024f5638576abe8e 100644 (file)
@@ -1,5 +1,15 @@
+dict_xsyn_sources = files(
+  'dict_xsyn.c',
+)
+
+if host_system == 'windows'
+  dict_xsyn_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dict_xsyn',
+    '--FILEDESC', 'dict_xsyn - add-on dictionary template for full-text search',])
+endif
+
 dict_xsyn = shared_module('dict_xsyn',
-  files('dict_xsyn.c'),
+  dict_xsyn_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += dict_xsyn
index 807f5cb7de3f33a5fc145971f5003bb87a4db0f9..78dc29c3da31149cd278a5f3bce69947a57bf256 100644 (file)
@@ -1,5 +1,15 @@
+earthdistance_sources = files(
+  'earthdistance.c',
+)
+
+if host_system == 'windows'
+  earthdistance_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'earthdistance',
+    '--FILEDESC', 'earthdistance - calculate distances on the surface of the Earth',])
+endif
+
 earthdistance = shared_module('earthdistance',
-  files('earthdistance.c'),
+  earthdistance_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += earthdistance
index f13efb6e38e4267232046555dfa1e0c02978ad5a..c4071faa66968895e928fc90da5c5922bbd6d1ee 100644 (file)
@@ -1,5 +1,15 @@
+file_fdw_sources = files(
+  'file_fdw.c',
+)
+
+if host_system == 'windows'
+  file_fdw_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'file_fdw',
+    '--FILEDESC', 'file_fdw - foreign data wrapper for files',])
+endif
+
 file_fdw = shared_module('file_fdw',
-  files('file_fdw.c'),
+  file_fdw_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += file_fdw
index ec278a6211ea9afa55c944dc7cfb347e6d9c3dd2..e6d06149cec72785fc8bb02e5c05674e9395c567 100644 (file)
@@ -1,8 +1,16 @@
+fuzzystrmatch_sources = files(
+  'fuzzystrmatch.c',
+  'dmetaphone.c',
+)
+
+if host_system == 'windows'
+  fuzzystrmatch_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'fuzzystrmatch',
+    '--FILEDESC', 'fuzzystrmatch - similarities and distance between strings',])
+endif
+
 fuzzystrmatch = shared_module('fuzzystrmatch',
-  files(
-    'fuzzystrmatch.c',
-    'dmetaphone.c'
-  ),
+  fuzzystrmatch_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += fuzzystrmatch
index 07c59f40a975b0b25911ed0c1a4a3c62efcf39ba..2bb26bb772b1e30b28a9f37a1d189ff7707d1edb 100644 (file)
@@ -1,15 +1,23 @@
 # .. so that includes of hstore/hstore.h work
 hstore_inc = include_directories('.', '../')
 
+hstore_sources = files(
+  'hstore_compat.c',
+  'hstore_gin.c',
+  'hstore_gist.c',
+  'hstore_io.c',
+  'hstore_op.c',
+  'hstore_subs.c',
+)
+
+if host_system == 'windows'
+  hstore_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'hstore',
+    '--FILEDESC', 'hstore - key/value pair data type',])
+endif
+
 hstore = shared_module('hstore',
-  files(
-    'hstore_compat.c',
-    'hstore_gin.c',
-    'hstore_gist.c',
-    'hstore_io.c',
-    'hstore_op.c',
-    'hstore_subs.c',
-  ),
+  hstore_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += hstore
index bbafa0221bdc570427029f2e9fce1163907f54a0..a238fee6a26a781987aaef9e3833700fd833c302 100644 (file)
@@ -6,6 +6,12 @@ hstore_plperl_sources = files(
   'hstore_plperl.c',
 )
 
+if host_system == 'windows'
+  hstore_plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'hstore_plperl',
+    '--FILEDESC', 'hstore_plperl - hstore transform for plperl',])
+endif
+
 hstore_plperl = shared_module('hstore_plperl',
   hstore_plperl_sources,
   include_directories: [plperl_inc, hstore_inc],
index 214b48519a97287153953d6df3cf42c4322b9055..6071aaeb4b3667f26bddd7a595664749def00615 100644 (file)
@@ -6,6 +6,12 @@ hstore_plpython_sources = files(
   'hstore_plpython.c',
 )
 
+if host_system == 'windows'
+  hstore_plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'hstore_plpython3',
+    '--FILEDESC', 'hstore_plpython - hstore transform for plpython',])
+endif
+
 hstore_plpython = shared_module('hstore_plpython3',
   hstore_plpython_sources,
   include_directories: [plpython_inc, hstore_inc, ],
index 1655bcbb3fdef6787548cf6229ae0c93af900480..b7cf1ce0cadb1344b6efffdbd518b6277f08c2b3 100644 (file)
@@ -8,6 +8,12 @@ intarray_sources = files(
   '_intbig_gist.c',
 )
 
+if host_system == 'windows'
+  intarray_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', '_int',
+    '--FILEDESC', 'intarray - functions and operators for arrays of integers',])
+endif
+
 intarray = shared_module('_int',
   intarray_sources,
   kwargs: contrib_mod_args,
index cc30bbeb55ce836a622b1068a58ffa5d59500553..db68a718313b586e889c1eebae431a821e6fd513 100644 (file)
@@ -2,6 +2,12 @@ isn_sources = files(
   'isn.c',
 )
 
+if host_system == 'windows'
+  isn_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'isn',
+    '--FILEDESC', 'isn - data types for international product numbering standards',])
+endif
+
 isn = shared_module('isn',
   isn_sources,
   kwargs: contrib_mod_args,
index 5c915d8ed94c6e999fe3a03bb9b384f44cb2840f..071a7a98d2c6a67c6a2146e851b9e04dbd262db5 100644 (file)
@@ -6,6 +6,12 @@ jsonb_plperl_sources = files(
   'jsonb_plperl.c',
 )
 
+if host_system == 'windows'
+  jsonb_plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'jsonb_plperl',
+    '--FILEDESC', 'jsonb_plperl - jsonb transform for plperl',])
+endif
+
 jsonb_plperl = shared_module('jsonb_plperl',
   jsonb_plperl_sources,
   include_directories: [plperl_inc],
index de8e1105c6ac67f78759f98c6db8df49a6386ff5..84dc1161e8b557c8767f8eb1ebc42547f36436ab 100644 (file)
@@ -6,6 +6,12 @@ jsonb_plpython_sources = files(
   'jsonb_plpython.c',
 )
 
+if host_system == 'windows'
+  jsonb_plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'jsonb_plpython3',
+    '--FILEDESC', 'jsonb_plpython - jsonb transform for plpython',])
+endif
+
 jsonb_plpython = shared_module('jsonb_plpython3',
   jsonb_plpython_sources,
   include_directories: [plpython_inc],
index 9082d5713c7d3c9ff16121173d10eb32ae35b712..61ae131f1cc49118d9c56a6c11a3aebcf3660329 100644 (file)
@@ -2,6 +2,12 @@ lo_sources = files(
   'lo.c',
 )
 
+if host_system == 'windows'
+  lo_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'lo',
+    '--FILEDESC', 'lo - management for large objects',])
+endif
+
 lo = shared_module('lo',
   lo_sources,
   kwargs: contrib_mod_args,
index 9463fc2c5e53109fc3299bd514c911722c843101..421292cea9d0f96d457fa31153073692311574d8 100644 (file)
@@ -13,6 +13,12 @@ ltree_sources = files(
 # .. so that includes of ltree/ltree.h work
 ltree_inc = include_directories('.', '../')
 
+if host_system == 'windows'
+  ltree_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ltree',
+    '--FILEDESC', 'ltree - hierarchical label data type',])
+endif
+
 ltree = shared_module('ltree',
   ltree_sources,
   kwargs: contrib_mod_args,
index 429d75006aafd49839ec3afe5baf7a96dabf819c..acf5e4a6fc8c723c5afdf5b80a09c9f40f36411f 100644 (file)
@@ -6,6 +6,12 @@ ltree_plpython_sources = files(
   'ltree_plpython.c',
 )
 
+if host_system == 'windows'
+  ltree_plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ltree_plpython3',
+    '--FILEDESC', 'ltree_plpython - ltree transform for plpython',])
+endif
+
 ltree_plpython = shared_module('ltree_plpython3',
   ltree_plpython_sources,
   include_directories: [plpython_inc, ltree_inc],
index 1dad5d8f6e73a33fb752d52dda6b88f6d34f6720..1a248f19260ba98410966d20ab9e05b1813f5d21 100644 (file)
@@ -1,5 +1,15 @@
+oid2name_sources = files(
+  'oid2name.c',
+)
+
+if host_system == 'windows'
+  oid2name_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'oid2name',
+    '--FILEDESC', 'oid2name - examine the file structure',])
+endif
+
 oid2name = executable('oid2name',
-  ['oid2name.c'],
+  oid2name_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
index 8e7ee09a43a317a2a9c2ddb2608eef7654cbcd1e..77276c3715a685d9bdbf838390ea561207adfeb4 100644 (file)
@@ -2,6 +2,12 @@ old_snapshot_sources = files(
   'time_mapping.c',
 )
 
+if host_system == 'windows'
+  old_snapshot_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'old_snapshot',
+    '--FILEDESC', 'old_snapshot - utilities in support of old_snapshot_threshold',])
+endif
+
 old_snapshot = shared_module('old_snapshot',
   old_snapshot_sources,
   kwargs: contrib_mod_args,
index 4af8153e4fd497086bfde5291904fece744bde2f..3ec50b9445e6a8e9f2027e571edb365e79a4fac7 100644 (file)
@@ -9,6 +9,12 @@ pageinspect_sources = files(
   'rawpage.c',
 )
 
+if host_system == 'windows'
+  pageinspect_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pageinspect',
+    '--FILEDESC', 'pageinspect - functions to inspect contents of database pages',])
+endif
+
 pageinspect = shared_module('pageinspect',
   pageinspect_sources,
   kwargs: contrib_mod_args,
index 7da47d02f1d0069e43d73890c86e7c2356b4dd40..383d7df372ac5edbf2d198139a86577f41e90c56 100644 (file)
@@ -9,6 +9,12 @@ passwordcheck_deps = []
 # passwordcheck_c_args += ['-DUSE_CRACKLIB', '-DCRACKLIB_DICTPATH="/usr/lib/cracklib_dict"']
 # passwordcheck_deps += [cc.find_library('crack')]
 
+if host_system == 'windows'
+  passwordcheck_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'passwordcheck',
+    '--FILEDESC', 'passwordcheck - strengthen user password checks',])
+endif
+
 passwordcheck = shared_module('passwordcheck',
   passwordcheck_sources,
   c_args: passwordcheck_c_args,
index 2c69eae3ea24689ba99e372bcf0e96d7545db502..dd9948e5f0bafa53d710fce1283539c409d71e1f 100644 (file)
@@ -1,7 +1,15 @@
+pg_buffercache_sources = files(
+  'pg_buffercache_pages.c',
+)
+
+if host_system == 'windows'
+  pg_buffercache_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_buffercache',
+    '--FILEDESC', 'pg_buffercache - monitoring of shared buffer cache in real-time',])
+endif
+
 pg_buffercache = shared_module('pg_buffercache',
-  files(
-    'pg_buffercache_pages.c',
-  ),
+  pg_buffercache_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_buffercache
index f795014d7ca40a39ca370d9e6d4c749fc8605a8f..904b37b6e9b4f701a9ced1b9711b1538060f5e12 100644 (file)
@@ -1,7 +1,15 @@
+pg_freespacemap_sources = files(
+  'pg_freespacemap.c',
+)
+
+if host_system == 'windows'
+  pg_freespacemap_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_freespacemap',
+    '--FILEDESC', 'pg_freespacemap - monitoring of free space map',])
+endif
+
 pg_freespacemap = shared_module('pg_freespacemap',
-  files(
-    'pg_freespacemap.c',
-  ),
+  pg_freespacemap_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_freespacemap
index bdca9af4f2707e8961ca60369e1b84bdd1279069..b7140cee34b1963a79525c929794ebfba1d53074 100644 (file)
@@ -1,8 +1,16 @@
+pg_prewarm_sources = files(
+  'autoprewarm.c',
+  'pg_prewarm.c',
+)
+
+if host_system == 'windows'
+  pg_prewarm_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_prewarm',
+    '--FILEDESC', 'pg_prewarm - preload relation data into system buffer cache',])
+endif
+
 pg_prewarm = shared_module('pg_prewarm',
-  files(
-    'autoprewarm.c',
-    'pg_prewarm.c',
-  ),
+  pg_prewarm_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_prewarm
index ac117d2fc1db639fea23e23f9a97b571e8510625..854df138e762d546d43f0efef25269df714210f4 100644 (file)
@@ -1,5 +1,15 @@
+pg_stat_statements_sources = files(
+  'pg_stat_statements.c',
+)
+
+if host_system == 'windows'
+  pg_stat_statements_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_stat_statements',
+    '--FILEDESC', 'pg_stat_statements - execution statistics of SQL statements',])
+endif
+
 pg_stat_statements = shared_module('pg_stat_statements',
-  files('pg_stat_statements.c'),
+  pg_stat_statements_sources,
   kwargs: contrib_mod_args + {
     'dependencies': contrib_mod_args['dependencies'],
   },
index ac71caa5276df236ffac7149ae57e0ccaf1c625a..7b5c5999f4b579ccc78833f1c55ac9e02cdd3830 100644 (file)
@@ -1,7 +1,15 @@
+pg_surgery_sources = files(
+  'heap_surgery.c',
+)
+
+if host_system == 'windows'
+  pg_surgery_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_surgery',
+    '--FILEDESC', 'pg_surgery - perform surgery on a damaged relation',])
+endif
+
 pg_surgery = shared_module('pg_surgery',
-  files(
-    'heap_surgery.c',
-  ),
+  pg_surgery_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_surgery
index a90628d23c6e33d0af27477b15766ba89272d3a0..c8c7c07b308ac8f85bff0e18fade5d397717c4aa 100644 (file)
@@ -1,10 +1,18 @@
+pg_trgm_sources = files(
+  'trgm_gin.c',
+  'trgm_gist.c',
+  'trgm_op.c',
+  'trgm_regexp.c',
+)
+
+if host_system == 'windows'
+  pg_trgm_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_trgm',
+    '--FILEDESC', 'pg_trgm - trigram matching',])
+endif
+
 pg_trgm = shared_module('pg_trgm',
-  files(
-    'trgm_gin.c',
-    'trgm_gist.c',
-    'trgm_op.c',
-    'trgm_regexp.c',
-  ),
+  pg_trgm_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_trgm
index 933dc99ac4daa7d413543e7304e7b92e651d36be..263a0d08b8214525bd9f1a1f7eb0cd0a0b1d0cfe 100644 (file)
@@ -1,7 +1,15 @@
+pg_visibility_sources = files(
+  'pg_visibility.c',
+)
+
+if host_system == 'windows'
+  pg_visibility_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_visibility',
+    '--FILEDESC', 'pg_visibility - page visibility information',])
+endif
+
 pg_visibility = shared_module('pg_visibility',
-  files(
-    'pg_visibility.c',
-  ),
+  pg_visibility_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_visibility
index d6b27877dd083752cab1af2b366ff471686adc51..4314a3182a24618fe60bace6845d8566c2d69859 100644 (file)
@@ -1,5 +1,11 @@
 pg_walinspect_sources = files('pg_walinspect.c')
 
+if host_system == 'windows'
+  pg_walinspect_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_walinspect',
+    '--FILEDESC', 'pg_walinspect - functions to inspect contents of PostgreSQL Write-Ahead Log',])
+endif
+
 pg_walinspect = shared_module('pg_walinspect',
   pg_walinspect_sources,
   kwargs: contrib_mod_args + {
index fe0851bf8e8c5d3f65242f0a19f1848b32ef28be..7fc7bbc7ca14279ab282ce4aff1ec89a1055e6b2 100644 (file)
@@ -69,6 +69,12 @@ else
   pgcrypto_regress += 'pgp-zlib-DISABLED'
 endif
 
+if host_system == 'windows'
+  pgcrypto_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgcrypto',
+    '--FILEDESC', 'pgcrypto - cryptographic functions',])
+endif
+
 pgcrypto = shared_module('pgcrypto',
   pgcrypto_sources,
   link_with: pgcrypto_link_with,
index 1b41691a2a359bc39fc354d1ef6b1fcd348b26a0..8092f0d4a64f3f04efe66646b9c33f40da1b8e59 100644 (file)
@@ -1,7 +1,15 @@
+pgrowlocks_sources = files(
+  'pgrowlocks.c',
+)
+
+if host_system == 'windows'
+  pgrowlocks_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgrowlocks',
+    '--FILEDESC', 'pgrowlocks - display row locking information',])
+endif
+
 pgrowlocks = shared_module('pgrowlocks',
-  files(
-    'pgrowlocks.c',
-  ),
+  pgrowlocks_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pgrowlocks
index 8e828692d5cc66da9c559227a7b9bacbc7355243..05e4cd46a5c71fd06455c682063add2898b05dd5 100644 (file)
@@ -1,9 +1,17 @@
+pgstattuple_sources = files(
+  'pgstatapprox.c',
+  'pgstatindex.c',
+  'pgstattuple.c',
+)
+
+if host_system == 'windows'
+  pgstattuple_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgstattuple',
+    '--FILEDESC', 'pgstattuple - tuple-level statistics',])
+endif
+
 pgstattuple = shared_module('pgstattuple',
-  files(
-    'pgstatapprox.c',
-    'pgstatindex.c',
-    'pgstattuple.c',
-  ),
+  pgstattuple_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pgstattuple
index 378885ec93bcae745baac017e0d2394d44612c82..d3746ff135cee562539724c7d06e86d062f4463e 100644 (file)
@@ -6,6 +6,12 @@ postgres_fdw_sources = files(
   'shippable.c',
 )
 
+if host_system == 'windows'
+  postgres_fdw_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'postgres_fdw',
+    '--FILEDESC', 'postgres_fdw - foreign data wrapper for PostgreSQL',])
+endif
+
 postgres_fdw = shared_module('postgres_fdw',
   postgres_fdw_sources,
   kwargs: contrib_mod_args + {
index e476eab2a7702331dc4ec10e2644e5af4b439a9b..c6fbb22999b6111bb0e556dcffb34d5938189bfb 100644 (file)
@@ -17,6 +17,12 @@ seg_parse = custom_target('segparse',
 generated_sources += seg_parse.to_list()
 seg_sources += seg_parse
 
+if host_system == 'windows'
+  seg_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'seg',
+    '--FILEDESC', 'seg - line segment data type',])
+endif
+
 seg = shared_module('seg',
   seg_sources,
   include_directories: include_directories('.'),
index 60a95e17c2fc470fd1dc9689e96d9744e0316ccc..8bef239e3c2e7f7a993793a21ce956a011dc4fb5 100644 (file)
@@ -14,6 +14,12 @@ sepgsql_sources = files(
   'uavc.c',
 )
 
+if host_system == 'windows'
+  sepgsql_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'sepgsql',
+    '--FILEDESC', 'sepgsql - SELinux integration',])
+endif
+
 sepgsql = shared_module('sepgsql',
   sepgsql_sources,
   kwargs: contrib_mod_args + {
index 98008980ec24adc95728749430eefc42b3251d82..e7d78189ef5554eb20c7e4a5b20912628823fedc 100644 (file)
@@ -1,5 +1,15 @@
+autoinc_sources = files(
+  'autoinc.c',
+)
+
+if host_system == 'windows'
+  autoinc_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'autoinc',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 autoinc = shared_module('autoinc',
-  ['autoinc.c'],
+  autoinc_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += autoinc
@@ -9,8 +19,18 @@ install_data('autoinc.control', 'autoinc--1.0.sql',
 )
 
 
+insert_username_sources = files(
+  'insert_username.c',
+)
+
+if host_system == 'windows'
+  insert_username_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'insert_username',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 insert_username = shared_module('insert_username',
-  ['insert_username.c'],
+  insert_username_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += insert_username
@@ -22,8 +42,18 @@ install_data(
 )
 
 
+moddatetime_sources = files(
+  'moddatetime.c',
+)
+
+if host_system == 'windows'
+  moddatetime_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'moddatetime',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 moddatetime = shared_module('moddatetime',
-  ['moddatetime.c'],
+  moddatetime_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += moddatetime
@@ -38,8 +68,18 @@ install_data(
 # comment out if you want a quieter refint package for other uses
 refint_cflags = ['-DREFINT_VERBOSE']
 
+refint_sources = files(
+  'refint.c',
+)
+
+if host_system == 'windows'
+  refint_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'refint',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 refint = shared_module('refint',
-  ['refint.c'],
+  refint_sources,
   c_args: refint_cflags,
   kwargs: contrib_mod_args,
 )
index 53f752a08acf9d0ec1881d9de7eba53acc364b00..136983e783d58c03d418bc4743ce13742841ec74 100644 (file)
@@ -2,10 +2,18 @@ if not ssl.found()
   subdir_done()
 endif
 
+sslinfo_sources = files(
+  'sslinfo.c',
+)
+
+if host_system == 'windows'
+  sslinfo_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'sslinfo',
+    '--FILEDESC', 'sslinfo - information about client SSL certificate',])
+endif
+
 sslinfo = shared_module('sslinfo',
-  files(
-    'sslinfo.c',
-  ),
+  sslinfo_sources,
   kwargs: contrib_mod_args + {
     'dependencies': [ssl, contrib_mod_args['dependencies']],
   }
index f4230096c0c908bb30100e6a9f5b657fb0463060..d2ddc8d3b398e7b0812c645b9306cc0dd07cd99b 100644 (file)
@@ -1,7 +1,15 @@
+tablefunc_sources = files(
+  'tablefunc.c',
+)
+
+if host_system == 'windows'
+  tablefunc_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tablefunc',
+    '--FILEDESC', 'tablefunc - various functions that return tables',])
+endif
+
 tablefunc = shared_module('tablefunc',
-  files(
-    'tablefunc.c',
-  ),
+  tablefunc_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tablefunc
index c3a025247d4cfa93d98b902db640fe5a757f899e..71261c3b0a2b17f3e271352fb118cf86e53ba4da 100644 (file)
@@ -1,7 +1,15 @@
+tcn_sources = files(
+  'tcn.c',
+)
+
+if host_system == 'windows'
+  tcn_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tcn',
+    '--FILEDESC', 'tcn - trigger function notifying listeners',])
+endif
+
 tcn = shared_module('tcn',
-  files(
-    'tcn.c',
-  ),
+  tcn_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tcn
index dd7cb0101ad3e62a9f9a8ae223932b974dd3a628..6376103c689856af0274c6a08c5e6742105a56e7 100644 (file)
@@ -2,6 +2,12 @@ test_decoding_sources = files(
   'test_decoding.c',
 )
 
+if host_system == 'windows'
+  test_decoding_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_decoding',
+    '--FILEDESC', 'test_decoding - example of a logical decoding output plugin',])
+endif
+
 test_decoding = shared_module('test_decoding',
   test_decoding_sources,
   kwargs: contrib_mod_args,
index b9cd42115a8748297661e8ac763f035efc6f75fc..380abb498835f92ac4c7d16cba942211564bed43 100644 (file)
@@ -1,7 +1,15 @@
+tsm_system_rows_sources = files(
+  'tsm_system_rows.c',
+)
+
+if host_system == 'windows'
+  tsm_system_rows_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tsm_system_rows',
+    '--FILEDESC', 'tsm_system_rows - TABLESAMPLE method which accepts number of rows as a limit',])
+endif
+
 tsm_system_rows = shared_module('tsm_system_rows',
-  files(
-    'tsm_system_rows.c',
-  ),
+  tsm_system_rows_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tsm_system_rows
index 18015912ffb14eaa373b1b621c6ac5c4da142431..e57a2702c602bc2080418ff3472277294ac49eac 100644 (file)
@@ -1,7 +1,15 @@
+tsm_system_time_sources = files(
+  'tsm_system_time.c',
+)
+
+if host_system == 'windows'
+  tsm_system_time_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tsm_system_time',
+    '--FILEDESC', 'tsm_system_time - TABLESAMPLE method which accepts time in milliseconds as a limit',])
+endif
+
 tsm_system_time = shared_module('tsm_system_time',
-  files(
-    'tsm_system_time.c',
-  ),
+  tsm_system_time_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tsm_system_time
index 872b76e32230fe3733b734465c3c0934bcd16b74..438035132f811d4aca164b2e1edec7bf153b53dd 100644 (file)
@@ -1,7 +1,15 @@
+unaccent_sources = files(
+  'unaccent.c',
+)
+
+if host_system == 'windows'
+  unaccent_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'unaccent',
+    '--FILEDESC', 'unaccent - text search dictionary that removes accents',])
+endif
+
 unaccent = shared_module('unaccent',
-  files(
-    'unaccent.c',
-  ),
+  unaccent_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += unaccent
index da6d1d75c12f2f36708f150ad77b034f561a6814..28730f398f024fa4d19842f4883591b85338794d 100644 (file)
@@ -2,10 +2,18 @@ if not uuid.found()
   subdir_done()
 endif
 
+uuid_ossp_sources = files(
+  'uuid-ossp.c',
+)
+
+if host_system == 'windows'
+  uuid_ossp_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'uuid-ossp',
+    '--FILEDESC', 'uuid-ossp - UUID generation',])
+endif
+
 uuid_ossp = shared_module('uuid-ossp',
-  files(
-    'uuid-ossp.c',
-  ),
+  uuid_ossp_sources,
   kwargs: contrib_mod_args + {
     'dependencies': [uuid, contrib_mod_args['dependencies']],
   },
index 7a632b87d1bd9d6dd41d88b11944c1e04db80a88..846de47dbd13d7777f480b019b7017723faac321 100644 (file)
@@ -1,5 +1,15 @@
+vacuumlo_sources = files(
+  'vacuumlo.c',
+)
+
+if host_system == 'windows'
+  vacuumlo_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'vacuumlo',
+    '--FILEDESC', 'vacuumlo - removes orphaned large objects',])
+endif
+
 vacuumlo = executable('vacuumlo',
-  ['vacuumlo.c'],
+  vacuumlo_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
index 9c0b56f01f61f292545aa6659b822f95c609e914..89b0d677516036e51d33842268426f0919606a31 100644 (file)
@@ -2,11 +2,19 @@ if not libxml.found()
   subdir_done()
 endif
 
+xml2_sources = files(
+  'xpath.c',
+  'xslt_proc.c',
+)
+
+if host_system == 'windows'
+  xml2_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgxml',
+    '--FILEDESC', 'xml2 - XPath querying and XSLT',])
+endif
+
 xml2 = shared_module('pgxml',
-  files(
-    'xpath.c',
-    'xslt_proc.c',
-  ),
+  xml2_sources,
   kwargs: contrib_mod_args + {
     'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
   },
index c709643fe5ee2d01d608fd8a693762068f3efce2..25a6fa941ccb7390354b8076081562eb55f9136f 100644 (file)
@@ -2564,6 +2564,65 @@ gen_export_kwargs = {
 
 
 
+###
+### windows resources related stuff
+###
+
+if host_system == 'windows'
+  pg_ico = meson.source_root() / 'src' / 'port' / 'win32.ico'
+  win32ver_rc = files('src/port/win32ver.rc')
+  rcgen = find_program('src/tools/rcgen', native: true)
+
+  rcgen_base_args = [
+    '--srcdir', '@SOURCE_DIR@',
+    '--builddir', meson.build_root(),
+    '--rcout', '@OUTPUT0@',
+    '--out', '@OUTPUT1@',
+    '--input', '@INPUT@',
+    '@EXTRA_ARGS@',
+  ]
+
+  if cc.get_argument_syntax() == 'msvc'
+    rc = find_program('rc', required: true)
+    rcgen_base_args += ['--rc', rc.path()]
+    rcgen_outputs = ['@[email protected]', '@[email protected]']
+  else
+    windres = find_program('windres', required: true)
+    rcgen_base_args += ['--windres', windres.path()]
+    rcgen_outputs = ['@[email protected]', '@[email protected]']
+  endif
+
+  # msbuild backend doesn't support this atm
+  if meson.backend() == 'ninja'
+    rcgen_base_args += ['--depfile', '@DEPFILE@']
+  endif
+
+  rcgen_bin_args = rcgen_base_args + [
+    '--VFT_TYPE', 'VFT_APP',
+    '--FILEENDING', 'exe',
+    '--ICO', pg_ico
+  ]
+
+  rcgen_lib_args = rcgen_base_args + [
+    '--VFT_TYPE', 'VFT_DLL',
+    '--FILEENDING', 'dll',
+  ]
+
+  rc_bin_gen = generator(rcgen,
+    depfile: '@[email protected]',
+    arguments: rcgen_bin_args,
+    output: rcgen_outputs,
+  )
+
+  rc_lib_gen = generator(rcgen,
+    depfile: '@[email protected]',
+    arguments: rcgen_lib_args,
+    output: rcgen_outputs,
+  )
+endif
+
+
+
 # headers that the whole build tree depends on
 generated_headers = []
 # headers that the backend build depends on
index 6ae7aaad0152a00ddffb44ee2394fcdf9b319e29..25c5618e8a39b1b7ccf8e0252e732e10b92f6de9 100644 (file)
@@ -20,6 +20,12 @@ llvmjit_sources += files(
   'llvmjit_expr.c',
 )
 
+if host_system == 'windows'
+  llvmjit_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'llvmjit',
+    '--FILEDESC', 'llvmjit - JIT using LLVM',])
+endif
+
 llvmjit = shared_module('llvmjit',
   llvmjit_sources,
   kwargs: pg_mod_args + {
index 3fc786c80a0816ce84d544170dc920387bbfd766..4c653a05d36f8d1afa7fdd332981ba450d2e858d 100644 (file)
@@ -2,6 +2,12 @@ libpqwalreceiver_sources = files(
   'libpqwalreceiver.c',
 )
 
+if host_system == 'windows'
+  libpqwalreceiver_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pqwalreceiver',
+    '--FILEDESC', 'libpqwalreceiver - receive WAL during streaming replication',])
+endif
+
 libpqwalreceiver = shared_module('pqwalreceiver',
   libpqwalreceiver_sources,
   kwargs: pg_mod_args + {
index ab956361a62fb2d3bec904b09da4964bbec78591..5df27d7b7648ce5d784a7469b7f54b82598f0e99 100644 (file)
@@ -2,6 +2,12 @@ pgoutput_sources = files(
   'pgoutput.c',
 )
 
+if host_system == 'windows'
+  pgoutput_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgoutput',
+    '--FILEDESC', 'pgoutput - standard logical replication output plugin',])
+endif
+
 pgoutput = shared_module('pgoutput',
   pgoutput_sources,
   kwargs: pg_mod_args,
index 8c6f685cb3254612cae63934211822bb22c0c8e5..974401d187ee8fe9f331cfaf029f23849ea9ac1f 100644 (file)
@@ -58,6 +58,12 @@ dict_snowball_sources += files(
 # see comment in src/include/snowball/header.h
 stemmer_inc = include_directories('../../include/snowball')
 
+if host_system == 'windows'
+  dict_snowball_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dict_snowball',
+    '--FILEDESC', 'snowball - natural language stemmers',])
+endif
+
 dict_snowball = shared_module('dict_snowball',
   dict_snowball_sources,
   kwargs: pg_mod_args + {
index 1bc971d1945b73420bc07ef839b4adacb47722c4..1c18f2ac85aaf1d5577302289e95aa5077cc2761 100644 (file)
@@ -29,8 +29,15 @@ encodings = {
 }
 
 foreach encoding, sources : encodings
+  source_files = files(sources)
+
+  if host_system == 'windows'
+    source_files += rc_lib_gen.process(win32ver_rc, extra_args: [
+      '--NAME', encoding])
+  endif
+
   backend_targets += shared_module(encoding,
-    sources,
+    source_files,
     kwargs: pg_mod_args,
   )
 endforeach
index 9f213274d2fcb3f50b4cb72532100a3ab378ca5a..6ced9a31b801b4adbbf023889b0075cb0935cdc7 100644 (file)
@@ -7,6 +7,12 @@ initdb_sources += timezone_localtime_source
 
 #fixme: reimplement libpq_pgport logic
 
+if host_system == 'windows'
+  initdb_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'initdb',
+    '--FILEDESC', 'initdb - initialize a new database cluster',])
+endif
+
 initdb = executable('initdb',
   initdb_sources,
   include_directories: [timezone_inc],
index 8e197eba5f3a0324bd9a7ad210d4cea38072a2f6..25f5e7a0948e2dbb1ff976b84e80500cd12f2b96 100644 (file)
@@ -1,7 +1,13 @@
 pg_amcheck_sources = files(
-  'pg_amcheck.c'
+  'pg_amcheck.c',
 )
 
+if host_system == 'windows'
+  pg_amcheck_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_amcheck',
+    '--FILEDESC', 'pg_amcheck - detect corruption within database relations',])
+endif
+
 pg_amcheck = executable('pg_amcheck',
   pg_amcheck_sources,
   dependencies: [frontend_code, libpq],
index 87a0d980c4fbcc7ebe736cef218bbc0b36c3f6ee..aaa2e76977f64f94b38df29b8c078bc8430d39b0 100644 (file)
@@ -1,5 +1,15 @@
+pg_archivecleanup_sources = files(
+  'pg_archivecleanup.c',
+)
+
+if host_system == 'windows'
+  pg_archivecleanup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_archivecleanup',
+    '--FILEDESC', 'pg_archivecleanup - cleans archive when used with streaming replication',])
+endif
+
 pg_archivecleanup = executable('pg_archivecleanup',
-  ['pg_archivecleanup.c'],
+  pg_archivecleanup_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
index d26fed9cd8a0ddb2b64d9d8320d68b45bb5701ca..2c934e0c26e2f8689b6956151e63838a0a1b3724 100644 (file)
@@ -17,24 +17,56 @@ pg_basebackup_common = static_library('libpg_basebackup_common',
   kwargs: internal_lib_args,
 )
 
-pg_basebackup = executable('pg_basebackup',
+pg_basebackup_sources = files(
   'pg_basebackup.c',
+)
+
+if host_system == 'windows'
+  pg_basebackup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_basebackup',
+    '--FILEDESC', 'pg_basebackup - streaming WAL and backup receivers',])
+endif
+
+pg_basebackup = executable('pg_basebackup',
+  pg_basebackup_sources,
   link_with: [pg_basebackup_common],
   dependencies: pg_basebackup_deps,
   kwargs: default_bin_args,
 )
 bin_targets += pg_basebackup
 
-pg_receivewal = executable('pg_receivewal',
+
+pg_receivewal_sources = files(
   'pg_receivewal.c',
+)
+
+if host_system == 'windows'
+  pg_receivewal_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_receivewal',
+    '--FILEDESC', 'pg_receivewal - streaming WAL and backup receivers',])
+endif
+
+pg_receivewal = executable('pg_receivewal',
+  pg_receivewal_sources,
   link_with: [pg_basebackup_common],
   dependencies: pg_basebackup_deps,
   kwargs: default_bin_args,
 )
 bin_targets += pg_receivewal
 
-pg_recvlogical = executable('pg_recvlogical',
+
+pg_recvlogical_sources = files(
   'pg_recvlogical.c',
+)
+
+if host_system == 'windows'
+  pg_recvlogical_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_recvlogical',
+    '--FILEDESC', 'pg_recvlogical - streaming WAL and backup receivers',])
+endif
+
+pg_recvlogical = executable('pg_recvlogical',
+  pg_recvlogical_sources,
   link_with: [pg_basebackup_common],
   dependencies: pg_basebackup_deps,
   kwargs: default_bin_args,
index ee1f367bac3fa37785320aacd646c2c0144962d4..d07ebc999b33b61979981cdb6134f8a87f35bf24 100644 (file)
@@ -1,5 +1,15 @@
+pg_checksums_sources = files(
+  'pg_checksums.c',
+)
+
+if host_system == 'windows'
+  pg_checksums_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_checksums',
+    '--FILEDESC', 'pg_checksums - verify data checksums in an offline cluster',])
+endif
+
 pg_checksums = executable('pg_checksums',
-  ['pg_checksums.c'],
+  pg_checksums_sources,
   include_directories: [timezone_inc],
   dependencies: [frontend_code],
   kwargs: default_bin_args,
index 0ecbf2f9d28809c551262fcaa7749d5f39a56c95..4be2fdc84aeb210c7677b1f62453d3d8e7022e6e 100644 (file)
@@ -1,5 +1,15 @@
+pg_config_sources = files(
+  'pg_config.c',
+)
+
+if host_system == 'windows'
+  pg_config_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_config',
+    '--FILEDESC', 'pg_config - report configuration information',])
+endif
+
 pg_config = executable('pg_config',
-  ['pg_config.c'],
+  pg_config_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
index 557e672beb7312a338eb622a0aeee48616f3ecf4..7fc239dbe65c6dbf05241ff94d007b4b0401f0b6 100644 (file)
@@ -1,5 +1,15 @@
+pg_controldata_sources = files(
+  'pg_controldata.c',
+)
+
+if host_system == 'windows'
+  pg_controldata_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_controldata',
+    '--FILEDESC', 'pg_controldata - reads the data from pg_control',])
+endif
+
 pg_controldata = executable('pg_controldata',
-  ['pg_controldata.c'],
+  pg_controldata_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
index 6812e73e329e7cfdaff6b70c8042858683332c8f..96f962fa762db781b90184e1820d87a92e27139d 100644 (file)
@@ -1,5 +1,15 @@
+pg_ctl_sources = files(
+  'pg_ctl.c',
+)
+
+if host_system == 'windows'
+  pg_ctl_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_ctl',
+    '--FILEDESC', 'pg_ctl - starts/stops/restarts the PostgreSQL server',])
+endif
+
 pg_ctl = executable('pg_ctl',
-  ['pg_ctl.c'],
+  pg_ctl_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
index 785ec094dbdd217f443709512bbacb9afbf64050..3527a25c288115e3fec9bcdfb486ce54216a4365 100644 (file)
@@ -24,6 +24,12 @@ pg_dump_sources = files(
   'pg_dump_sort.c',
 )
 
+if host_system == 'windows'
+  pg_dump_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_dump',
+    '--FILEDESC', 'pg_dump - backup one PostgreSQL database',])
+endif
+
 pg_dump = executable('pg_dump',
   pg_dump_sources,
   link_with: [pg_dump_common],
@@ -37,6 +43,12 @@ pg_dumpall_sources = files(
   'pg_dumpall.c',
 )
 
+if host_system == 'windows'
+  pg_dumpall_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_dumpall',
+    '--FILEDESC', 'pg_dumpall - backup PostgreSQL databases'])
+endif
+
 pg_dumpall = executable('pg_dumpall',
   pg_dumpall_sources,
   link_with: [pg_dump_common],
@@ -50,6 +62,12 @@ pg_restore_sources = files(
   'pg_restore.c',
 )
 
+if host_system == 'windows'
+  pg_restore_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_restore',
+    '--FILEDESC', 'pg_restore - restore PostgreSQL databases'])
+endif
+
 pg_restore = executable('pg_restore',
   pg_restore_sources,
   link_with: [pg_dump_common],
index 7c5de134ac0f73d4aa2d5fe3c7a44785a3410d92..d503db97b71c4ca2a37d166bb2bbcea4538fcffa 100644 (file)
@@ -1,5 +1,15 @@
+pg_resetwal_sources = files(
+  'pg_resetwal.c',
+)
+
+if host_system == 'windows'
+  pg_resetwal_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_resetwal',
+    '--FILEDESC', 'pg_resetwal - reset PostgreSQL WAL log'])
+endif
+
 pg_resetwal = executable('pg_resetwal',
-  files('pg_resetwal.c'),
+  pg_resetwal_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
index d8ec9e482d5fbf1a6a6087e19c5decffb59d0f1f..6cd970909a2c840d66f2a474ff82b7d4d62381c8 100644 (file)
@@ -11,6 +11,12 @@ pg_rewind_sources = files(
 
 pg_rewind_sources += xlogreader_sources
 
+if host_system == 'windows'
+  pg_rewind_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_rewind',
+    '--FILEDESC', 'pg_rewind - synchronize a data directory with another one forked from'])
+endif
+
 pg_rewind = executable('pg_rewind',
   pg_rewind_sources,
   dependencies: [frontend_code, libpq, lz4, zstd],
index 2c01831e11f865a48b79b1981949007b30fcf505..31d288ba6da42742d56f80a00338313520603bf7 100644 (file)
@@ -1,4 +1,12 @@
-test_fsync_sources = files('pg_test_fsync.c')
+test_fsync_sources = files(
+  'pg_test_fsync.c',
+)
+
+if host_system == 'windows'
+  test_fsync_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_test_fsync',
+    '--FILEDESC', 'pg_test_fsync - test various disk sync methods'])
+endif
 
 pg_test_fsync = executable('pg_test_fsync',
   test_fsync_sources,
index 0a3068f1657309f7a634216d7ec95b629a10d68a..0aed03ea32f584ae43c83c795d14bed9fb7417fc 100644 (file)
@@ -1,5 +1,15 @@
+pg_test_timing_sources = files(
+  'pg_test_timing.c'
+)
+
+if host_system == 'windows'
+  pg_test_timing_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_test_timing',
+    '--FILEDESC', 'pg_test_timing - test timing overhead'])
+endif
+
 pg_test_timing = executable('pg_test_timing',
-  ['pg_test_timing.c'],
+  pg_test_timing_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
index 02f030e0ccfc1c5359c6cf179d1ee1079f0d7418..a7b927a45c7f333c2af57771095c1f7ca35a2d7f 100644 (file)
@@ -16,6 +16,12 @@ pg_upgrade_sources = files(
   'version.c',
 )
 
+if host_system == 'windows'
+  pg_upgrade_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_upgrade',
+    '--FILEDESC', 'pg_upgrade - an in-place binary upgrade utility'])
+endif
+
 pg_upgrade = executable('pg_upgrade',
   pg_upgrade_sources,
   dependencies: [frontend_code, libpq],
index 4c3b2bb5f97d3929e90f23a3aeb8f8af3fbaa763..b934a4084438babc448fc2ca93c120a0948dac13 100644 (file)
@@ -3,6 +3,12 @@ pg_verifybackup_sources = files(
   'pg_verifybackup.c'
 )
 
+if host_system == 'windows'
+  pg_verifybackup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_verifybackup',
+    '--FILEDESC', 'pg_verifybackup - verify a backup against using a backup manifest'])
+endif
+
 pg_verifybackup = executable('pg_verifybackup',
   pg_verifybackup_sources,
   dependencies: [frontend_code, libpq],
index 95872652ffde1571c27ae6adcefc60ae91b0b4bb..9605976870d58ca1049a1e591cb6a3a413bad48b 100644 (file)
@@ -8,6 +8,12 @@ pg_waldump_sources += rmgr_desc_sources
 pg_waldump_sources += xlogreader_sources
 pg_waldump_sources += files('../../backend/access/transam/xlogstats.c')
 
+if host_system == 'windows'
+  pg_waldump_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_waldump',
+    '--FILEDESC', 'pg_waldump - decode and display WA'])
+endif
+
 pg_waldump = executable('pg_waldump',
   pg_waldump_sources,
   dependencies: [frontend_code, lz4, zstd],
index 6564e54029ca12e928d609a36b24681f30a54672..a32eb51fe070f4a21ca1d311c0fdb0f395a133a9 100644 (file)
@@ -17,6 +17,12 @@ exprparse = custom_target('exprparse',
 generated_sources += exprparse.to_list()
 pgbench_sources += exprparse
 
+if host_system == 'windows'
+  pgbench_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgbench',
+    '--FILEDESC', 'pgbench - a simple program for running benchmark tests'])
+endif
+
 pgbench = executable('pgbench',
   pgbench_sources,
   dependencies: [frontend_code, libpq, thread_dep],
index 7a468879fd2b50b61b264c3ffd8609070bac4dbd..2e9aea4b0e19f48f0a95a3fb658a9a73bdac9e5a 100644 (file)
@@ -6,6 +6,12 @@ pgevent_sources = files(
   'pgevent.c',
 )
 
+pgevent_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+  '--NAME', 'pgevent',
+  '--FILEDESC', 'Eventlog message formatter',])
+
+pgevent_sources += windows.compile_resources('pgmsgevent.rc')
+
 # FIXME: copied from Mkvcbuild.pm, but I don't think that's the right approach
 pgevent_link_args = []
 if cc.get_id() == 'msvc'
index 410788e4767f74685ae54bef079d68a035f3f151..1264fc19fbd8e47f62118c1f3c00d4adbb31b263 100644 (file)
@@ -36,6 +36,12 @@ sql_help = custom_target('psql_help',
 generated_sources += sql_help.to_list()
 psql_sources += sql_help
 
+if host_system == 'windows'
+  psql_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'psql',
+    '--FILEDESC', 'psql - the PostgreSQL interactive terminal',])
+endif
+
 psql = executable('psql',
   psql_sources,
   include_directories: include_directories('.'),
index eaf250c7f735080f475deda8dd8d1cac82ca8b2c..837562c24e5bdfa78aa4da20175e14fd41c6b141 100644 (file)
@@ -16,8 +16,16 @@ binaries = [
 ]
 
 foreach binary : binaries
+  binary_sources = files('@[email protected]'.format(binary))
+
+  if host_system == 'windows'
+    binary_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+      '--NAME', binary,
+      '--FILEDESC', '@0@ - PostgreSQL utility'.format(binary),])
+  endif
+
   binary = executable(binary,
-    files(binary + '.c'),
+    binary_sources,
     link_with: [scripts_common],
     dependencies: [frontend_code, libpq],
     kwargs: default_bin_args,
index b803000c708eeb275a9549a5229c5850f8c03783..4d6454381b503c4085924834d2328689075ebcda 100644 (file)
@@ -7,6 +7,12 @@ ecpg_compat_inc = [include_directories('.'), ecpg_inc, libpq_inc]
 ecpg_compat_c_args = ['-DSO_MAJOR_VERSION=3']
 export_file = custom_target('libecpg_compat.exports', kwargs: gen_export_kwargs)
 
+if host_system == 'windows'
+  ecpg_compat_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libecpg_compat',
+    '--FILEDESC', 'ECPG compat - compatibility library for ECPG',])
+endif
+
 # see src/interfaces/libpq/meson.build
 ecpg_compat_st = static_library('libecpg_compat',
   ecpg_compat_sources,
index 6fdf019149cbf2a0706b9975ce97dfe594e2f42a..7e6e6fbf5c0fc3281459916ea188a3891aa7e502 100644 (file)
@@ -16,6 +16,12 @@ ecpglib_inc = [include_directories('.'), ecpg_inc]
 ecpglib_c_args = ['-DSO_MAJOR_VERSION=6']
 export_file = custom_target('libecpg.exports', kwargs: gen_export_kwargs)
 
+if host_system == 'windows'
+  ecpglib_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libecpg',
+    '--FILEDESC', 'ECPG - embedded SQL in C',])
+endif
+
 # see src/interfaces/libpq/meson.build
 ecpglib_st = static_library('libecpg',
   ecpglib_sources,
index 8e5d235810a4d364c80cdb447f28b6f290193522..530dd2c602dc4333c9748f6e9e23a692af4cd78a 100644 (file)
@@ -12,6 +12,12 @@ export_file = custom_target('libpgtypes.exports', kwargs: gen_export_kwargs)
 ecpg_pgtypes_inc = [include_directories('.'), ecpg_inc]
 ecpg_pgtypes_c_args = ['-DSO_MAJOR_VERSION=3']
 
+if host_system == 'windows'
+  ecpg_pgtypes_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgtypes',
+    '--FILEDESC', 'pgtypes - library for data type mapping',])
+endif
+
 # see src/interfaces/libpq/meson.build
 ecpg_pgtypes_st = static_library('libpgtypes',
   ecpg_pgtypes_sources,
index 1be49c8c27fc52b98a902c2599cbced10d79acd7..74876f039c9f0fde40fc8490405a7e6f5a4fc7fe 100644 (file)
@@ -93,6 +93,12 @@ ecpg_kwlist = custom_target('ecpg_kwlist_d.h',
 generated_sources += ecpg_kwlist
 ecpg_sources += ecpg_kwlist
 
+if host_system == 'windows'
+  ecpg_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ecpg',
+    '--FILEDESC', 'ecpg - embedded SQL precompiler for C',])
+endif
+
 ecpg_exe = executable('ecpg',
   ecpg_sources,
   include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
index 8904aa7fd90fd25f1e1607e0655fc2c9f9ba9199..94b26d10314638c7663efeb67b32f04cc17e42d4 100644 (file)
@@ -7,6 +7,11 @@ pg_regress_ecpg_sources = pg_regress_c + files(
   'pg_regress_ecpg.c',
 )
 
+if host_system == 'windows'
+  pg_regress_ecpg_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_regress_ecpg',])
+endif
+
 pg_regress_ecpg = executable('pg_regress_ecpg',
   pg_regress_ecpg_sources,
   c_args: pg_regress_cflags,
index 34cb58c26178ac211b909a7a37e1a40918646150..533b2e6f773f933aaa77a867ee8915372202a508 100644 (file)
@@ -16,9 +16,13 @@ libpq_sources = files(
   'libpq-events.c',
   'pqexpbuffer.c',
 )
+libpq_so_sources = [] # for shared lib, in addition to the above
 
 if host_system == 'windows'
   libpq_sources += files('pthread-win32.c', 'win32.c')
+  libpq_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq',
+    '--FILEDESC', 'PostgreSQL Access Library',])
 endif
 
 if ssl.found()
@@ -59,7 +63,7 @@ libpq_st = static_library('libpq',
 )
 
 libpq_so = shared_library('libpq',
-  libpq_sources,
+  libpq_sources + libpq_so_sources,
   include_directories: [libpq_inc, postgres_inc],
   c_args: libpq_c_args,
   version: '5.' + pg_version_major.to_string(),
index 16f94c1ed8b13a898bd2cd6d60e923e7ffba3c57..017f729d435dae40a51d1c92e783289329558d60 100644 (file)
@@ -1,13 +1,34 @@
+libpq_uri_regress_sources = files(
+  'libpq_uri_regress.c',
+)
+
+if host_system == 'windows'
+  libpq_uri_regress_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq_uri_regress',
+    '--FILEDESC', 'libpq test program',])
+endif
+
 executable('libpq_uri_regress',
-  files('libpq_uri_regress.c'),
+  libpq_uri_regress_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
   }
 )
 
+
+libpq_testclient_sources = files(
+  'libpq_testclient.c',
+)
+
+if host_system == 'windows'
+  libpq_testclient_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq_testclient',
+    '--FILEDESC', 'libpq test program',])
+endif
+
 executable('libpq_testclient',
-  files('libpq_testclient.c'),
+  libpq_testclient_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
index 73b733dd50b61f72bbb1c651d316b643a9642757..535660085dd6580d4f1033247dab59aad7202a89 100644 (file)
@@ -36,6 +36,13 @@ foreach n : ['SPI', 'Util']
 endforeach
 
 plperl_inc = include_directories('.')
+
+if host_system == 'windows'
+  plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plperl',
+    '--FILEDESC', 'PL/Perl - procedural language',])
+endif
+
 plperl = shared_module('plperl',
   plperl_sources,
   include_directories: [plperl_inc, postgres_inc],
index dd499fdd15194f840e0daed8a31957b015fc86c7..c46c0a1da2a88bed691d9a51c35fb53c1fa67953 100644 (file)
@@ -40,6 +40,12 @@ pl_unreserved = custom_target('pl_unreserved_kwlist',
 generated_sources += pl_unreserved
 plpgsql_sources += pl_unreserved
 
+if host_system == 'windows'
+  plpgsql_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plpgsql',
+    '--FILEDESC', 'PL/pgSQL - procedural language',])
+endif
+
 plpgsql = shared_module('plpgsql',
   plpgsql_sources,
   include_directories: include_directories('.'),
index 366b3b171ac4a9ccbb4afc0bb8d05d1f5e8d3dbb..40888386b5f13e0c1bd89e0784b15639a97497f4 100644 (file)
@@ -28,6 +28,12 @@ plpython_sources += custom_target('spiexceptions.h',
 # FIXME: need to duplicate import library ugliness?
 plpython_inc = include_directories('.')
 
+if host_system == 'windows'
+  plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plpython3',
+    '--FILEDESC', 'PL/Python - procedural language',])
+endif
+
 plpython = shared_module('plpython3',
   plpython_sources,
   include_directories: [plpython_inc, postgres_inc],
index 9b6addd7fd5c1bd2facbb20aba958ff7e6f41e97..f09bb14c9500e181af73bbce077775d2661be58a 100644 (file)
@@ -14,6 +14,12 @@ pltcl_sources += custom_target('pltclerrcodes.h',
   command: [perl, gen_pltclerrcodes, '@INPUT@']
 )
 
+if host_system == 'windows'
+  pltcl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pltcl',
+    '--FILEDESC', 'PL/Tcl - procedural language',])
+endif
+
 pltcl = shared_module('pltcl',
   pltcl_sources,
   include_directories: [include_directories('.'), postgres_inc],
index c7656fd4609717483fd07cb2fca21f07f6076cb9..ba27b8c1d44042e032cda598ae120f26276890c4 100644 (file)
@@ -23,6 +23,12 @@ spec_parser = custom_target('specparse',
 isolationtester_sources += spec_parser
 generated_sources += spec_parser.to_list()
 
+if host_system == 'windows'
+  isolation_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_isolation_regress',
+    '--FILEDESC', 'pg_isolation_regress - multi-client test driver',])
+endif
+
 pg_isolation_regress = executable('pg_isolation_regress',
   isolation_sources,
   c_args: pg_regress_cflags,
@@ -34,6 +40,13 @@ pg_isolation_regress = executable('pg_isolation_regress',
 )
 bin_targets += pg_isolation_regress
 
+
+if host_system == 'windows'
+  isolationtester_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'isolationtester',
+    '--FILEDESC', 'isolationtester - multi-client test driver',])
+endif
+
 isolationtester = executable('isolationtester',
   isolationtester_sources,
   include_directories: include_directories('.'),
index cf4bdaba6374bc7603fe3b45358716753cf539f6..a0c3ab6afe7a28838cd3fc4c187cb0affb4c0d3c 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+delay_execution_sources = files(
+  'delay_execution.c',
+)
+
+if host_system == 'windows'
+  delay_execution_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'delay_execution',
+    '--FILEDESC', 'delay_execution - allow delay between parsing and execution',])
+endif
+
 delay_execution = shared_module('delay_execution',
-  ['delay_execution.c'],
+  delay_execution_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += delay_execution
index 56ff5f48001d8520181f9b5b1d38bfd75ed62107..4ce82491135d5a23729c9e02752e8ad366f86b87 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+dummy_index_am_sources = files(
+  'dummy_index_am.c',
+)
+
+if host_system == 'windows'
+  dummy_index_am_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dummy_index_am',
+    '--FILEDESC', 'dummy_index_am - index access method template',])
+endif
+
 dummy_index_am = shared_module('dummy_index_am',
-  ['dummy_index_am.c'],
+  dummy_index_am_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += dummy_index_am
index 21b7cf8f3531b8f3a72eef976ff9a73676de23ca..81b626e496c777567b3b2e31bfc81e96240db81b 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+dummy_seclabel_sources = files(
+  'dummy_seclabel.c',
+)
+
+if host_system == 'windows'
+  dummy_seclabel_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dummy_seclabel',
+    '--FILEDESC', 'dummy_seclabel - regression testing of the SECURITY LABEL statement',])
+endif
+
 dummy_seclabel = shared_module('dummy_seclabel',
-  ['dummy_seclabel.c'],
+  dummy_seclabel_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += dummy_seclabel
index 8384b6e3b2afc83ae2fc838b6758842e9b19960c..de0e2d15626eb197a74b802cc4e9c3f072a5a048 100644 (file)
@@ -1,7 +1,15 @@
+libpq_pipeline_sources = files(
+  'libpq_pipeline.c',
+)
+
+if host_system == 'windows'
+  libpq_pipeline_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq_pipeline',
+    '--FILEDESC', 'libpq_pipeline - test program for pipeline execution',])
+endif
+
 libpq_pipeline = executable('libpq_pipeline',
-  files(
-    'libpq_pipeline.c',
-  ),
+  libpq_pipeline_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
index 45de3f1990d664c66e7d12af882674f2446ebf71..e1ea2c7a16ffe5d1ac91c599fdcd8fe2aa7e79a6 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+plsample_sources = files(
+  'plsample.c',
+)
+
+if host_system == 'windows'
+  plsample_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plsample',
+    '--FILEDESC', 'PL/Sample - template for procedural language',])
+endif
+
 plsample = shared_module('plsample',
-  ['plsample.c'],
+  plsample_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += plsample
index 857fc7e140eb3b092d8aada673496c9af71f49e5..445296fee0bf5491ef26bdf258c9f7ffb4fab4de 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+spgist_name_ops_sources = files(
+  'spgist_name_ops.c',
+)
+
+if host_system == 'windows'
+  spgist_name_ops_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'spgist_name_ops',
+    '--FILEDESC', 'spgist_name_ops - test opclass for SP-GiST',])
+endif
+
 spgist_name_ops = shared_module('spgist_name_ops',
-  ['spgist_name_ops.c'],
+  spgist_name_ops_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += spgist_name_ops
index a57bd0693a3e35b2395d1fc177523af966b75c48..a9eb4c564dae7ca88ecbf4436f0de04cd05dae86 100644 (file)
@@ -3,8 +3,19 @@ if not ssl.found()
 endif
 
 # FIXME: prevent install during main install, but not during test :/
+
+ssl_passphrase_callback_sources = files(
+  'ssl_passphrase_func.c',
+)
+
+if host_system == 'windows'
+  ssl_passphrase_callback_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ssl_passphrase_func',
+    '--FILEDESC', 'callback function to provide a passphrase',])
+endif
+
 ssl_passphrase_callback = shared_module('ssl_passphrase_func',
-  ['ssl_passphrase_func.c'],
+  ssl_passphrase_callback_sources,
   kwargs: pg_mod_args + {
     'dependencies': [ssl, pg_mod_args['dependencies']],
   },
index 945eb5a70c4c38912d67fc301cf8cc14327607df..3cf6b05754f9f9bc52106b0c34c95cfc4bb8fe91 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_bloomfilter_sources = files(
+  'test_bloomfilter.c',
+)
+
+if host_system == 'windows'
+  test_bloomfilter_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_bloomfilter',
+    '--FILEDESC', 'test_bloomfilter - test code for Bloom filter library',])
+endif
+
 test_bloomfilter = shared_module('test_bloomfilter',
-  ['test_bloomfilter.c'],
+  test_bloomfilter_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_bloomfilter
index 81ad5adc52633720acc1ad6363ab5cc0b47e255a..54d44f9b2b4efa6a1f930e87596861050032a4e6 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_ddl_deparse_sources = files(
+  'test_ddl_deparse.c',
+)
+
+if host_system == 'windows'
+  test_ddl_deparse_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_ddl_deparse',
+    '--FILEDESC', 'test_ddl_deparse - regression testing for DDL deparsing',])
+endif
+
 test_ddl_deparse = shared_module('test_ddl_deparse',
-  ['test_ddl_deparse.c'],
+  test_ddl_deparse_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_ddl_deparse
index abf0a3b04300b7ca05de8d766c89e81b29bf9e98..b3b49c5612221264448befe776b78315a88639a6 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_ginpostinglist_sources = files(
+  'test_ginpostinglist.c',
+)
+
+if host_system == 'windows'
+  test_ginpostinglist_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_ginpostinglist',
+    '--FILEDESC', 'test_ginpostinglist - test code for src/backend/access/gin//ginpostinglist.c',])
+endif
+
 test_ginpostinglist = shared_module('test_ginpostinglist',
-  ['test_ginpostinglist.c'],
+  test_ginpostinglist_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_ginpostinglist
index c32c469c69abf0ebf3c2186dd699715bfeb3cef9..4bd75af4b5eac218734641ac5da41236580a29bd 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_integerset_sources = files(
+  'test_integerset.c',
+)
+
+if host_system == 'windows'
+  test_integerset_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_integerset',
+    '--FILEDESC', 'test_integerset - test code for src/backend/lib/integerset.c',])
+endif
+
 test_integerset = shared_module('test_integerset',
-  ['test_integerset.c'],
+  test_integerset_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_integerset
index a388de1156a954d71b70498af03b999ab24d24af..c5405b8f87862542d670d689d6314d949599214a 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_lfind_sources = files(
+  'test_lfind.c',
+)
+
+if host_system == 'windows'
+  test_lfind_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_lfind',
+    '--FILEDESC', 'test_lfind - test code for optimized linear search functions',])
+endif
+
 test_lfind = shared_module('test_lfind',
-  ['test_lfind.c'],
+  test_lfind_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_lfind
index 5faf0459777806edef4457ffa6cd4e2abb4770b7..8802bbbac55e84e667ef9069b6a98e081bf1e5af 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_oat_hooks_sources = files(
+  'test_oat_hooks.c',
+)
+
+if host_system == 'windows'
+  test_oat_hooks_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_oat_hooks',
+    '--FILEDESC', 'test_oat_hooks - example use of object access hooks',])
+endif
+
 test_oat_hooks = shared_module('test_oat_hooks',
-  ['test_oat_hooks.c'],
+  test_oat_hooks_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_oat_hooks
index b59960f615e789df4ef71974b3e8634752387fd8..1c17113347fb28508a8576eab2f2579ce0023c05 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_parser_sources = files(
+  'test_parser.c',
+)
+
+if host_system == 'windows'
+  test_parser_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_parser',
+    '--FILEDESC', 'test_parser - example of a custom parser for full-text search',])
+endif
+
 test_parser = shared_module('test_parser',
-  ['test_parser.c'],
+  test_parser_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_parser
index 1cfa84b36090d4b096b1ee5083123b828535b9dc..9a5be43c9c0fdc7dab33d4069555f556e3cd7f5b 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_predtest_sources = files(
+  'test_predtest.c',
+)
+
+if host_system == 'windows'
+  test_predtest_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_predtest',
+    '--FILEDESC', 'test_predtest - test code for optimizer/util/predtest.c',])
+endif
+
 test_predtest = shared_module('test_predtest',
-  ['test_predtest.c'],
+  test_predtest_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_predtest
index 34cbc3e1624cdec723a32aee39b1d426d1647ebf..f067e08d3213ce2bcff6a47147af74c837da5e0b 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_rbtree_sources = files(
+  'test_rbtree.c',
+)
+
+if host_system == 'windows'
+  test_rbtree_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_rbtree',
+    '--FILEDESC', 'test_rbtree - test code for red-black tree library',])
+endif
+
 test_rbtree = shared_module('test_rbtree',
-  ['test_rbtree.c'],
+  test_rbtree_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_rbtree
index 867a64e57c34661569595a457f295184a6ea8c33..cfb938d9f1edbc1728088a5b90214077f970a771 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_regex_sources = files(
+  'test_regex.c',
+)
+
+if host_system == 'windows'
+  test_regex_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_regex',
+    '--FILEDESC', 'test_regex - test code for backend/regex/',])
+endif
+
 test_regex = shared_module('test_regex',
-  ['test_regex.c'],
+  test_regex_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_regex
index 80d8adda33223ea4ef6c061fa0d4be936595d733..3fb273b29343b084e338cef0b65be9231e47d435 100644 (file)
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_rls_hooks_sources = files(
+  'test_rls_hooks.c',
+)
+
+if host_system == 'windows'
+  test_rls_hooks_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_rls_hooks',
+    '--FILEDESC', 'test_rls_hooks - example use of RLS hooks',])
+endif
+
 test_rls_hooks = shared_module('test_rls_hooks',
-  ['test_rls_hooks.c'],
+  test_rls_hooks_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_rls_hooks
index b663543d6167edaa1ddec9602e666cf56626e2c6..16c8fdb57f4178b36fd381223da1acbdfa7be187 100644 (file)
@@ -1,10 +1,19 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_shm_mq_sources = files(
+  'setup.c',
+  'test.c',
+  'worker.c',
+)
+
+if host_system == 'windows'
+  test_shm_mq_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_shm_mq',
+    '--FILEDESC', 'test_shm_mq - example use of shared memory message queue',])
+endif
+
 test_shm_mq = shared_module('test_shm_mq',
-  files(
-    'setup.c',
-    'test.c',
-    'worker.c',
-  ),
+  test_shm_mq_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_shm_mq
index 32acad883b2718817dcca2f844b03bf970ad7dae..a4a158c75b96d62cd053c6bea1c3cedf07352c7e 100644 (file)
@@ -1,8 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_worker_spi_sources = files(
+  'worker_spi.c',
+)
+
+if host_system == 'windows'
+  test_worker_spi_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'worker_spi',
+    '--FILEDESC', 'worker_spi - background worker example',])
+endif
+
 test_worker_spi = shared_module('worker_spi',
-  files(
-    'worker_spi.c',
-  ),
+  test_worker_spi_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_worker_spi
index 03de591b0c792ebe80b033053dcb214f9406b42c..3dcfc11278fae1c9a135cf57315f00caab0ee9c5 100644 (file)
@@ -17,6 +17,12 @@ host_tuple = '@0@-@1@-@2@'.format(host_cpu, host_system, host_tuple_cc)
 
 pg_regress_cflags = ['-DHOST_TUPLE="@0@"'.format(host_tuple), '-DSHELLPROG="/bin/sh"']
 
+if host_system == 'windows'
+  regress_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_regress',
+    '--FILEDESC', 'pg_regress - test driver',])
+endif
+
 pg_regress = executable('pg_regress',
   regress_sources,
   c_args: pg_regress_cflags,
index 16f082ecfa8d782c82eb5d6091e6829b0343d909..9e0934c000b1f744c61d5ddf36588f42623f82ff 100644 (file)
@@ -28,6 +28,12 @@ if get_option('system_tzdata') == ''
   if meson.is_cross_build()
     zic = find_program(get_option('ZIC'), native: true, required: true)
   else
+    if host_system == 'windows'
+      zic_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+        '--NAME', 'zic',
+        '--FILEDESC', 'zic - time zone compiler',])
+    endif
+
     zic = executable('zic', zic_sources,
                      dependencies: [frontend_code],
                      kwargs: default_bin_args + {'install': false}
diff --git a/src/tools/rcgen b/src/tools/rcgen
new file mode 100755 (executable)
index 0000000..0c84772
--- /dev/null
@@ -0,0 +1,105 @@
+#!/usr/bin/env python3
+
+# Helper for building resource files when building for windows. Always
+# generates a .rc from the input .rc file. When building with msvc we
+# additionally generate a .res file with 'rc', when building with gcc, we use
+# windres to directly generate a .o.  Additionally we generate basic
+# dependencies if depfile is specified.
+
+import argparse
+import os
+import subprocess
+import sys
+
+parser = argparse.ArgumentParser(description='generate PostgreSQL rc file')
+
+parser.add_argument('--srcdir', type=os.path.abspath,
+                    required=True)
+parser.add_argument('--builddir', type=os.path.abspath,
+                    required=True)
+
+binaries = parser.add_argument_group('binaries')
+binaries.add_argument('--windres', type=os.path.abspath)
+binaries.add_argument('--rc', type=os.path.abspath)
+
+inout = parser.add_argument_group('inout')
+inout.add_argument('--depfile', type=argparse.FileType('w'))
+inout.add_argument('--input', type=argparse.FileType('r'),
+                   required=True)
+inout.add_argument('--rcout', type=argparse.FileType('w'),
+                   required=True)
+inout.add_argument('--out', type=str,
+                   required=True)
+
+replacements = parser.add_argument_group('replacements')
+replacements.add_argument('--FILEDESC', type=str)
+replacements.add_argument('--NAME', type=str, required=True)
+replacements.add_argument('--VFT_TYPE', type=str, required=True)
+replacements.add_argument('--FILEENDING', type=str, required=True)
+replacements.add_argument('--ICO', type=str)
+
+args = parser.parse_args()
+
+# determine replacement strings
+
+internal_name = '"{0}"'.format(args.NAME)
+original_name = '"{0}.{1}"'.format(args.NAME, args.FILEENDING)
+
+# if no description is passed in, generate one based on the name
+if args.FILEDESC:
+    filedesc = args.FILEDESC
+elif args.NAME:
+    if args.VFT_TYPE == 'VFT_DLL':
+        filedesc = 'PostgreSQL {0} library'.format(args.NAME)
+    else:
+        filedesc = 'PostgreSQL {0} binary'.format(args.NAME)
+filedesc = '"{0}"'.format(filedesc)
+
+
+if args.ICO:
+    ico = 'IDI_ICON ICON "{0}"'.format(args.ICO)
+    if args.depfile:
+        args.depfile.write("{0} : {1}\n".format(args.rcout.name, args.ICO))
+else:
+    ico = ''
+
+
+data = args.input.read()
+
+data = data.replace('VFT_APP', args.VFT_TYPE)
+data = data.replace('_INTERNAL_NAME_', internal_name)
+data = data.replace('_ORIGINAL_NAME_', original_name)
+data = data.replace('FILEDESC', filedesc)
+data = data.replace("_ICO_", ico)
+
+args.rcout.write(data)
+args.rcout.close()
+
+if args.windres:
+    cmd = [
+        args.windres,
+        '-I{0}/src/include/'.format(args.builddir),
+        '-I{0}/src/include/'.format(args.srcdir),
+        '-o', args.out, '-i', args.rcout.name,
+    ]
+elif args.rc:
+    cmd = [
+        args.rc, '/nologo',
+        '-I{0}/src/include/'.format(args.builddir),
+        '-I{0}/src/include/'.format(args.srcdir),
+        '/fo', args.out, args.rcout.name,
+    ]
+else:
+    sys.exit('either --windres or --rc needs to be specified')
+
+sp = subprocess.run(cmd)
+if sp.returncode != 0:
+    sys.exit(sp.returncode)
+
+# It'd be nicer if we could generate correct dependencies here, but 'rc'
+# doesn't support doing so. It's unlikely we'll ever need more, so...
+if args.depfile:
+    args.depfile.write("{0} : {1}\n".format(
+        args.rcout.name, args.input.name))
+    args.depfile.write("{0} : {1}/{2}\n".format(
+        args.out, args.builddir, 'src/include/pg_config.h'))