]> granicus.if.org Git - postgresql/commitdiff
Fix partial-build problems introduced by having more generated headers.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 9 Apr 2018 20:42:02 +0000 (16:42 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 9 Apr 2018 20:42:10 +0000 (16:42 -0400)
Commit 372728b0d created some problems for usages like building a
subdirectory without having first done "make all" at the top level,
or for proceeding directly to "make install" without "make all".
The only reasonably clean way to fix this seems to be to force the
submake-generated-headers rule to fire in *any* "make all" or "make
install" command anywhere in the tree.  To avoid lots of redundant work,
as well as parallel make jobs possibly clobbering each others' output, we
still need to be sure that the rule fires only once in a recursive build.
For that, adopt the same MAKELEVEL hack previously used for "temp-install".
But try to document it a bit better.

The submake-errcodes mechanism previously used in src/port/ and src/common/
is subsumed by this, so we can get rid of those special cases.  It was
inadequate for src/common/ anyway after the aforesaid commit, and it always
risked parallel attempts to build errcodes.h.

Discussion: https://postgr.es/m/E1f5FAB-0006LU-MB@gemulon.postgresql.org

doc/src/sgml/Makefile
src/Makefile
src/Makefile.global.in
src/backend/Makefile
src/backend/jit/llvm/Makefile
src/common/Makefile
src/pl/plpython/Makefile
src/port/Makefile
src/test/modules/Makefile
src/test/regress/GNUmakefile

index f122b4187f4300fc7dc3b9afdbbf95395e1db6ab..74aac01c395d835c539f5f1ae78d4ebe117a22ab 100644 (file)
@@ -17,6 +17,8 @@
 # to want to use.
 html:
 
+# We don't need the tree-wide headers or install support here.
+NO_GENERATED_HEADERS=yes
 NO_TEMP_INSTALL=yes
 
 subdir = doc/src/sgml
index 0e56399cb9a4e9d2de8a3d5ea095aea611c750f0..bcdbd9588aa437ce3a41123e71be07154653645b 100644 (file)
@@ -41,11 +41,6 @@ endif
 
 $(recurse)
 
-# Update the commonly used headers before building the subdirectories;
-# otherwise, in a parallel build, several different sub-jobs will try to
-# remake them concurrently
-$(SUBDIRS:%=all-%-recurse): | submake-generated-headers
-
 install: install-local
 
 install-local: installdirs-local
index 19c9c1e11e8f4ced001fe102149f07d8924aab56..20090b360e3274a0d604791f095e8b516c16f29c 100644 (file)
@@ -348,11 +348,39 @@ XGETTEXT = @XGETTEXT@
 GZIP   = gzip
 BZIP2  = bzip2
 
+
+# Tree-wide build support
+
+# Just about every code subdirectory wants to have the generated headers
+# available before building, but we don't want parallel makes all trying
+# to build the same headers.  These rules, together with the recursion rules
+# below, ensure that we update the generated headers once, if needed,
+# at the top level of any "make all" or "make install" request.  If a
+# particular subdirectory knows this isn't needed in itself or its children,
+# it can set NO_GENERATED_HEADERS.
+
+all install: submake-generated-headers
+
+.PHONY: submake-generated-headers
+
+submake-generated-headers:
+ifndef NO_GENERATED_HEADERS
+ifeq ($(MAKELEVEL),0)
+       $(MAKE) -C $(top_builddir)/src/backend generated-headers
+endif
+endif
+
+
 # Testing
 
+# In much the same way as above, these rules ensure that we build a temp
+# install tree just once in any recursive "make check".  The additional test
+# on abs_top_builddir prevents doing anything foolish to the root directory.
+
 check: temp-install
 
 .PHONY: temp-install
+
 temp-install:
 ifndef NO_TEMP_INSTALL
 ifneq ($(abs_top_builddir),)
@@ -544,10 +572,7 @@ submake-libpgfeutils:
        $(MAKE) -C $(top_builddir)/src/common all
        $(MAKE) -C $(top_builddir)/src/fe_utils all
 
-submake-generated-headers:
-       $(MAKE) -C $(top_builddir)/src/backend generated-headers
-
-.PHONY: submake-libpq submake-libpgport submake-libpgfeutils submake-generated-headers
+.PHONY: submake-libpq submake-libpgport submake-libpgfeutils
 
 
 ##########################################################################
@@ -782,7 +807,9 @@ endif
 
 # This function is only for internal use below.  It should be called
 # using $(eval).  It will set up a target so that it recurses into
-# a given subdirectory.  Note that to avoid a nasty bug in make 3.80,
+# a given subdirectory.  For the tree-wide all/install/check cases,
+# ensure we do our one-time tasks before recursing (see targets above).
+# Note that to avoid a nasty bug in make 3.80,
 # this function has to avoid using any complicated constructs (like
 # multiple targets on a line) and also not contain any lines that expand
 # to more than about 200 bytes.  This is why we make it apply to just one
@@ -793,7 +820,7 @@ endif
 define _create_recursive_target
 .PHONY: $(1)-$(2)-recurse
 $(1): $(1)-$(2)-recurse
-$(1)-$(2)-recurse: $(if $(filter check, $(3)), temp-install)
+$(1)-$(2)-recurse: $(if $(filter all install, $(3)), submake-generated-headers) $(if $(filter check, $(3)), temp-install)
        $$(MAKE) -C $(2) $(3)
 endef
 # Note that the use of $$ on the last line above is important; we want
index 82a59eac2d772aab42ff048b6713cc3669dc77d8..1aaf1ec2f59819f390631fd0b9323430df8a0221 100644 (file)
@@ -111,14 +111,6 @@ endif
 
 endif # aix
 
-# Update the commonly used headers before building the subdirectories
-$(SUBDIRS:%=%-recursive): | generated-headers
-
-# src/port needs a convenient way to force just errcodes.h to get built
-submake-errcodes: $(top_builddir)/src/include/utils/errcodes.h
-
-.PHONY: submake-errcodes
-
 $(top_builddir)/src/port/libpgport_srv.a: | submake-libpgport
 
 
index d7a36d73717999659824ddce8cdb145163eb4ff8..e2db4cea65cdf877e2822a5445560b67c8479f7d 100644 (file)
@@ -27,7 +27,6 @@ CFLAGS += $(LLVM_CFLAGS)
 CXXFLAGS += $(LLVM_CXXFLAGS)
 override CPPFLAGS := $(LLVM_CPPFLAGS) $(CPPFLAGS)
 SHLIB_LINK += $(LLVM_LIBS)
-SHLIB_PREREQS += submake-generated-headers
 
 # Because this module includes C++ files, we need to use a C++
 # compiler for linking. Makefile.shlib uses $(COMPILER) to build
index e9e75867f3c3429daca70d83f0ca9a22e8cc14d1..1fc2c66225bed8f816c0edff809de68e30f6255c 100644 (file)
@@ -88,13 +88,6 @@ libpgcommon_srv.a: $(OBJS_SRV)
 %_srv.o: %.c %.o
        $(CC) $(CFLAGS) $(subst -DFRONTEND ,, $(CPPFLAGS)) -c $< -o $@
 
-$(OBJS_SRV): | submake-errcodes
-
-.PHONY: submake-errcodes
-
-submake-errcodes:
-       $(MAKE) -C ../backend submake-errcodes
-
 # Dependencies of keywords.o need to be managed explicitly to make sure
 # that you don't get broken parsing code, even in a non-enable-depend build.
 # Note that gram.h isn't required for the frontend version of keywords.o.
index d09910835d1f30f311f1916be07f3143583ed717..fb785496ea57e736196b020722dc829909997237 100644 (file)
@@ -99,9 +99,6 @@ include $(top_srcdir)/src/Makefile.shlib
 
 all: all-lib
 
-$(OBJS): | submake-generated-headers
-
-
 install: all install-lib install-data
 
 installdirs: installdirs-lib
index f328b705e46f55da7e98048f9554c51406d82934..d7467fb0788d04b1a57e00930b685288d4e83bc6 100644 (file)
@@ -87,13 +87,6 @@ libpgport_srv.a: $(OBJS_SRV)
 %_srv.o: %.c %.o
        $(CC) $(CFLAGS) $(subst -DFRONTEND,, $(CPPFLAGS)) -c $< -o $@
 
-$(OBJS_SRV): | submake-errcodes
-
-.PHONY: submake-errcodes
-
-submake-errcodes:
-       $(MAKE) -C ../backend submake-errcodes
-
 # Dependency is to ensure that path changes propagate
 
 path.o: path.c pg_config_paths.h
index a9b8377acfd026d569ea43d0e085ce0dc0ae2260..19d60a506e11db6de298c0b734ec5e77c0ce89a1 100644 (file)
@@ -20,6 +20,4 @@ SUBDIRS = \
                  test_shm_mq \
                  worker_spi
 
-all: submake-generated-headers
-
 $(recurse)
index deef08dfc1204c780f94ff49988d0733a24d7e9f..7ba4e9c5abb8596cbf4b0e11745aa7e7d660d8d4 100644 (file)
@@ -65,8 +65,6 @@ include $(top_srcdir)/src/Makefile.shlib
 
 all: all-lib
 
-$(OBJS): | submake-generated-headers
-
 # Test input and expected files.  These are created by pg_regress itself, so we
 # don't have a rule to create them.  We do need rules to clean them however.
 input_files = $(patsubst $(srcdir)/input/%.source,sql/%.sql, $(wildcard $(srcdir)/input/*.source))
@@ -107,7 +105,7 @@ $(top_builddir)/contrib/spi/refint$(DLSUFFIX): | submake-contrib-spi ;
 
 $(top_builddir)/contrib/spi/autoinc$(DLSUFFIX): | submake-contrib-spi ;
 
-submake-contrib-spi: | submake-libpgport submake-generated-headers
+submake-contrib-spi: | submake-libpgport
        $(MAKE) -C $(top_builddir)/contrib/spi
 
 .PHONY: submake-contrib-spi