diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/Makefile | 22 | ||||
-rw-r--r-- | src/backend/catalog/Makefile | 13 | ||||
-rw-r--r-- | src/backend/parser/Makefile | 17 | ||||
-rw-r--r-- | src/backend/utils/Makefile | 5 |
4 files changed, 36 insertions, 21 deletions
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. - -gram.h: 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 + 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 |