3939# SCRIPTS_built -- script files (not binaries) to install into $PREFIX/bin,
4040# which need to be built first
4141# HEADERS -- files to install into $(includedir_server)/$MODULEDIR/$MODULE_big
42- # HEADERS_built -- as above but built first
42+ # HEADERS_built -- as above but built first (but NOT cleaned)
4343# HEADERS_$(MODULE) -- files to install into
4444# $(includedir_server)/$MODULEDIR/$MODULE; the value of $MODULE must be
4545# listed in MODULES or MODULE_big
46- # HEADERS_built_$(MODULE) -- as above but built first
46+ # HEADERS_built_$(MODULE) -- as above but built first (also NOT cleaned)
4747# REGRESS -- list of regression test cases (without suffix)
4848# REGRESS_OPTS -- additional switches to pass to pg_regress
4949# NO_INSTALLCHECK -- don't define an installcheck target, useful e.g. if
@@ -117,6 +117,8 @@ ifdef PG_CPPFLAGS
117117override CPPFLAGS := $(PG_CPPFLAGS ) $(CPPFLAGS )
118118endif
119119
120+ # logic for HEADERS_* stuff
121+
120122# get list of all names used with or without built_ prefix
121123# note that use of HEADERS_built_foo will get both "foo" and "built_foo",
122124# we cope with that later when filtering this list against MODULES.
@@ -128,44 +130,54 @@ HEADER_alldirs := $(patsubst HEADERS_%,%,$(filter HEADERS_%, $(.VARIABLES)))
128130HEADER_alldirs += $(patsubst HEADERS_built_% ,% ,$(filter HEADERS_built_% , $(.VARIABLES ) ) )
129131
130132# collect all names of built headers to use as a dependency
131- HEADER_allbuilt =
133+ HEADER_allbuilt : =
132134
133- # HEADERS is an error in the absence of MODULE_big to provide a dir name
134135ifdef MODULE_big
135- ifdef HEADERS
136+
137+ # we can unconditionally add $(MODULE_big) here, because we will strip it
138+ # back out below if it turns out not to actually define any headers.
136139HEADER_dirs := $(MODULE_big )
137140HEADER_unbuilt_$(MODULE_big) = $(HEADERS )
138141HEADER_built_$(MODULE_big) = $(HEADERS_built )
139142HEADER_allbuilt += $(HEADERS_built )
140- else ifdef HEADERS_built
141- HEADER_dirs := $(MODULE_big )
142- HEADER_built_$(MODULE_big) = $(HEADERS_built )
143- HEADER_allbuilt += $(HEADERS_built )
144- else
145- # file might have used HEADERS_foo or HEADERS_built_foo, so check for those
146- HEADER_dirs := $(if $(filter $(MODULE_big ) built_$(MODULE_big ) ,$(HEADER_alldirs ) ) ,$(MODULE_big ) )
147- HEADER_unbuilt_$(MODULE_big) = $(HEADERS_$(MODULE_big ) )
148- HEADER_built_$(MODULE_big) = $(HEADERS_built_$(MODULE_big ) )
149- HEADER_allbuilt += $(HEADERS_built_$(MODULE_big ) )
150- endif
151- else
143+ # treat "built" as an exclusion below as well as "built_foo"
144+ HEADER_xdirs := built built_$(MODULE_big )
145+
146+ else # not MODULE_big, so check MODULES
147+
148+ # HEADERS is an error in the absence of MODULE_big to provide a dir name
152149ifdef HEADERS
153150$(error HEADERS requires MODULE_big to be set)
154151endif
155152# make list of modules that have either HEADERS_foo or HEADERS_built_foo
156153HEADER_dirs := $(foreach m,$(MODULES ) ,$(if $(filter $(m ) built_$(m ) ,$(HEADER_alldirs ) ) ,$(m ) ) )
154+ # make list of conflicting names to exclude
155+ HEADER_xdirs := $(addprefix built_,$(HEADER_dirs ) )
156+
157+ endif # MODULE_big or MODULES
158+
159+ # HEADERS_foo requires that "foo" is in MODULES as a sanity check
160+ ifneq (,$(filter-out $(HEADER_dirs ) $(HEADER_xdirs ) ,$(HEADER_alldirs ) ) )
161+ $(error $(patsubst %,HEADERS_%,$(filter-out $(HEADER_dirs) $(HEADER_xdirs),$(HEADER_alldirs))) defined with no module)
162+ endif
163+
157164# assign HEADER_unbuilt_foo and HEADER_built_foo, but make sure
158165# that "built" takes precedence in the case of conflict, by removing
159166# conflicting module names when matching the unbuilt name
160- $(foreach m,$(filter-out $(addprefix built_,$(MODULES)),$(MODULES)),$(eval HEADER_unbuilt_$(m) = $$(HEADERS_$(m))))
161- $(foreach m,$(MODULES),$(eval HEADER_built_$(m) = $$(HEADERS_built_$(m))))
162- $(foreach m,$(MODULES),$(eval HEADER_allbuilt += $$(HEADERS_built_$(m))))
163- endif
167+ $(foreach m,$(filter-out $(HEADER_xdirs),$(HEADER_dirs)),$(eval HEADER_unbuilt_$(m) += $$(HEADERS_$(m))))
168+ $(foreach m,$(HEADER_dirs),$(eval HEADER_built_$(m) += $$(HEADERS_built_$(m))))
169+ $(foreach m,$(HEADER_dirs),$(eval HEADER_allbuilt += $$(HEADERS_built_$(m))))
164170
165- # HEADERS_foo requires that "foo" is in MODULES as a sanity check
166- ifneq ($(filter-out $(HEADER_dirs ) $(addprefix built_,$(HEADER_dirs ) ) ,$(HEADER_alldirs ) ) ,)
167- $(error $(patsubst %,HEADERS_%,$(filter-out $(HEADER_dirs) $(addprefix built_,$(HEADER_dirs)),$(HEADER_alldirs))) defined with no module)
168- endif
171+ # expand out the list of headers for each dir, attaching source prefixes
172+ header_file_list = $(HEADER_built_$(1 ) ) $(addprefix $(srcdir ) /,$(HEADER_unbuilt_$(1 ) ) )
173+ $(foreach m,$(HEADER_dirs),$(eval HEADER_files_$(m) := $$(call header_file_list,$$(m))))
174+
175+ # note that the caller's HEADERS* vars have all been expanded now, and
176+ # later changes will have no effect.
177+
178+ # remove entries in HEADER_dirs that produced an empty list of files,
179+ # to ensure we don't try and install them
180+ HEADER_dirs := $(foreach m,$(HEADER_dirs ) ,$(if $(strip $(HEADER_files_$(m ) ) ) ,$(m ) ) )
169181
170182# Functions for generating install/uninstall commands; the blank lines
171183# before the "endef" are required, don't lose them
@@ -181,6 +193,8 @@ rm -f $(addprefix '$(DESTDIR)$(includedir_server)/$(incmoduledir)/$(1)'/, $(notd
181193
182194endef
183195
196+ # end of HEADERS_* stuff
197+
184198
185199all : $(PROGRAM ) $(DATA_built ) $(HEADER_allbuilt ) $(SCRIPTS_built ) $(addsuffix $(DLSUFFIX ) , $(MODULES ) ) $(addsuffix .control, $(EXTENSION ) )
186200
@@ -228,9 +242,8 @@ endif # SCRIPTS
228242ifdef SCRIPTS_built
229243 $(INSTALL_SCRIPT) $(SCRIPTS_built) '$(DESTDIR)$(bindir)/'
230244endif # SCRIPTS_built
231- ifneq ($(strip $(HEADER_dirs ) ) ,)
232- $(foreach dir,$(HEADER_dirs),$(if $(HEADER_unbuilt_$(dir)),$(call install_headers,$(dir),$(addprefix $(srcdir)/, $(HEADER_unbuilt_$(dir))))))
233- $(foreach dir,$(HEADER_dirs),$(if $(HEADER_built_$(dir)),$(call install_headers,$(dir),$(HEADER_built_$(dir)))))
245+ ifneq (,$(strip $(HEADER_dirs ) ) )
246+ $(foreach dir,$(HEADER_dirs),$(call install_headers,$(dir),$(HEADER_files_$(dir))))
234247endif # HEADERS
235248ifdef MODULE_big
236249ifeq ($(with_llvm ) , yes)
@@ -296,8 +309,8 @@ endif
296309ifdef SCRIPTS_built
297310 rm -f $(addprefix '$(DESTDIR)$(bindir)'/, $(SCRIPTS_built))
298311endif
299- ifneq ($(strip $(HEADER_dirs ) ) , )
300- $(foreach dir,$(HEADER_dirs),$(call uninstall_headers,$(dir),$(HEADER_unbuilt_$(dir)) $(HEADER_built_ $(dir))))
312+ ifneq (, $(strip $(HEADER_dirs ) ) )
313+ $(foreach dir,$(HEADER_dirs),$(call uninstall_headers,$(dir),$(HEADER_files_ $(dir))))
301314endif # HEADERS
302315
303316ifdef MODULE_big
0 commit comments