diff --git a/src/Makefile.shlib b/src/Makefile.shlib index 31a35a08533..c3f5d0f0a3b 100644 --- a/src/Makefile.shlib +++ b/src/Makefile.shlib @@ -342,13 +342,9 @@ else # PORTNAME == aix # AIX case -# There is no correct way to write a rule that generates two files. -# Rules with two targets don't have that meaning, they are merely -# shorthand for two otherwise separate rules. To be safe for parallel -# make, we must chain the dependencies like this. The semicolon is -# important, otherwise make will choose some built-in rule. - -$(stlib): $(shlib) ; +# See notes in src/backend/parser/Makefile about the following two rules +$(stlib): $(shlib) + touch $@ $(shlib): $(OBJS) | $(SHLIB_PREREQS) rm -f $(stlib) @@ -379,13 +375,9 @@ else # Win32 case -# There is no correct way to write a rule that generates two files. -# Rules with two targets don't have that meaning, they are merely -# shorthand for two otherwise separate rules. To be safe for parallel -# make, we must chain the dependencies like this. The semicolon is -# important, otherwise make will choose some built-in rule. - -$(stlib): $(shlib) ; +# See notes in src/backend/parser/Makefile about the following two rules +$(stlib): $(shlib) + touch $@ # XXX A backend that loads a module linked with libgcc_s_dw2-1.dll will exit # uncleanly, hence -static-libgcc. (Last verified with MinGW-w64 compilers diff --git a/src/backend/Makefile b/src/backend/Makefile index e9c076d9760..1d7a541026c 100644 --- a/src/backend/Makefile +++ b/src/backend/Makefile @@ -65,13 +65,10 @@ ifeq ($(PORTNAME), cygwin) postgres: $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) $(LDFLAGS_EX) $(export_dynamic) -Wl,--stack,$(WIN32_STACK_RLIMIT) -Wl,--export-all-symbols -Wl,--out-implib=libpostgres.a $(call expand_subsys,$^) $(LIBS) -o $@ -# There is no correct way to write a rule that generates two files. -# Rules with two targets don't have that meaning, they are merely -# shorthand for two otherwise separate rules. To be safe for parallel -# make, we must chain the dependencies like this. The semicolon is -# important, otherwise make will choose some built-in rule. - -libpostgres.a: postgres ; +# libpostgres.a is actually built in the preceding rule, but we need this to +# ensure it's newer than postgres; see notes in src/backend/parser/Makefile +libpostgres.a: postgres + touch $@ endif # cygwin @@ -81,7 +78,10 @@ LIBS += -lsecur32 postgres: $(OBJS) $(WIN32RES) $(CC) $(CFLAGS) $(LDFLAGS) $(LDFLAGS_EX) -Wl,--stack=$(WIN32_STACK_RLIMIT) -Wl,--export-all-symbols -Wl,--out-implib=libpostgres.a $(call expand_subsys,$(OBJS)) $(WIN32RES) $(LIBS) -o $@$(X) -libpostgres.a: postgres ; +# libpostgres.a is actually built in the preceding rule, but we need this to +# ensure it's newer than postgres; see notes in src/backend/parser/Makefile +libpostgres.a: postgres + touch $@ endif # win32 @@ -131,6 +131,12 @@ postgres.o: $(OBJS) # The following targets are specified in make commands that appear in # the make files in our subdirectories. Note that it's important we # match the dependencies shown in the subdirectory makefiles! +# Also, in cases where a subdirectory makefile generates two files in +# what's really one step, such as bison producing both gram.h and gram.c, +# we must request making the one that is shown as the secondary (dependent) +# output, else the timestamp on it might be wrong. By project convention, +# the .h file is the dependent one for bison output, so we need only request +# that; but in other cases, request both for safety. parser/gram.h: parser/gram.y $(MAKE) -C parser gram.h diff --git a/src/backend/catalog/Makefile b/src/backend/catalog/Makefile index a974bd52607..fb1528f26cc 100644 --- a/src/backend/catalog/Makefile +++ b/src/backend/catalog/Makefile @@ -21,7 +21,7 @@ BKIFILES = postgres.bki postgres.description postgres.shdescription include $(top_srcdir)/src/backend/common.mk -all: $(BKIFILES) schemapg.h +all: $(BKIFILES) schemapg.h postgres.description postgres.shdescription # Note: there are some undocumented dependencies on the ordering in which # the catalog header files are assembled into postgres.bki. In particular, @@ -50,12 +50,15 @@ catalogdir = $(top_srcdir)/src/backend/catalog # locations of headers that genbki.pl needs to read pg_includes = -I$(top_srcdir)/src/include/catalog -I$(top_builddir)/src/include/catalog -# see explanation in ../parser/Makefile -postgres.description: postgres.bki ; +# see notes in src/backend/parser/Makefile about multiple output files +postgres.description: postgres.bki + touch $@ -postgres.shdescription: postgres.bki ; +postgres.shdescription: postgres.bki + touch $@ -schemapg.h: postgres.bki ; +schemapg.h: postgres.bki + touch $@ # Technically, this should depend on Makefile.global, but then # postgres.bki would need to be rebuilt after every configure run, diff --git a/src/backend/parser/Makefile b/src/backend/parser/Makefile index 9cc8946fa1b..b06d39cc84f 100644 --- a/src/backend/parser/Makefile +++ b/src/backend/parser/Makefile @@ -28,12 +28,17 @@ endif # There is no correct way to write a rule that generates two files. # Rules with two targets don't have that meaning, they are merely -# shorthand for two otherwise separate rules. To be safe for parallel -# make, we must chain the dependencies like this. The semicolon is -# important, otherwise make will choose the built-in rule for -# gram.y=>gram.c. +# shorthand for two otherwise separate rules. If we have an action +# that in fact generates two or more files, we must choose one of them +# as primary and show it as the action's output, then make all of the +# other output files dependent on the primary, like this. Furthermore, +# the "touch" action is essential, because it ensures that gram.h is +# marked as newer than (or at least no older than) gram.c. Without that, +# make is likely to try to rebuild gram.h in subsequent runs, which causes +# failures in VPATH builds from tarballs. -gram.h: gram.c ; +gram.h: gram.c + touch $@ gram.c: BISONFLAGS += -d gram.c: BISON_CHECK_CMD = $(PERL) $(srcdir)/check_keywords.pl $< $(top_srcdir)/src/include/parser/kwlist.h diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile index 83745337180..7540f10541f 100644 --- a/src/backend/utils/Makefile +++ b/src/backend/utils/Makefile @@ -20,8 +20,9 @@ all: errcodes.h fmgroids.h probes.h $(SUBDIRS:%=%-recursive): fmgroids.h -# see explanation in ../parser/Makefile -fmgroids.h: fmgrtab.c ; +# see notes in src/backend/parser/Makefile +fmgroids.h: fmgrtab.c + touch $@ fmgrtab.c: Gen_fmgrtab.pl $(catalogdir)/Catalog.pm $(top_srcdir)/src/include/catalog/pg_proc.h $(PERL) -I $(catalogdir) $< $(top_srcdir)/src/include/catalog/pg_proc.h diff --git a/src/bin/psql/Makefile b/src/bin/psql/Makefile index 3a42cae091e..0fb1880870c 100644 --- a/src/bin/psql/Makefile +++ b/src/bin/psql/Makefile @@ -40,7 +40,10 @@ dumputils.c keywords.c: % : $(top_srcdir)/src/bin/pg_dump/% kwlookup.c: % : $(top_srcdir)/src/backend/parser/% rm -f $@ && $(LN_S) $< . -sql_help.c: sql_help.h ; +# See notes in src/backend/parser/Makefile about the following two rules +sql_help.c: sql_help.h + touch $@ + sql_help.h: create_help.pl $(wildcard $(REFDOCDIR)/*.sgml) $(PERL) $< $(REFDOCDIR) $* @@ -50,7 +53,7 @@ mainloop.o: psqlscan.c psqlscan.c: FLEXFLAGS = -Cfe -p -p psqlscan.c: FLEX_NO_BACKUP=yes -distprep: sql_help.h psqlscan.c +distprep: sql_help.h sql_help.c psqlscan.c install: all installdirs $(INSTALL_PROGRAM) psql$(X) '$(DESTDIR)$(bindir)/psql$(X)' diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile index 3ca957a0ef6..ca1f419f986 100644 --- a/src/interfaces/ecpg/preproc/Makefile +++ b/src/interfaces/ecpg/preproc/Makefile @@ -44,7 +44,10 @@ ecpg: $(OBJS) | submake-libpgport ../ecpglib/typename.o: ../ecpglib/typename.c $(MAKE) -C $(dir $@) $(notdir $@) -preproc.h: preproc.c ; +# See notes in src/backend/parser/Makefile about the following two rules +preproc.h: preproc.c + touch $@ + preproc.c: BISONFLAGS += -d preproc.y: ../../../backend/parser/gram.y parse.pl ecpg.addons ecpg.header ecpg.tokens ecpg.trailer ecpg.type diff --git a/src/pl/plpgsql/src/Makefile b/src/pl/plpgsql/src/Makefile index 852b0c7ae49..97e80577422 100644 --- a/src/pl/plpgsql/src/Makefile +++ b/src/pl/plpgsql/src/Makefile @@ -55,7 +55,9 @@ uninstall-headers: pl_gram.o pl_handler.o pl_comp.o pl_exec.o pl_funcs.o pl_scanner.o: plpgsql.h pl_gram.h plerrcodes.h # See notes in src/backend/parser/Makefile about the following two rules -pl_gram.h: pl_gram.c ; +pl_gram.h: pl_gram.c + touch $@ + pl_gram.c: BISONFLAGS += -d # generate plerrcodes.h from src/backend/utils/errcodes.txt diff --git a/src/test/isolation/Makefile b/src/test/isolation/Makefile index 26bcf22392a..50369065e31 100644 --- a/src/test/isolation/Makefile +++ b/src/test/isolation/Makefile @@ -29,15 +29,6 @@ isolationtester$(X): $(OBJS) | submake-libpq submake-libpgport distprep: specparse.c specscanner.c -# There is no correct way to write a rule that generates two files. -# Rules with two targets don't have that meaning, they are merely -# shorthand for two otherwise separate rules. To be safe for parallel -# make, we must chain the dependencies like this. The semicolon is -# important, otherwise make will choose the built-in rule for -# gram.y=>gram.c. - -specparse.h: specparse.c ; - # specscanner is compiled as part of specparse specparse.o: specscanner.c