mirror of
https://github.com/postgres/postgres.git
synced 2026-10-23 13:29:09 +03:00
Fix incorrect parallel build of jsonapi.o with Makefiles.
Commit0785d1b8bwrote jsonapi_shlib.o: override CPPFLAGS += -DJSONAPI_USE_PQEXPBUFFER forgetting that GNU make treats this change to CPPFLAGS as affecting not only jsonapi_shlib.o, but anything that gets built in pursuit of building jsonapi_shlib.o. Because of an even more ancient hack (cf7143b3e82), that will include jsonapi.o if it's not been built already. If we do apply this -D switch to jsonapi.o, it gets built with the wrong expansible-string infrastructure, which manifests immediately as a link failure in pg_combinebackup and would misbehave at runtime even if the build somehow completed. Perhaps remarkably, we'd not seen field reports of build failures till now, but it's pretty easy to reproduce a mis-build by trying to build src/common/ with --shuffle and a high -j factor. To fix, don't modify CPPFLAGS this way; instead make a dedicated build rule for jsonapi_shlib.o that injects the additional switches. There might be other places with similar problems, but some desultory attempts with -j32 --shuffle on a 32-thread CPU didn't find any more build failures. Also, it looks like the meson build infrastructure lacks this problem (but I'm no meson expert). Bug: #19727 Reported-by: Ross Burton <ross@burtonini.com> Author: Tom Lane <tgl@sss.pgh.pa.us> Reviewed-by: Ross Burton <ross@burtonini.com> Discussion: https://postgr.es/m/19727-32d67d9dea410f38@postgresql.org Backpatch-through: 18
This commit is contained in:
@@ -161,11 +161,6 @@ libpgcommon_shlib.a: $(OBJS_SHLIB)
|
||||
rm -f $@
|
||||
$(AR) $(AROPT) $@ $^
|
||||
|
||||
# The JSON API normally exits on out-of-memory; disable that behavior for shared
|
||||
# library builds. This requires libpq's pqexpbuffer.h.
|
||||
jsonapi_shlib.o: override CPPFLAGS += -DJSONAPI_USE_PQEXPBUFFER
|
||||
jsonapi_shlib.o: override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
|
||||
|
||||
# Because this uses its own compilation rule, it doesn't use the
|
||||
# dependency tracking logic from Makefile.global. To make sure that
|
||||
# dependency tracking works anyway for the *_shlib.o files, depend on
|
||||
@@ -175,6 +170,12 @@ jsonapi_shlib.o: override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
|
||||
%_shlib.o: %.c %.o
|
||||
$(CC) $(CFLAGS) $(CFLAGS_SL) $(CPPFLAGS) -c $< -o $@
|
||||
|
||||
# The JSON API normally exits on out-of-memory; disable that behavior for shared
|
||||
# library builds. This requires libpq's pqexpbuffer.h.
|
||||
# This rule overrides the previous one, so must duplicate all its effects.
|
||||
jsonapi_shlib.o: jsonapi.c jsonapi.o
|
||||
$(CC) $(CFLAGS) $(CFLAGS_SL) -DJSONAPI_USE_PQEXPBUFFER -I$(libpq_srcdir) $(CPPFLAGS) -c $< -o $@
|
||||
|
||||
libpgcommon_excluded_shlib.a: $(OBJS_EXCLUDED_SHLIB)
|
||||
rm -f $@
|
||||
$(AR) $(AROPT) $@ $^
|
||||
|
||||
Reference in New Issue
Block a user