7878 override PIC: =
7979endif
8080
81+ # default to compiling the C parts (zlib) with DMD via importC; override with USE_IMPORTC=1/0
82+ USE_IMPORTC: =1
83+
84+ # FreeBSD 14 can't use importC for zlib thanks to asm in stdlib.h, which dmd can't handle.
85+ # https://issues.dlang.org/show_bug.cgi?id=24389
86+ ifeq (freebsd,$(OS ) )
87+ USE_IMPORTC=0
88+ endif
89+
8190# Configurable stuff that's rarely edited
8291INSTALL_DIR = ../install
8392DRUNTIME_PATH = $(DMD_DIR ) /druntime
@@ -101,58 +110,50 @@ else
101110 DRUNTIME = $(DRUNTIME_PATH)/../generated/$(OS)/$(BUILD)/$(MODEL)/druntime.lib
102111endif
103112
104- # Set CC and DMD
113+ # Set DMD
105114ifeq ($(OS ) ,win32wine)
106- CC = wine dmc.exe
107115 DMD = wine dmd.exe
108116 RUN = wine
109117else
110118 DMD = $(DMD_DIR)/generated/$(OS)/$(BUILD)/$(MODEL)/dmd$(DOTEXE)
111- ifeq ($(MODEL),32omf)
112- CC = dmc
113- else ifeq ($(OS),windows)
114- CC = cl.exe
115- else
116- CC = cc
117- endif
118119 RUN =
119120endif
120121
121- # Set CFLAGS
122- OUTFILEFLAG = -o
123- NODEFAULTLIB=-defaultlib = -debuglib =
122+ # Set NODEFAULTLIB and CPPFLAGS (for the C preprocessor)
123+ NODEFAULTLIB:=-defaultlib = -debuglib=
124+ CPPFLAGS: =
124125ifeq (,$(findstring win,$(OS ) ) )
125- CFLAGS=$(MODEL_FLAG) -fPIC -std=c11 -DHAVE_UNISTD_H
126+ CPPFLAGS := -DHAVE_UNISTD_H
126127# Bundled with the system library on OSX, and doesn't work with >= MacOS 11
127128 ifneq (osx,$(OS))
128129 NODEFAULTLIB += -L-lpthread -L-lm
129130 endif
130- ifeq ($(BUILD),debug)
131- CFLAGS += -g
132- else
133- CFLAGS += -O3
134- endif
135131else
136132 ifeq ($(MODEL),32omf)
137- CFLAGS=-DNO_snprintf
138- ifeq ($(BUILD),debug)
139- CFLAGS += -g
140- else
141- CFLAGS += -O
142- endif
143- else # win64/win32coff
144- OUTFILEFLAG = /Fo
145- CFLAGS += /nologo /Zl /GS-
146- ifeq ($(BUILD),debug)
147- CFLAGS += /Z7
148- else
149- CFLAGS += /O2
150- endif
133+ CPPFLAGS := -DNO_snprintf
151134 endif
152135endif
153- ifeq (osx,$(OS ) )
154- ifeq (64,$(MODEL))
155- CFLAGS+=--target=x86_64-darwin-apple # ARM cpu is not supported by dmd
136+
137+ # Set CC, CC_OUTFILEFLAG and CFLAGS unless using importC
138+ ifneq ($(USE_IMPORTC ) ,1)
139+ CC := cc
140+ CC_OUTFILEFLAG := -o
141+
142+ ifeq ($(OS),win32wine)
143+ CC := wine dmc.exe
144+ CFLAGS := $(if $(findstring $(BUILD),debug),-g,-O)
145+ else ifeq ($(MODEL),32omf)
146+ CC := dmc
147+ CFLAGS := $(if $(findstring $(BUILD),debug),-g,-O)
148+ else ifeq ($(OS),windows)
149+ CC := cl
150+ CC_OUTFILEFLAG := /Fo
151+ CFLAGS := /nologo /Zl /GS- $(if $(findstring $(BUILD),debug),/Z7,/O2)
152+ else # Posix
153+ CFLAGS := $(MODEL_FLAG) -fPIC -std=c11 $(if $(findstring $(BUILD),debug),-g,-O3)
154+ ifeq (osx64,$(OS)$(MODEL))
155+ CFLAGS += --target=x86_64-darwin-apple # ARM cpu is not supported by dmd
156+ endif
156157 endif
157158endif
158159
@@ -299,10 +300,15 @@ ALL_D_FILES = $(addsuffix .d, $(STD_MODULES) $(EXTRA_MODULES_COMMON) \
299300 $(EXTRA_MODULES_WIN32 ) $(EXTRA_MODULES_INTERNAL ) )
300301
301302# C files to be part of the build
302- C_MODULES = $(addprefix etc/c/zlib/, adler32 compress crc32 deflate \
303+ C_MODULES : = $(addprefix etc/c/zlib/, adler32 compress crc32 deflate \
303304 gzclose gzlib gzread gzwrite infback inffast inflate inftrees trees uncompr zutil)
305+ C_FILES := $(addsuffix .c, $(C_MODULES ) )
304306
305- OBJS = $(addsuffix $(DOTOBJ ) ,$(addprefix $(ROOT ) /,$(C_MODULES ) ) )
307+ ifeq ($(USE_IMPORTC ) ,1)
308+ C_OBJS := $(ROOT ) /zlib$(DOTOBJ )
309+ else
310+ C_OBJS := $(addprefix $(ROOT ) /, $(addsuffix $(DOTOBJ ) , $(C_MODULES ) ) )
311+ endif
306312
307313# build with shared library support (defaults to true on supported platforms)
308314SHARED =$(if $(findstring $(OS ) ,linux freebsd) ,1,)
@@ -348,12 +354,18 @@ endif
348354lib : $(LIB )
349355dll : $(ROOT ) /libphobos2.so
350356
357+ ifeq ($(USE_IMPORTC ) ,1)
358+ # the druntime dependency makes sure DMD has been built
359+ $(ROOT ) /zlib$(DOTOBJ ) : $(C_FILES ) $(DRUNTIME )
360+ $(DMD ) -c $(DFLAGS ) $(addprefix -P=,$(CPPFLAGS ) -Ietc/c/zlib) -of$@ $(C_FILES )
361+ else
351362$(ROOT ) /% $(DOTOBJ ) : % .c
352363 @[ -d $( dir $@ ) ] || mkdir -p $(dir $@ ) || [ -d $( dir $@ ) ]
353- $(CC ) -c $(CFLAGS ) $< $(OUTFILEFLAG ) $@
364+ $(CC ) -c $(CFLAGS ) $(CPPFLAGS ) $< $(CC_OUTFILEFLAG ) $@
365+ endif
354366
355- $(LIB ) : $(OBJS ) $(ALL_D_FILES ) $(DRUNTIME )
356- $(DMD ) $(DFLAGS ) -lib -of$@ $(DRUNTIME ) $(D_FILES ) $(OBJS )
367+ $(LIB ) : $(C_OBJS ) $(ALL_D_FILES ) $(DRUNTIME )
368+ $(DMD ) $(DFLAGS ) -lib -of$@ $(DRUNTIME ) $(D_FILES ) $(C_OBJS )
357369
358370$(ROOT ) /libphobos2.so : $(ROOT ) /$(SONAME )
359371 ln -sf $(notdir $(LIBSO ) ) $@
@@ -362,8 +374,8 @@ $(ROOT)/$(SONAME): $(LIBSO)
362374 ln -sf $(notdir $(LIBSO ) ) $@
363375
364376$(LIBSO ) : override PIC:=-fPIC
365- $(LIBSO ) : $(OBJS ) $(ALL_D_FILES ) $(DRUNTIMESO )
366- $(DMD ) $(DFLAGS ) -shared $(NODEFAULTLIB ) -of$@ -L-soname=$(SONAME ) $(DRUNTIMESO ) $(LINKDL ) $(D_FILES ) $(OBJS )
377+ $(LIBSO ) : $(C_OBJS ) $(ALL_D_FILES ) $(DRUNTIMESO )
378+ $(DMD ) $(DFLAGS ) -shared $(NODEFAULTLIB ) -of$@ -L-soname=$(SONAME ) $(DRUNTIMESO ) $(LINKDL ) $(D_FILES ) $(C_OBJS )
367379
368380ifeq (osx,$(OS ) )
369381# Build fat library that combines the 32 bit and the 64 bit libraries
@@ -404,8 +416,8 @@ ifneq (1,$(SHARED))
404416
405417$(UT_D_OBJS ) : $(DRUNTIME )
406418
407- $(ROOT ) /unittest/test_runner$(DOTEXE ) : $(DRUNTIME_PATH ) /src/test_runner.d $(UT_D_OBJS ) $(OBJS ) $(DRUNTIME )
408- $(DMD ) $(DFLAGS ) $(UDFLAGS ) -of$@ $(DRUNTIME_PATH ) /src/test_runner.d $(UT_D_OBJS ) $(OBJS ) $(DRUNTIME ) $(LINKDL ) $(NODEFAULTLIB )
419+ $(ROOT ) /unittest/test_runner$(DOTEXE ) : $(DRUNTIME_PATH ) /src/test_runner.d $(UT_D_OBJS ) $(C_OBJS ) $(DRUNTIME )
420+ $(DMD ) $(DFLAGS ) $(UDFLAGS ) -of$@ $(DRUNTIME_PATH ) /src/test_runner.d $(UT_D_OBJS ) $(C_OBJS ) $(DRUNTIME ) $(LINKDL ) $(NODEFAULTLIB )
409421
410422else
411423
@@ -414,8 +426,8 @@ UT_LIBSO:=$(ROOT)/unittest/libphobos2-ut.so
414426$(UT_D_OBJS ) : $(DRUNTIMESO )
415427
416428$(UT_LIBSO ) : override PIC:=-fPIC
417- $(UT_LIBSO ) : $(UT_D_OBJS ) $(OBJS ) $(DRUNTIMESO )
418- $(DMD ) $(DFLAGS ) -shared $(UDFLAGS ) -of$@ $(UT_D_OBJS ) $(OBJS ) $(DRUNTIMESO ) $(LINKDL ) $(NODEFAULTLIB )
429+ $(UT_LIBSO ) : $(UT_D_OBJS ) $(C_OBJS ) $(DRUNTIMESO )
430+ $(DMD ) $(DFLAGS ) -shared $(UDFLAGS ) -of$@ $(UT_D_OBJS ) $(C_OBJS ) $(DRUNTIMESO ) $(LINKDL ) $(NODEFAULTLIB )
419431
420432$(ROOT ) /unittest/test_runner$(DOTEXE ) : $(DRUNTIME_PATH ) /src/test_runner.d $(UT_LIBSO )
421433 $(DMD ) $(DFLAGS ) -of$@ $< -L$(UT_LIBSO ) $(NODEFAULTLIB )
0 commit comments