From eb9d3d64a8653dac3e4c85f7b38e03520b376fcb Mon Sep 17 00:00:00 2001
From: Zsolt Parragi <zsolt.parragi@percona.com>
Date: Sat, 14 Mar 2026 15:33:43 +0000
Subject: [PATCH 3/3] Consolidate libpq headers into central public/internal
 list files

Move the libpq public and internal header entries into the central
list files in src/include/. Both src/include/ and src/interfaces/libpq/
now read from the same lists and filter by local file existence:
$(wildcard) in make, fs.is_file() in meson.

This eliminates the separate per-directory list files for libpq,
giving a single view of all public and internal headers regardless
of which source directory they live in.
---
 src/include/Makefile                       | 6 ++++--
 src/include/internal_headers.list          | 9 ++++++++-
 src/include/meson.build                    | 2 +-
 src/include/public_headers.list            | 6 +++++-
 src/interfaces/libpq/Makefile              | 6 ++++--
 src/interfaces/libpq/internal_headers.list | 4 ----
 src/interfaces/libpq/meson.build           | 8 ++++----
 src/interfaces/libpq/public_headers.list   | 3 ---
 8 files changed, 26 insertions(+), 18 deletions(-)
 delete mode 100644 src/interfaces/libpq/internal_headers.list
 delete mode 100644 src/interfaces/libpq/public_headers.list

diff --git a/src/include/Makefile b/src/include/Makefile
index f2bed2578a5..c8881ad4d2c 100644
--- a/src/include/Makefile
+++ b/src/include/Makefile
@@ -12,8 +12,10 @@ subdir = src/include
 top_builddir = ../..
 include $(top_builddir)/src/Makefile.global
 
-PUBLIC_HEADERS := $(shell grep -v '^\#' $(srcdir)/public_headers.list | grep -v '^$$')
-INTERNAL_HEADERS := $(shell grep -v '^\#' $(srcdir)/internal_headers.list | grep -v '^$$')
+_ALL_PUBLIC := $(shell grep -v '^\#' $(srcdir)/public_headers.list | grep -v '^$$')
+PUBLIC_HEADERS := $(foreach h,$(_ALL_PUBLIC),$(if $(wildcard $(srcdir)/$(h)),$(h)))
+_ALL_INTERNAL := $(shell grep -v '^\#' $(srcdir)/internal_headers.list | grep -v '^$$')
+INTERNAL_HEADERS := $(foreach h,$(_ALL_INTERNAL),$(if $(wildcard $(srcdir)/$(h)),$(h)))
 SERVER_HEADERS := $(shell grep -v '^\#' $(srcdir)/server_headers.list | grep -v '^$$')
 
 all: pg_config.h pg_config_os.h
diff --git a/src/include/internal_headers.list b/src/include/internal_headers.list
index 8e12f4d7cd6..86b99b8a823 100644
--- a/src/include/internal_headers.list
+++ b/src/include/internal_headers.list
@@ -2,10 +2,17 @@
 #
 # These headers are needed by the not-so-public headers of the interfaces,
 # i.e. for client library development.
+#
+# Each source directory installs only the entries that exist locally.
 
+# src/include
 c.h
 port.h
 postgres_fe.h
-
 libpq/pqcomm.h
 libpq/protocol.h
+
+# src/interfaces/libpq
+fe-auth-sasl.h
+libpq-int.h
+pqexpbuffer.h
diff --git a/src/include/meson.build b/src/include/meson.build
index c03e508b961..9279083280c 100644
--- a/src/include/meson.build
+++ b/src/include/meson.build
@@ -83,7 +83,7 @@ foreach list_file, base_dir : _header_lists
   batch = []
   foreach line : fs.read(list_file).strip().split('\n')
     f = line.strip()
-    if f == '' or f.startswith('#')
+    if f == '' or f.startswith('#') or not fs.is_file(f)
       continue
     endif
     d = fs.parent(f)
diff --git a/src/include/public_headers.list b/src/include/public_headers.list
index 2cd1df6f8ab..bacd3854341 100644
--- a/src/include/public_headers.list
+++ b/src/include/public_headers.list
@@ -6,7 +6,11 @@
 #
 # Each source directory installs only the entries that exist locally.
 
+# src/include
 pg_config_manual.h
 postgres_ext.h
-
 libpq/libpq-fs.h
+
+# src/interfaces/libpq
+libpq-events.h
+libpq-fe.h
diff --git a/src/interfaces/libpq/Makefile b/src/interfaces/libpq/Makefile
index b9319fab869..9d599f20e05 100644
--- a/src/interfaces/libpq/Makefile
+++ b/src/interfaces/libpq/Makefile
@@ -15,8 +15,10 @@ subdir = src/interfaces/libpq
 top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
-PUBLIC_HEADERS := $(shell grep -v '^\#' $(srcdir)/public_headers.list | grep -v '^$$')
-INTERNAL_HEADERS := $(shell grep -v '^\#' $(srcdir)/internal_headers.list | grep -v '^$$')
+_ALL_PUBLIC := $(shell grep -v '^\#' $(top_srcdir)/src/include/public_headers.list | grep -v '^$$')
+PUBLIC_HEADERS := $(foreach h,$(_ALL_PUBLIC),$(if $(wildcard $(srcdir)/$(h)),$(h)))
+_ALL_INTERNAL := $(shell grep -v '^\#' $(top_srcdir)/src/include/internal_headers.list | grep -v '^$$')
+INTERNAL_HEADERS := $(foreach h,$(_ALL_INTERNAL),$(if $(wildcard $(srcdir)/$(h)),$(h)))
 
 export with_ssl with_gssapi with_krb_srvnam
 
diff --git a/src/interfaces/libpq/internal_headers.list b/src/interfaces/libpq/internal_headers.list
deleted file mode 100644
index 635f735b0ad..00000000000
--- a/src/interfaces/libpq/internal_headers.list
+++ /dev/null
@@ -1,4 +0,0 @@
-# Internal libpq headers installed to $(includedir_internal)
-fe-auth-sasl.h
-libpq-int.h
-pqexpbuffer.h
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index 09f7f8c85c0..3776fe57e84 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -133,18 +133,18 @@ pkgconfig.generate(
 )
 
 _h = []
-foreach l : fs.read('public_headers.list').strip().split('\n')
+foreach l : fs.read('../../include/public_headers.list').strip().split('\n')
   l = l.strip()
-  if l != '' and not l.startswith('#')
+  if l != '' and not l.startswith('#') and fs.is_file(l)
     _h += l
   endif
 endforeach
 install_headers(_h)
 
 _h = []
-foreach l : fs.read('internal_headers.list').strip().split('\n')
+foreach l : fs.read('../../include/internal_headers.list').strip().split('\n')
   l = l.strip()
-  if l != '' and not l.startswith('#')
+  if l != '' and not l.startswith('#') and fs.is_file(l)
     _h += l
   endif
 endforeach
diff --git a/src/interfaces/libpq/public_headers.list b/src/interfaces/libpq/public_headers.list
deleted file mode 100644
index 26dbe72b8ea..00000000000
--- a/src/interfaces/libpq/public_headers.list
+++ /dev/null
@@ -1,3 +0,0 @@
-# Public libpq headers installed to $(includedir)
-libpq-events.h
-libpq-fe.h
-- 
2.43.0

