Ross Burton <ross@burtonini.com> writes:
> I now have a build tree that works and a build tree that breaks, from
> the same machine and environment, simply by re-running the build with
> make --shuffle.
> The working jsonapi.o has functions like appendStringInfoChar,
> resetStringInfo, etc. The one that fails to link has
> appendPQExpBufferChar, resetPQExpBuffer, etc.
> This is a makefile dependency bug exposed in parallel builds, and can
> be reproduced on demand with a minimal reproducer. From a clean but
> configured tree, in src/common:
> $ make jsonapi.o
> $ readelf -sW jsonapi.o | grep reset
> 64: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND resetStringInfo
> This builds a jsonapi.o using the direct target, and
> JSONAPI_USE_PQEXPBUFFER is not defined.
> $ make clean
> $ make jsonapi_shlib.o
> $ readelf -sW jsonapi.o | grep reset
> 65: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND resetPQExpBuffer
> This builds jsonapi_shlib.o, which adds JSONAPI_USE_PQEXPBUFFER to
> CPPFLAGS. However jsonapi.o hasn't been built yet so that is also
> built, but with the PQEXPBUFFER define set this time.
Very interesting! So the problem is that the scope of the effects of
this:
jsonapi_shlib.o: override CPPFLAGS += -DJSONAPI_USE_PQEXPBUFFER
isn't terribly well-defined. Looking at the rest of that Makefile,
I'm also suspicious about
$(OBJS_FRONTEND): CPPFLAGS += -DUSE_PRIVATE_ENCODING_FUNCS
Can you break that part? If not, maybe the problem is the
gratuitous-looking "override"?
regards, tom lane