From 523551f8117d2db1a607e29d94704a52cd5679aa Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 11:03:07 -0700
Subject: [PATCH v15 05/14] meson: Add windows resource files

Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
---
 src/backend/jit/llvm/meson.build              |   6 +
 .../replication/libpqwalreceiver/meson.build  |   6 +
 src/backend/replication/pgoutput/meson.build  |   6 +
 src/backend/snowball/meson.build              |   6 +
 .../utils/mb/conversion_procs/meson.build     | 144 ++++++++++++++----
 src/bin/initdb/meson.build                    |   6 +
 src/bin/pg_amcheck/meson.build                |   8 +-
 src/bin/pg_archivecleanup/meson.build         |  12 +-
 src/bin/pg_basebackup/meson.build             |  38 ++++-
 src/bin/pg_checksums/meson.build              |  12 +-
 src/bin/pg_config/meson.build                 |  12 +-
 src/bin/pg_controldata/meson.build            |  12 +-
 src/bin/pg_ctl/meson.build                    |  12 +-
 src/bin/pg_dump/meson.build                   |  18 +++
 src/bin/pg_resetwal/meson.build               |  12 +-
 src/bin/pg_rewind/meson.build                 |   6 +
 src/bin/pg_test_fsync/meson.build             |  10 +-
 src/bin/pg_test_timing/meson.build            |  12 +-
 src/bin/pg_upgrade/meson.build                |   6 +
 src/bin/pg_verifybackup/meson.build           |   6 +
 src/bin/pg_waldump/meson.build                |   6 +
 src/bin/pgbench/meson.build                   |   6 +
 src/bin/pgevent/meson.build                   |   6 +
 src/bin/psql/meson.build                      |   6 +
 src/bin/scripts/meson.build                   |  10 +-
 src/interfaces/libpq/meson.build              |   5 +
 src/interfaces/libpq/test/meson.build         |  25 ++-
 src/pl/plperl/meson.build                     |   7 +
 src/pl/plpgsql/src/meson.build                |   6 +
 src/pl/plpython/meson.build                   |   6 +
 src/pl/tcl/meson.build                        |   6 +
 contrib/adminpack/meson.build                 |  12 +-
 contrib/amcheck/meson.build                   |  17 ++-
 contrib/auth_delay/meson.build                |  12 +-
 contrib/auto_explain/meson.build              |  12 +-
 contrib/basebackup_to_shell/meson.build       |   6 +
 contrib/basic_archive/meson.build             |   6 +
 contrib/bloom/meson.build                     |   6 +
 contrib/bool_plperl/meson.build               |   6 +
 contrib/btree_gin/meson.build                 |  12 +-
 contrib/btree_gist/meson.build                |   6 +
 contrib/citext/meson.build                    |   6 +
 contrib/cube/meson.build                      |   6 +
 contrib/dblink/meson.build                    |   6 +
 contrib/dict_int/meson.build                  |  12 +-
 contrib/dict_xsyn/meson.build                 |  12 +-
 contrib/earthdistance/meson.build             |  12 +-
 contrib/file_fdw/meson.build                  |  12 +-
 contrib/fuzzystrmatch/meson.build             |  16 +-
 contrib/hstore/meson.build                    |  24 ++-
 contrib/hstore_plperl/meson.build             |   6 +
 contrib/hstore_plpython/meson.build           |   6 +
 contrib/intarray/meson.build                  |   6 +
 contrib/isn/meson.build                       |   6 +
 contrib/jsonb_plperl/meson.build              |   6 +
 contrib/jsonb_plpython/meson.build            |   6 +
 contrib/lo/meson.build                        |   6 +
 contrib/ltree/meson.build                     |   6 +
 contrib/ltree_plpython/meson.build            |   6 +
 contrib/oid2name/meson.build                  |  12 +-
 contrib/old_snapshot/meson.build              |   6 +
 contrib/pageinspect/meson.build               |   6 +
 contrib/passwordcheck/meson.build             |   6 +
 contrib/pg_buffercache/meson.build            |  14 +-
 contrib/pg_freespacemap/meson.build           |  14 +-
 contrib/pg_prewarm/meson.build                |  16 +-
 contrib/pg_stat_statements/meson.build        |  12 +-
 contrib/pg_surgery/meson.build                |  14 +-
 contrib/pg_trgm/meson.build                   |  20 ++-
 contrib/pg_visibility/meson.build             |  14 +-
 contrib/pg_walinspect/meson.build             |   6 +
 contrib/pgcrypto/meson.build                  |   6 +
 contrib/pgrowlocks/meson.build                |  14 +-
 contrib/pgstattuple/meson.build               |  18 ++-
 contrib/postgres_fdw/meson.build              |   6 +
 contrib/seg/meson.build                       |   6 +
 contrib/sepgsql/meson.build                   |   6 +
 contrib/spi/meson.build                       |  48 +++++-
 contrib/sslinfo/meson.build                   |  14 +-
 contrib/tablefunc/meson.build                 |  14 +-
 contrib/tcn/meson.build                       |  14 +-
 contrib/test_decoding/meson.build             |   6 +
 contrib/tsm_system_rows/meson.build           |  14 +-
 contrib/tsm_system_time/meson.build           |  14 +-
 contrib/unaccent/meson.build                  |  14 +-
 contrib/uuid-ossp/meson.build                 |  14 +-
 contrib/vacuumlo/meson.build                  |  12 +-
 contrib/xml2/meson.build                      |  16 +-
 src/interfaces/ecpg/compatlib/meson.build     |   6 +-
 src/interfaces/ecpg/preproc/meson.build       |   6 +
 src/interfaces/ecpg/test/meson.build          |   6 +
 src/test/isolation/meson.build                |  13 ++
 src/test/modules/delay_execution/meson.build  |  13 +-
 src/test/modules/dummy_index_am/meson.build   |  13 +-
 src/test/modules/dummy_seclabel/meson.build   |  13 +-
 src/test/modules/libpq_pipeline/meson.build   |  14 +-
 src/test/modules/plsample/meson.build         |  13 +-
 src/test/modules/spgist_name_ops/meson.build  |  13 +-
 .../ssl_passphrase_callback/meson.build       |  13 +-
 src/test/modules/test_bloomfilter/meson.build |  13 +-
 src/test/modules/test_ddl_deparse/meson.build |  13 +-
 .../modules/test_ginpostinglist/meson.build   |  13 +-
 src/test/modules/test_integerset/meson.build  |  13 +-
 src/test/modules/test_lfind/meson.build       |  13 +-
 src/test/modules/test_oat_hooks/meson.build   |  13 +-
 src/test/modules/test_parser/meson.build      |  13 +-
 src/test/modules/test_predtest/meson.build    |  13 +-
 src/test/modules/test_rbtree/meson.build      |  13 +-
 src/test/modules/test_regex/meson.build       |  13 +-
 src/test/modules/test_rls_hooks/meson.build   |  13 +-
 src/test/modules/test_shm_mq/meson.build      |  19 ++-
 src/test/modules/worker_spi/meson.build       |  15 +-
 src/test/regress/meson.build                  |   6 +
 meson.build                                   |  61 ++++++++
 src/timezone/meson.build                      |   6 +
 src/tools/rcgen                               |  99 ++++++++++++
 116 files changed, 1383 insertions(+), 159 deletions(-)
 create mode 100755 src/tools/rcgen

diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
index de2e624ab58..5fb63768358 100644
--- a/src/backend/jit/llvm/meson.build
+++ b/src/backend/jit/llvm/meson.build
@@ -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 + {
diff --git a/src/backend/replication/libpqwalreceiver/meson.build b/src/backend/replication/libpqwalreceiver/meson.build
index 3fc786c80a0..4c653a05d36 100644
--- a/src/backend/replication/libpqwalreceiver/meson.build
+++ b/src/backend/replication/libpqwalreceiver/meson.build
@@ -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 + {
diff --git a/src/backend/replication/pgoutput/meson.build b/src/backend/replication/pgoutput/meson.build
index ab956361a62..5df27d7b764 100644
--- a/src/backend/replication/pgoutput/meson.build
+++ b/src/backend/replication/pgoutput/meson.build
@@ -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,
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
index 8c6f685cb32..974401d187e 100644
--- a/src/backend/snowball/meson.build
+++ b/src/backend/snowball/meson.build
@@ -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 + {
diff --git a/src/backend/utils/mb/conversion_procs/meson.build b/src/backend/utils/mb/conversion_procs/meson.build
index 1bc971d1945..00e721a2453 100644
--- a/src/backend/utils/mb/conversion_procs/meson.build
+++ b/src/backend/utils/mb/conversion_procs/meson.build
@@ -1,36 +1,122 @@
 encodings = {
-  'cyrillic_and_mic': ['cyrillic_and_mic/cyrillic_and_mic.c'],
-  'euc2004_sjis2004': ['euc2004_sjis2004/euc2004_sjis2004.c'],
-  'euc_cn_and_mic': ['euc_cn_and_mic/euc_cn_and_mic.c'],
-  'euc_jp_and_sjis': ['euc_jp_and_sjis/euc_jp_and_sjis.c'],
-  'euc_kr_and_mic': ['euc_kr_and_mic/euc_kr_and_mic.c'],
-  'euc_tw_and_big5': [
-    'euc_tw_and_big5/euc_tw_and_big5.c',
-    'euc_tw_and_big5/big5.c',
-  ],
-  'latin2_and_win1250': ['latin2_and_win1250/latin2_and_win1250.c'],
-  'latin_and_mic': ['latin_and_mic/latin_and_mic.c'],
-  'utf8_and_big5': ['utf8_and_big5/utf8_and_big5.c'],
-  'utf8_and_cyrillic': ['utf8_and_cyrillic/utf8_and_cyrillic.c'],
-  'utf8_and_euc2004': ['utf8_and_euc2004/utf8_and_euc2004.c'],
-  'utf8_and_euc_cn': ['utf8_and_euc_cn/utf8_and_euc_cn.c'],
-  'utf8_and_euc_jp': ['utf8_and_euc_jp/utf8_and_euc_jp.c'],
-  'utf8_and_euc_kr': ['utf8_and_euc_kr/utf8_and_euc_kr.c'],
-  'utf8_and_euc_tw': ['utf8_and_euc_tw/utf8_and_euc_tw.c'],
-  'utf8_and_gb18030': ['utf8_and_gb18030/utf8_and_gb18030.c'],
-  'utf8_and_gbk': ['utf8_and_gbk/utf8_and_gbk.c'],
-  'utf8_and_iso8859': ['utf8_and_iso8859/utf8_and_iso8859.c'],
-  'utf8_and_iso8859_1': ['utf8_and_iso8859_1/utf8_and_iso8859_1.c'],
-  'utf8_and_johab': ['utf8_and_johab/utf8_and_johab.c'],
-  'utf8_and_sjis': ['utf8_and_sjis/utf8_and_sjis.c'],
-  'utf8_and_sjis2004': ['utf8_and_sjis2004/utf8_and_sjis2004.c'],
-  'utf8_and_uhc': ['utf8_and_uhc/utf8_and_uhc.c'],
-  'utf8_and_win': ['utf8_and_win/utf8_and_win.c'],
+  'cyrillic_and_mic': {
+    'sources': ['cyrillic_and_mic/cyrillic_and_mic.c'],
+    'description': 'cyrillic <-> mic text conversions',
+  },
+  'euc2004_sjis2004': {
+    'sources': ['euc2004_sjis2004/euc2004_sjis2004.c'],
+    'description': 'euc2004 <-> sjis2004 text conversions',
+  },
+  'euc_cn_and_mic': {
+    'sources': ['euc_cn_and_mic/euc_cn_and_mic.c'],
+    'description': 'euc_cn <-> mic text conversions',
+  },
+  'euc_jp_and_sjis': {
+    'sources': ['euc_jp_and_sjis/euc_jp_and_sjis.c'],
+    'description': 'euc_jp <-> sjis text conversions',
+  },
+  'euc_kr_and_mic': {
+    'sources': ['euc_kr_and_mic/euc_kr_and_mic.c'],
+    'description': 'euc_kr <-> mic text conversions',
+  },
+  'euc_tw_and_big5': {
+    'sources': [
+      'euc_tw_and_big5/euc_tw_and_big5.c',
+      'euc_tw_and_big5/big5.c',
+    ],
+    'description': 'euc_tw <-> big5 text conversions',
+  },
+  'latin2_and_win1250': {
+    'sources': ['latin2_and_win1250/latin2_and_win1250.c'],
+    'description': 'latin2 <-> win1250 text conversions',
+  },
+  'latin_and_mic': {
+    'sources': ['latin_and_mic/latin_and_mic.c'],
+    'description': 'latin <-> mic text conversions',
+  },
+  'utf8_and_big5': {
+    'sources': ['utf8_and_big5/utf8_and_big5.c'],
+    'description': 'utf8 <-> big5 text conversions',
+  },
+  'utf8_and_cyrillic': {
+    'sources': ['utf8_and_cyrillic/utf8_and_cyrillic.c'],
+    'description': 'utf8 <-> cyrillic text conversions',
+  },
+  'utf8_and_euc2004': {
+    'sources': ['utf8_and_euc2004/utf8_and_euc2004.c'],
+    'description': 'utf8 <-> euc2004 text conversions',
+  },
+  'utf8_and_euc_cn': {
+    'sources': ['utf8_and_euc_cn/utf8_and_euc_cn.c'],
+    'description': 'utf8 <-> euc_cn text conversions',
+  },
+  'utf8_and_euc_jp': {
+    'sources': ['utf8_and_euc_jp/utf8_and_euc_jp.c'],
+    'description': 'utf8 <-> euc_jp text conversions',
+  },
+  'utf8_and_euc_kr': {
+    'sources': ['utf8_and_euc_kr/utf8_and_euc_kr.c'],
+    'description': 'utf8 <-> euc_kr text conversions',
+  },
+  'utf8_and_euc_tw': {
+    'sources': ['utf8_and_euc_tw/utf8_and_euc_tw.c'],
+    'description': 'utf8 <-> euc_tw text conversions',
+  },
+  'utf8_and_gb18030': {
+    'sources': ['utf8_and_gb18030/utf8_and_gb18030.c'],
+    'description': 'utf8 <-> gb18030 text conversions',
+  },
+  'utf8_and_gbk': {
+    'sources': ['utf8_and_gbk/utf8_and_gbk.c'],
+    'description': 'utf8 <-> gbk text conversions',
+  },
+  'utf8_and_iso8859': {
+    'sources': ['utf8_and_iso8859/utf8_and_iso8859.c'],
+    'description': 'utf8 <-> iso8859 text conversions',
+  },
+  'utf8_and_iso8859_1': {
+    'sources': ['utf8_and_iso8859_1/utf8_and_iso8859_1.c'],
+    'description': 'utf8 <-> iso8859_1 text conversions',
+  },
+  'utf8_and_johab': {
+    'sources': ['utf8_and_johab/utf8_and_johab.c'],
+    'description': 'utf8 <-> johab text conversions',
+  },
+  'utf8_and_sjis': {
+    'sources': ['utf8_and_sjis/utf8_and_sjis.c'],
+    'description': 'utf8 <-> sjis text conversions',
+  },
+  'utf8_and_sjis2004': {
+    'sources': ['utf8_and_sjis2004/utf8_and_sjis2004.c'],
+    'description': 'utf8 <-> sjis2004 text conversions',
+  },
+  'utf8_and_uhc': {
+    'sources': ['utf8_and_uhc/utf8_and_uhc.c'],
+    'description': 'utf8 <-> uhc text conversions',
+  },
+  'utf8_and_win': {
+    'sources': ['utf8_and_win/utf8_and_win.c'],
+    'description': 'utf8 <-> win text conversions',
+  },
 }
 
-foreach encoding, sources : encodings
+foreach encoding, values: encodings
+  sources = values['sources']
+  description = values['description']
+
+  source_files = files()
+  foreach source: sources
+    source_files += files(source)
+  endforeach
+
+  if host_system == 'windows'
+    source_files += rc_lib_gen.process(win32ver_rc, extra_args: [
+      '--NAME', encoding,
+      '--FILEDESC', description,])
+  endif
+
   backend_targets += shared_module(encoding,
-    sources,
+    source_files,
     kwargs: pg_mod_args,
   )
 endforeach
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
index 9f213274d2f..6ced9a31b80 100644
--- a/src/bin/initdb/meson.build
+++ b/src/bin/initdb/meson.build
@@ -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],
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
index 8e197eba5f3..25f5e7a0948 100644
--- a/src/bin/pg_amcheck/meson.build
+++ b/src/bin/pg_amcheck/meson.build
@@ -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],
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
index 87a0d980c4f..aaa2e76977f 100644
--- a/src/bin/pg_archivecleanup/meson.build
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -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,
 )
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
index d26fed9cd8a..2c934e0c26e 100644
--- a/src/bin/pg_basebackup/meson.build
+++ b/src/bin/pg_basebackup/meson.build
@@ -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,
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
index ee1f367bac3..d07ebc999b3 100644
--- a/src/bin/pg_checksums/meson.build
+++ b/src/bin/pg_checksums/meson.build
@@ -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,
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
index 0ecbf2f9d28..4be2fdc84ae 100644
--- a/src/bin/pg_config/meson.build
+++ b/src/bin/pg_config/meson.build
@@ -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,
 )
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
index 557e672beb7..7fc239dbe65 100644
--- a/src/bin/pg_controldata/meson.build
+++ b/src/bin/pg_controldata/meson.build
@@ -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,
 )
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
index 6812e73e329..96f962fa762 100644
--- a/src/bin/pg_ctl/meson.build
+++ b/src/bin/pg_ctl/meson.build
@@ -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,
 )
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
index 785ec094dbd..3527a25c288 100644
--- a/src/bin/pg_dump/meson.build
+++ b/src/bin/pg_dump/meson.build
@@ -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],
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
index 7c5de134ac0..d503db97b71 100644
--- a/src/bin/pg_resetwal/meson.build
+++ b/src/bin/pg_resetwal/meson.build
@@ -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,
 )
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
index d8ec9e482d5..6cd970909a2 100644
--- a/src/bin/pg_rewind/meson.build
+++ b/src/bin/pg_rewind/meson.build
@@ -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],
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
index 2c01831e11f..31d288ba6da 100644
--- a/src/bin/pg_test_fsync/meson.build
+++ b/src/bin/pg_test_fsync/meson.build
@@ -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,
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
index 0a3068f1657..0aed03ea32f 100644
--- a/src/bin/pg_test_timing/meson.build
+++ b/src/bin/pg_test_timing/meson.build
@@ -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,
 )
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
index 02f030e0ccf..a7b927a45c7 100644
--- a/src/bin/pg_upgrade/meson.build
+++ b/src/bin/pg_upgrade/meson.build
@@ -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],
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
index 4c3b2bb5f97..b934a408443 100644
--- a/src/bin/pg_verifybackup/meson.build
+++ b/src/bin/pg_verifybackup/meson.build
@@ -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],
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
index 95872652ffd..9605976870d 100644
--- a/src/bin/pg_waldump/meson.build
+++ b/src/bin/pg_waldump/meson.build
@@ -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],
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
index 6564e54029c..a32eb51fe07 100644
--- a/src/bin/pgbench/meson.build
+++ b/src/bin/pgbench/meson.build
@@ -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],
diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build
index 7a468879fd2..2e9aea4b0e1 100644
--- a/src/bin/pgevent/meson.build
+++ b/src/bin/pgevent/meson.build
@@ -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'
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index ea850c8fdf5..3474389d3b6 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -38,6 +38,12 @@ generated_sources += sql_help.to_list()
 psql_sources += sql_help
 bin_targets += 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('.'),
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
index eaf250c7f73..837562c24e5 100644
--- a/src/bin/scripts/meson.build
+++ b/src/bin/scripts/meson.build
@@ -16,8 +16,16 @@ binaries = [
 ]
 
 foreach binary : binaries
+  binary_sources = files('@0@.c'.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,
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index bc047e00d62..2c9edeaa088 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -16,9 +16,13 @@ libpq_sources = files(
   'libpq-events.c',
   'pqexpbuffer.c',
 )
+libpq_so_sources = [] # only for shared lib, in addition to 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()
@@ -52,6 +56,7 @@ libpq_st = static_library('libpq',
 # not using both_libraries here, causes problems with precompiled headers and
 # resource files with msbuild
 libpq_so = shared_library('libpq',
+  libpq_so_sources,
   dependencies: libpq_deps,
   include_directories: [libpq_inc, postgres_inc],
   c_args: ['-DSO_MAJOR_VERSION=5'],
diff --git a/src/interfaces/libpq/test/meson.build b/src/interfaces/libpq/test/meson.build
index 16f94c1ed8b..017f729d435 100644
--- a/src/interfaces/libpq/test/meson.build
+++ b/src/interfaces/libpq/test/meson.build
@@ -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,
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
index 73b733dd50b..535660085dd 100644
--- a/src/pl/plperl/meson.build
+++ b/src/pl/plperl/meson.build
@@ -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],
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
index dd499fdd151..c46c0a1da2a 100644
--- a/src/pl/plpgsql/src/meson.build
+++ b/src/pl/plpgsql/src/meson.build
@@ -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('.'),
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
index 366b3b171ac..40888386b5f 100644
--- a/src/pl/plpython/meson.build
+++ b/src/pl/plpython/meson.build
@@ -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],
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
index 9b6addd7fd5..f09bb14c950 100644
--- a/src/pl/tcl/meson.build
+++ b/src/pl/tcl/meson.build
@@ -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],
diff --git a/contrib/adminpack/meson.build b/contrib/adminpack/meson.build
index fc2368d02cf..7efec0efbc0 100644
--- a/contrib/adminpack/meson.build
+++ b/contrib/adminpack/meson.build
@@ -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
diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build
index 1db3d20349e..fa807b72d98 100644
--- a/contrib/amcheck/meson.build
+++ b/contrib/amcheck/meson.build
@@ -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
diff --git a/contrib/auth_delay/meson.build b/contrib/auth_delay/meson.build
index d2e01968f54..c4ffb0663bc 100644
--- a/contrib/auth_delay/meson.build
+++ b/contrib/auth_delay/meson.build
@@ -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
diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build
index 249a8376faa..76f86617850 100644
--- a/contrib/auto_explain/meson.build
+++ b/contrib/auto_explain/meson.build
@@ -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
diff --git a/contrib/basebackup_to_shell/meson.build b/contrib/basebackup_to_shell/meson.build
index 9f0517f1701..3a389de9175 100644
--- a/contrib/basebackup_to_shell/meson.build
+++ b/contrib/basebackup_to_shell/meson.build
@@ -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,
diff --git a/contrib/basic_archive/meson.build b/contrib/basic_archive/meson.build
index b67cbef60bd..c30dcfa5d41 100644
--- a/contrib/basic_archive/meson.build
+++ b/contrib/basic_archive/meson.build
@@ -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,
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
index 1fe7632bdbe..16f3b83e4d2 100644
--- a/contrib/bloom/meson.build
+++ b/contrib/bloom/meson.build
@@ -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,
diff --git a/contrib/bool_plperl/meson.build b/contrib/bool_plperl/meson.build
index c20b667d75f..a68daab0dcd 100644
--- a/contrib/bool_plperl/meson.build
+++ b/contrib/bool_plperl/meson.build
@@ -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('.')],
diff --git a/contrib/btree_gin/meson.build b/contrib/btree_gin/meson.build
index 15d6d31a6ee..fd4c76767a7 100644
--- a/contrib/btree_gin/meson.build
+++ b/contrib/btree_gin/meson.build
@@ -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
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
index c0a8d238540..e98c91dacc8 100644
--- a/contrib/btree_gist/meson.build
+++ b/contrib/btree_gist/meson.build
@@ -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,
diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build
index ca60eded80b..26a101a19bd 100644
--- a/contrib/citext/meson.build
+++ b/contrib/citext/meson.build
@@ -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,
diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
index 72342b0c82c..041acf95a90 100644
--- a/contrib/cube/meson.build
+++ b/contrib/cube/meson.build
@@ -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('.'),
diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build
index d35f7b5d49e..66eeb03b736 100644
--- a/contrib/dblink/meson.build
+++ b/contrib/dblink/meson.build
@@ -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 + {
diff --git a/contrib/dict_int/meson.build b/contrib/dict_int/meson.build
index f00e8085619..6fff921adda 100644
--- a/contrib/dict_int/meson.build
+++ b/contrib/dict_int/meson.build
@@ -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
diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build
index be53f55bb79..fabd505a7df 100644
--- a/contrib/dict_xsyn/meson.build
+++ b/contrib/dict_xsyn/meson.build
@@ -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
diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build
index 807f5cb7de3..78dc29c3da3 100644
--- a/contrib/earthdistance/meson.build
+++ b/contrib/earthdistance/meson.build
@@ -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
diff --git a/contrib/file_fdw/meson.build b/contrib/file_fdw/meson.build
index f13efb6e38e..c4071faa669 100644
--- a/contrib/file_fdw/meson.build
+++ b/contrib/file_fdw/meson.build
@@ -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
diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build
index ec278a6211e..e6d06149cec 100644
--- a/contrib/fuzzystrmatch/meson.build
+++ b/contrib/fuzzystrmatch/meson.build
@@ -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
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
index 07c59f40a97..2bb26bb772b 100644
--- a/contrib/hstore/meson.build
+++ b/contrib/hstore/meson.build
@@ -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
diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build
index bbafa0221bd..a238fee6a26 100644
--- a/contrib/hstore_plperl/meson.build
+++ b/contrib/hstore_plperl/meson.build
@@ -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],
diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build
index 214b48519a9..6071aaeb4b3 100644
--- a/contrib/hstore_plpython/meson.build
+++ b/contrib/hstore_plpython/meson.build
@@ -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, ],
diff --git a/contrib/intarray/meson.build b/contrib/intarray/meson.build
index 1655bcbb3fd..b7cf1ce0cad 100644
--- a/contrib/intarray/meson.build
+++ b/contrib/intarray/meson.build
@@ -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,
diff --git a/contrib/isn/meson.build b/contrib/isn/meson.build
index cc30bbeb55c..db68a718313 100644
--- a/contrib/isn/meson.build
+++ b/contrib/isn/meson.build
@@ -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,
diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build
index 5c915d8ed94..071a7a98d2c 100644
--- a/contrib/jsonb_plperl/meson.build
+++ b/contrib/jsonb_plperl/meson.build
@@ -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],
diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build
index de8e1105c6a..84dc1161e8b 100644
--- a/contrib/jsonb_plpython/meson.build
+++ b/contrib/jsonb_plpython/meson.build
@@ -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],
diff --git a/contrib/lo/meson.build b/contrib/lo/meson.build
index 9082d5713c7..61ae131f1cc 100644
--- a/contrib/lo/meson.build
+++ b/contrib/lo/meson.build
@@ -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,
diff --git a/contrib/ltree/meson.build b/contrib/ltree/meson.build
index 9463fc2c5e5..421292cea9d 100644
--- a/contrib/ltree/meson.build
+++ b/contrib/ltree/meson.build
@@ -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,
diff --git a/contrib/ltree_plpython/meson.build b/contrib/ltree_plpython/meson.build
index 429d75006aa..acf5e4a6fc8 100644
--- a/contrib/ltree_plpython/meson.build
+++ b/contrib/ltree_plpython/meson.build
@@ -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],
diff --git a/contrib/oid2name/meson.build b/contrib/oid2name/meson.build
index 1dad5d8f6e7..1a248f19260 100644
--- a/contrib/oid2name/meson.build
+++ b/contrib/oid2name/meson.build
@@ -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,
 )
diff --git a/contrib/old_snapshot/meson.build b/contrib/old_snapshot/meson.build
index 8e7ee09a43a..77276c3715a 100644
--- a/contrib/old_snapshot/meson.build
+++ b/contrib/old_snapshot/meson.build
@@ -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,
diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build
index 4af8153e4fd..3ec50b9445e 100644
--- a/contrib/pageinspect/meson.build
+++ b/contrib/pageinspect/meson.build
@@ -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,
diff --git a/contrib/passwordcheck/meson.build b/contrib/passwordcheck/meson.build
index 7da47d02f1d..383d7df372a 100644
--- a/contrib/passwordcheck/meson.build
+++ b/contrib/passwordcheck/meson.build
@@ -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,
diff --git a/contrib/pg_buffercache/meson.build b/contrib/pg_buffercache/meson.build
index 2c69eae3ea2..dd9948e5f0b 100644
--- a/contrib/pg_buffercache/meson.build
+++ b/contrib/pg_buffercache/meson.build
@@ -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
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
index f795014d7ca..904b37b6e9b 100644
--- a/contrib/pg_freespacemap/meson.build
+++ b/contrib/pg_freespacemap/meson.build
@@ -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
diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build
index bdca9af4f27..b7140cee34b 100644
--- a/contrib/pg_prewarm/meson.build
+++ b/contrib/pg_prewarm/meson.build
@@ -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
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
index ac117d2fc1d..854df138e76 100644
--- a/contrib/pg_stat_statements/meson.build
+++ b/contrib/pg_stat_statements/meson.build
@@ -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'],
   },
diff --git a/contrib/pg_surgery/meson.build b/contrib/pg_surgery/meson.build
index ac71caa5276..7b5c5999f4b 100644
--- a/contrib/pg_surgery/meson.build
+++ b/contrib/pg_surgery/meson.build
@@ -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
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
index a90628d23c6..c8c7c07b308 100644
--- a/contrib/pg_trgm/meson.build
+++ b/contrib/pg_trgm/meson.build
@@ -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
diff --git a/contrib/pg_visibility/meson.build b/contrib/pg_visibility/meson.build
index 933dc99ac4d..263a0d08b82 100644
--- a/contrib/pg_visibility/meson.build
+++ b/contrib/pg_visibility/meson.build
@@ -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
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
index d6b27877dd0..4314a3182a2 100644
--- a/contrib/pg_walinspect/meson.build
+++ b/contrib/pg_walinspect/meson.build
@@ -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 + {
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
index fe0851bf8e8..7fc7bbc7ca1 100644
--- a/contrib/pgcrypto/meson.build
+++ b/contrib/pgcrypto/meson.build
@@ -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,
diff --git a/contrib/pgrowlocks/meson.build b/contrib/pgrowlocks/meson.build
index 1b41691a2a3..8092f0d4a64 100644
--- a/contrib/pgrowlocks/meson.build
+++ b/contrib/pgrowlocks/meson.build
@@ -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
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
index 8e828692d5c..05e4cd46a5c 100644
--- a/contrib/pgstattuple/meson.build
+++ b/contrib/pgstattuple/meson.build
@@ -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
diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build
index 378885ec93b..d3746ff135c 100644
--- a/contrib/postgres_fdw/meson.build
+++ b/contrib/postgres_fdw/meson.build
@@ -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 + {
diff --git a/contrib/seg/meson.build b/contrib/seg/meson.build
index e476eab2a77..c6fbb22999b 100644
--- a/contrib/seg/meson.build
+++ b/contrib/seg/meson.build
@@ -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('.'),
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
index 60a95e17c2f..8bef239e3c2 100644
--- a/contrib/sepgsql/meson.build
+++ b/contrib/sepgsql/meson.build
@@ -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 + {
diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build
index 98008980ec2..e7d78189ef5 100644
--- a/contrib/spi/meson.build
+++ b/contrib/spi/meson.build
@@ -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,
 )
diff --git a/contrib/sslinfo/meson.build b/contrib/sslinfo/meson.build
index 53f752a08ac..136983e783d 100644
--- a/contrib/sslinfo/meson.build
+++ b/contrib/sslinfo/meson.build
@@ -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']],
   }
diff --git a/contrib/tablefunc/meson.build b/contrib/tablefunc/meson.build
index f4230096c0c..d2ddc8d3b39 100644
--- a/contrib/tablefunc/meson.build
+++ b/contrib/tablefunc/meson.build
@@ -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
diff --git a/contrib/tcn/meson.build b/contrib/tcn/meson.build
index c3a025247d4..71261c3b0a2 100644
--- a/contrib/tcn/meson.build
+++ b/contrib/tcn/meson.build
@@ -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
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
index dd7cb0101ad..6376103c689 100644
--- a/contrib/test_decoding/meson.build
+++ b/contrib/test_decoding/meson.build
@@ -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,
diff --git a/contrib/tsm_system_rows/meson.build b/contrib/tsm_system_rows/meson.build
index b9cd42115a8..380abb49883 100644
--- a/contrib/tsm_system_rows/meson.build
+++ b/contrib/tsm_system_rows/meson.build
@@ -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
diff --git a/contrib/tsm_system_time/meson.build b/contrib/tsm_system_time/meson.build
index 18015912ffb..e57a2702c60 100644
--- a/contrib/tsm_system_time/meson.build
+++ b/contrib/tsm_system_time/meson.build
@@ -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
diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build
index 872b76e3223..438035132f8 100644
--- a/contrib/unaccent/meson.build
+++ b/contrib/unaccent/meson.build
@@ -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
diff --git a/contrib/uuid-ossp/meson.build b/contrib/uuid-ossp/meson.build
index da6d1d75c12..28730f398f0 100644
--- a/contrib/uuid-ossp/meson.build
+++ b/contrib/uuid-ossp/meson.build
@@ -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']],
   },
diff --git a/contrib/vacuumlo/meson.build b/contrib/vacuumlo/meson.build
index 7a632b87d1b..846de47dbd1 100644
--- a/contrib/vacuumlo/meson.build
+++ b/contrib/vacuumlo/meson.build
@@ -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,
 )
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
index 9c0b56f01f6..89b0d677516 100644
--- a/contrib/xml2/meson.build
+++ b/contrib/xml2/meson.build
@@ -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']],
   },
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index 5887cb92b52..e5dc0edc04b 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -1,7 +1,11 @@
 export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
 
-ecpg_compat = both_libraries('libecpg_compat',
+ecpg_compat_sources = files(
   'informix.c',
+)
+
+ecpg_compat = both_libraries('libecpg_compat',
+  ecpg_compat_sources,
   include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
   c_args: ['-DSO_MAJOR_VERSION=3'],
   dependencies: [frontend_code, thread_dep],
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
index 1be49c8c27f..74876f039c9 100644
--- a/src/interfaces/ecpg/preproc/meson.build
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -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],
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
index f0ace641f0c..f67f2dffb71 100644
--- a/src/interfaces/ecpg/test/meson.build
+++ b/src/interfaces/ecpg/test/meson.build
@@ -7,6 +7,12 @@ 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',
+    '--FILEDESC', 'ECPG Test - regression tests for ECPG',])
+endif
+
 pg_regress_ecpg = executable('pg_regress_ecpg',
   pg_regress_ecpg_sources,
   c_args: pg_regress_cflags,
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
index c7656fd4609..ba27b8c1d44 100644
--- a/src/test/isolation/meson.build
+++ b/src/test/isolation/meson.build
@@ -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('.'),
diff --git a/src/test/modules/delay_execution/meson.build b/src/test/modules/delay_execution/meson.build
index cf4bdaba637..a0c3ab6afe7 100644
--- a/src/test/modules/delay_execution/meson.build
+++ b/src/test/modules/delay_execution/meson.build
@@ -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
diff --git a/src/test/modules/dummy_index_am/meson.build b/src/test/modules/dummy_index_am/meson.build
index 56ff5f48001..4ce82491135 100644
--- a/src/test/modules/dummy_index_am/meson.build
+++ b/src/test/modules/dummy_index_am/meson.build
@@ -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
diff --git a/src/test/modules/dummy_seclabel/meson.build b/src/test/modules/dummy_seclabel/meson.build
index 21b7cf8f353..81b626e496c 100644
--- a/src/test/modules/dummy_seclabel/meson.build
+++ b/src/test/modules/dummy_seclabel/meson.build
@@ -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
diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build
index 8384b6e3b2a..de0e2d15626 100644
--- a/src/test/modules/libpq_pipeline/meson.build
+++ b/src/test/modules/libpq_pipeline/meson.build
@@ -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,
diff --git a/src/test/modules/plsample/meson.build b/src/test/modules/plsample/meson.build
index 45de3f1990d..e1ea2c7a16f 100644
--- a/src/test/modules/plsample/meson.build
+++ b/src/test/modules/plsample/meson.build
@@ -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
diff --git a/src/test/modules/spgist_name_ops/meson.build b/src/test/modules/spgist_name_ops/meson.build
index 857fc7e140e..445296fee0b 100644
--- a/src/test/modules/spgist_name_ops/meson.build
+++ b/src/test/modules/spgist_name_ops/meson.build
@@ -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
diff --git a/src/test/modules/ssl_passphrase_callback/meson.build b/src/test/modules/ssl_passphrase_callback/meson.build
index a57bd0693a3..a9eb4c564da 100644
--- a/src/test/modules/ssl_passphrase_callback/meson.build
+++ b/src/test/modules/ssl_passphrase_callback/meson.build
@@ -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']],
   },
diff --git a/src/test/modules/test_bloomfilter/meson.build b/src/test/modules/test_bloomfilter/meson.build
index 945eb5a70c4..3cf6b05754f 100644
--- a/src/test/modules/test_bloomfilter/meson.build
+++ b/src/test/modules/test_bloomfilter/meson.build
@@ -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
diff --git a/src/test/modules/test_ddl_deparse/meson.build b/src/test/modules/test_ddl_deparse/meson.build
index 81ad5adc526..54d44f9b2b4 100644
--- a/src/test/modules/test_ddl_deparse/meson.build
+++ b/src/test/modules/test_ddl_deparse/meson.build
@@ -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
diff --git a/src/test/modules/test_ginpostinglist/meson.build b/src/test/modules/test_ginpostinglist/meson.build
index abf0a3b0430..b3b49c56122 100644
--- a/src/test/modules/test_ginpostinglist/meson.build
+++ b/src/test/modules/test_ginpostinglist/meson.build
@@ -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
diff --git a/src/test/modules/test_integerset/meson.build b/src/test/modules/test_integerset/meson.build
index c32c469c69a..4bd75af4b5e 100644
--- a/src/test/modules/test_integerset/meson.build
+++ b/src/test/modules/test_integerset/meson.build
@@ -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
diff --git a/src/test/modules/test_lfind/meson.build b/src/test/modules/test_lfind/meson.build
index a388de1156a..c5405b8f878 100644
--- a/src/test/modules/test_lfind/meson.build
+++ b/src/test/modules/test_lfind/meson.build
@@ -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
diff --git a/src/test/modules/test_oat_hooks/meson.build b/src/test/modules/test_oat_hooks/meson.build
index 5faf0459777..8802bbbac55 100644
--- a/src/test/modules/test_oat_hooks/meson.build
+++ b/src/test/modules/test_oat_hooks/meson.build
@@ -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
diff --git a/src/test/modules/test_parser/meson.build b/src/test/modules/test_parser/meson.build
index b59960f615e..1c17113347f 100644
--- a/src/test/modules/test_parser/meson.build
+++ b/src/test/modules/test_parser/meson.build
@@ -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
diff --git a/src/test/modules/test_predtest/meson.build b/src/test/modules/test_predtest/meson.build
index 1cfa84b3609..9a5be43c9c0 100644
--- a/src/test/modules/test_predtest/meson.build
+++ b/src/test/modules/test_predtest/meson.build
@@ -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
diff --git a/src/test/modules/test_rbtree/meson.build b/src/test/modules/test_rbtree/meson.build
index 34cbc3e1624..f067e08d321 100644
--- a/src/test/modules/test_rbtree/meson.build
+++ b/src/test/modules/test_rbtree/meson.build
@@ -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
diff --git a/src/test/modules/test_regex/meson.build b/src/test/modules/test_regex/meson.build
index 867a64e57c3..cfb938d9f1e 100644
--- a/src/test/modules/test_regex/meson.build
+++ b/src/test/modules/test_regex/meson.build
@@ -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
diff --git a/src/test/modules/test_rls_hooks/meson.build b/src/test/modules/test_rls_hooks/meson.build
index 80d8adda332..3fb273b2934 100644
--- a/src/test/modules/test_rls_hooks/meson.build
+++ b/src/test/modules/test_rls_hooks/meson.build
@@ -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
diff --git a/src/test/modules/test_shm_mq/meson.build b/src/test/modules/test_shm_mq/meson.build
index b663543d616..16c8fdb57f4 100644
--- a/src/test/modules/test_shm_mq/meson.build
+++ b/src/test/modules/test_shm_mq/meson.build
@@ -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
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
index 32acad883b2..a4a158c75b9 100644
--- a/src/test/modules/worker_spi/meson.build
+++ b/src/test/modules/worker_spi/meson.build
@@ -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
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
index fd8ee995b79..963c0f64ed5 100644
--- a/src/test/regress/meson.build
+++ b/src/test/regress/meson.build
@@ -8,6 +8,12 @@ regress_sources = pg_regress_c + files(
 
 pg_regress_cflags = ['-DHOST_TUPLE="frak"', '-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,
diff --git a/meson.build b/meson.build
index 6ffae59ba03..4ad06b25213 100644
--- a/meson.build
+++ b/meson.build
@@ -2523,6 +2523,67 @@ 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'
+    rcgen_base_args += [
+      '--rc', find_program('rc', required: true).path(),
+    ]
+    rcgen_outputs = ['@BASENAME@.rc', '@BASENAME@.res']
+  else
+    rcgen_base_args += [
+      '--windres', find_program('windres', required: true).path(),
+    ]
+    rcgen_outputs = ['@BASENAME@.rc', '@BASENAME@.obj']
+  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: '@BASENAME@.d',
+    arguments: rcgen_bin_args,
+    output: rcgen_outputs,
+  )
+
+  rc_lib_gen = generator(rcgen,
+    depfile: '@BASENAME@.d',
+    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
diff --git a/src/timezone/meson.build b/src/timezone/meson.build
index 16f082ecfa8..9e0934c000b 100644
--- a/src/timezone/meson.build
+++ b/src/timezone/meson.build
@@ -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
index 00000000000..5b62bfe5410
--- /dev/null
+++ b/src/tools/rcgen
@@ -0,0 +1,99 @@
+#!/usr/bin/env python3
+
+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'))
-- 
2.37.3.542.gdd3f6c4cae

