Hi,

On 2026-03-27 14:31:52 +0300, Maksim.Melnikov wrote:
> I've found build error in configuration --with-llvm
> 
> CPPFLAGS="-O2" ./configure --enable-debug --enable-cassert
> --enable-tap-tests --with-openssl --with-icu  --with-llvm
> 
> ....
> 
> make world-bin -j3
> 
> ....
> 
> cubescan.c:9:10: fatal error: 'cubeparse.h' file not found
>     9 | #include "cubeparse.h"  /* must be after cubedata.h for YYSTYPE and
> NDBOX */
> 
> ....
> segscan.c:9:10: fatal error: 'segparse.h' file not found
>     9 | #include "segparse.h"   /* must be after segdata.h for SEG */
> 
> 
> The reason is race, that exist between LLVM compilation and bison source
> code generation and compilation can occur first.
> 
> Ideally LLVM compilation target should depend on header files targets.
> 
> The error is difficult to reproduce and I've done simple patch to have
> stable reproducing. Fix patch is also attached.

You don't need a sleep to show there's a problem, you can just do
   make -C contrib/cube cubescan.bc

We don't have the same issue in the backend, as for backend code each .bc file
depends on the .o file:

src/backend/common.mk:

ifeq ($(with_llvm), yes)
objfiles.txt: $(patsubst %.o,%.bc, $(OBJS))
$(patsubst %.o,%.bc, $(OBJS)): $(OBJS)
endif

But for some reason I didn't add the same logic to pgxs.mk.

I think we need something like the attached to make the dependencies work.


I'm a bit worried about breaking some extensions if were to backpatch this. So
I'm somewhat inclined to just fix this in master.

Greetings,

Andres Freund
diff --git i/src/makefiles/pgxs.mk w/src/makefiles/pgxs.mk
index 039cee3dfe5..d7732024b15 100644
--- i/src/makefiles/pgxs.mk
+++ w/src/makefiles/pgxs.mk
@@ -219,7 +219,12 @@ endef
 all: $(PROGRAM) $(DATA_built) $(HEADER_allbuilt) $(SCRIPTS_built) $(addsuffix $(DLSUFFIX), $(MODULES)) $(addsuffix .control, $(EXTENSION))
 
 ifeq ($(with_llvm), yes)
+# Ensure that .bc files for MODULES and OBJS get built with all
 all: $(addsuffix .bc, $(MODULES)) $(patsubst %.o,%.bc, $(OBJS))
+# Ensure that each .bc file depends on the corresponding .o file, to ensure
+# the dependencies required for it to be built are present.
+$(patsubst %.o,%.bc, $(OBJS)): $(OBJS)
+$(addsuffix .bc, $(MODULES)): $(addsuffix .o, $(MODULES))
 endif
 
 ifdef MODULE_big
diff --git i/src/backend/common.mk w/src/backend/common.mk
index 61861f5c7eb..85bb4ee2527 100644
--- i/src/backend/common.mk
+++ w/src/backend/common.mk
@@ -22,7 +22,10 @@ objfiles.txt: Makefile $(SUBDIROBJS) $(OBJS)
 	$(if $(filter-out $(OBJS),$?),( $(if $(SUBDIROBJS),cat $(SUBDIROBJS); )echo $(addprefix $(subdir)/,$(OBJS)) ) >$@,touch $@)
 
 ifeq ($(with_llvm), yes)
+# Ensure that .bc files get built when building .o files
 objfiles.txt: $(patsubst %.o,%.bc, $(OBJS))
+# Ensure that each .bc file depends on the corresponding .o file, to ensure
+# the dependencies required for it to be built are present.
 $(patsubst %.o,%.bc, $(OBJS)): $(OBJS)
 endif
 

Reply via email to