Scan dynamic libraries for GC roots
[delight/core.git] / phobos2 / linux.mak
blobce8cde9fd032beabec882b206ecae0f07e441895
1 # Makefile to build linux D runtime library libphobos2.a and its unit test
2 # Targets:
3 # all
4 # Generate each build targets below except clean
6 # release (default target)
7 # -O -release
8 # Symlink libphobos2.a in the top level directory
10 # unittest/release
11 # -O -release -unittest
13 # debug
14 # -g
16 # headers
17 # -O -release
19 # unittest/debug
20 # -g -unittest
22 # html
23 # Generate the ddocs for phobos
25 # clean
26 # Delete all files created by build process
28 CFLAGS=-m32
29 DFLAGS=
31 ifeq (,$(MAKECMDGOALS))
32 MAKECMDGOALS := release
33 endif
34 ifeq (unittest/release,$(MAKECMDGOALS))
35 CFLAGS:=$(CFLAGS) -O
36 DFLAGS:=$(DFLAGS) -O -release -unittest
37 OBJDIR=obj/unittest/release
38 endif
39 ifeq (unittest/debug,$(MAKECMDGOALS))
40 CFLAGS:=$(CFLAGS) -g
41 DFLAGS:=$(DFLAGS) -g -unittest
42 OBJDIR=obj/unittest/debug
43 endif
44 ifeq (debug,$(MAKECMDGOALS))
45 CFLAGS:=$(CFLAGS) -g
46 DFLAGS:=$(DFLAGS) -g
47 OBJDIR=obj/debug
48 endif
49 ifeq (release,$(MAKECMDGOALS))
50 CFLAGS:=$(CFLAGS) -O
51 DFLAGS:=$(DFLAGS) -O -release
52 OBJDIR=obj/release
53 endif
54 ifeq (clean,$(MAKECMDGOALS))
55 OBJDIR=none
56 endif
57 ifeq (html,$(MAKECMDGOALS))
58 OBJDIR=none
59 endif
60 ifeq (all,$(MAKECMDGOALS))
61 OBJDIR=none
62 endif
63 ifeq (headers,$(MAKECMDGOALS))
64 DFLAGS:=$(DFLAGS) -O -release
65 OBJDIR=none
66 endif
68 ifndef OBJDIR
69 $(error Cannot make $(MAKECMDGOALS). Please make either \
70 all, debug, release, unittest/debug, unittest/release, clean, or html)
71 endif
73 ifneq (none,$(OBJDIR))
74 DUMMY := $(shell mkdir --parents $(OBJDIR) $(OBJDIR)/etc/c/zlib $(OBJDIR)/internal)
75 endif
77 LIB=$(OBJDIR)/libphobos2.a
78 DOC_OUTPUT_DIR=../web/phobos
79 CC=gcc
80 #DMD=/dmd/bin/dmd
81 DMD=dmd
83 .SUFFIXES: .d
84 $(OBJDIR)/%.o : %.c
85 $(CC) -c $(CFLAGS) -o $@ $<
87 $(OBJDIR)/%.o : %.cpp
88 g++ -c $(CFLAGS) -o $@ $<
90 $(OBJDIR)/%.o : %.d
91 $(DMD) -I$(dir $<) -c $(DFLAGS) -of$@ $<
93 $(OBJDIR)/%.o : %.asm
94 $(CC) -c -o $@ $<
96 debug release unittest/debug unittest/release : $(OBJDIR)/unittest
98 all :
99 $(MAKE) -f linux.mak release
100 $(MAKE) -f linux.mak unittest/release
101 $(MAKE) -f linux.mak debug
102 $(MAKE) -f linux.mak unittest/debug
103 $(MAKE) -f linux.mak html
105 $(OBJDIR)/unittest : $(OBJDIR)/unittest.o \
106 $(OBJDIR)/all_std_modules_generated.o $(LIB)
107 $(CC) -o $@ $^ -lpthread -lm -g -ldl
108 ifeq (release,$(MAKECMDGOALS))
109 ln -sf `pwd`/$(OBJDIR)/libphobos2.a ../../lib
110 endif
112 $(OBJDIR)/unittest.o : unittest.d all_std_modules_generated.d
114 all_std_modules_generated.d : $(MAKEFILE_LIST)
115 for m in $(STD_MODULES); do echo public import std.$$m\;; done > $@
117 INTERNAL_MODULES = aApply aApplyR aaA adi alloca arraycast arraycat \
118 cast cmath2 deh2 dmain2 invariant llmath memset obj object \
119 qsort switch trace arrayassign
120 INTERNAL_CMODULES = complex critical monitor
121 INTERNAL_CMODULES_NOTBUILT = deh
122 INTERNAL_EXTRAFILES = internal/mars.h internal/minit.asm
124 INTERNAL_GC_MODULES = gc gcold gcx gcbits gclinux
125 INTERNAL_GC_EXTRAFILES = \
126 internal/gc/gcstub.d \
127 internal/gc/win32.d \
128 internal/gc/testgc.d \
129 internal/gc/win32.mak \
130 internal/gc/linux.mak
132 STD_MODULES = algorithm array asserterror base64 bigint bind bitarray \
133 bitmanip boxer compiler complex contracts conv cover cpuid \
134 cstream ctype date dateparse demangle encoding file format \
135 functional gc getopt hiddenfunc intrinsic iterator loader math \
136 md5 metastrings mmfile moduleinit numeric openrj outbuffer \
137 outofmemory path perf process random regexp signals socket \
138 socketstream stdint stdio stream string switcherr syserror \
139 system thread traits typecons typetuple uni uri utf variant \
140 xml zip zlib
141 STD_MODULES_NOTBUILT = stdarg
143 STD_C_MODULES = stdarg stdio
144 STD_C_MODULES_NOTBUILT = fenv math process stddef stdlib string time locale
146 STD_C_LINUX_MODULES = linux socket
147 STD_C_LINUX_MODULES_NOTBUILT = linuxextern pthread termios
149 STD_C_WINDOWS_MODULES_NOTBUILT = windows com winsock stat
151 STD_WINDOWS_MODULES_NOTBUILT = registry iunknown charset
153 ZLIB_CMODULES = adler32 compress crc32 gzio uncompr deflate trees \
154 zutil inflate infback inftrees inffast
156 TYPEINFO_MODULES = ti_wchar ti_uint ti_short ti_ushort ti_byte \
157 ti_ubyte ti_long ti_ulong ti_ptr ti_float ti_double ti_real \
158 ti_delegate ti_creal ti_ireal ti_cfloat ti_ifloat ti_cdouble \
159 ti_idouble ti_dchar ti_Ashort ti_Ag ti_AC ti_C ti_int ti_char \
160 ti_Aint ti_Along ti_Afloat ti_Adouble ti_Areal ti_Acfloat \
161 ti_Acdouble ti_Acreal ti_void
163 ETC_MODULES_NOTBUILT = gamma
165 ETC_C_MODULES = zlib
167 SRC = errno.c object.d unittest.d crc32.d
169 SRC_ZLIB = ChangeLog README adler32.c algorithm.txt compress.c crc32.c \
170 crc32.h deflate.c deflate.h example.c gzio.c infback.c \
171 inffast.c inffast.h inffixed.h inflate.c inflate.h inftrees.c \
172 inftrees.h linux.mak minigzip.c trees.c trees.h uncompr.c \
173 win32.mak zconf.h zconf.in.h zlib.3 zlib.h zutil.c zutil.h
174 SRC_ZLIB := $(addprefix etc/c/zlib/,$(SRC_ZLIB))
176 SRC_DOCUMENTABLES = phobos.d $(addprefix std/, $(addsuffix .d, \
177 $(STD_MODULES) $(STD_MODULES_NOTBUILT))) $(addprefix std/c/, \
178 $(addsuffix .d, $(STD_C_MODULES) $(STD_C_MODULES_NOTBUILT))) \
179 $(addprefix std/c/linux/,$(addsuffix .d, \
180 $(STD_C_LINUX_MODULES) $(STD_C_LINUX_MODULES_NOTBUILT)))
182 SRC_RELEASEZIP = linux.mak win32.mak phoboslicense.txt $(SRC) \
183 $(SRC_ZLIB) $(INTERNAL_EXTRAFILES) $(INTERNAL_GC_EXTRAFILES) \
184 $(addprefix internal/,$(addsuffix .c, \
185 $(INTERNAL_CMODULES_NOTBUILT))) $(addprefix internal/, \
186 $(addsuffix .c, $(INTERNAL_CMODULES))) $(addprefix internal/, \
187 $(addsuffix .d, $(INTERNAL_MODULES))) $(addprefix \
188 internal/gc/, $(addsuffix .d, $(INTERNAL_GC_MODULES))) \
189 $(addprefix std/, $(addsuffix .d, $(STD_MODULES) \
190 $(STD_MODULES_NOTBUILT))) $(addprefix std/c/, $(addsuffix .d, \
191 $(STD_C_MODULES) $(STD_C_MODULES_NOTBUILT))) $(addprefix \
192 std/c/linux/, $(addsuffix .d, $(STD_C_LINUX_MODULES) \
193 $(STD_C_LINUX_MODULES_NOTBUILT))) $(addprefix std/c/windows/, \
194 $(addsuffix .d, $(STD_C_WINDOWS_MODULES_NOTBUILT))) \
195 $(addprefix std/typeinfo/, $(addsuffix .d, \
196 $(TYPEINFO_MODULES))) $(addprefix std/windows/, $(addsuffix \
197 .d, $(STD_WINDOWS_MODULES_NOTBUILT))) $(addprefix etc/, \
198 $(addsuffix .d, $(ETC_MODULES_NOTBUILT))) $(addprefix etc/c/, \
199 $(addsuffix .d, $(ETC_C_MODULES)))
201 OBJS = errno $(addprefix internal/, $(INTERNAL_MODULES) \
202 $(INTERNAL_CMODULES)) $(addprefix internal/gc/, \
203 $(INTERNAL_GC_MODULES)) $(addprefix etc/c/zlib/, \
204 $(ZLIB_CMODULES))
206 OBJS := $(addsuffix .o,$(addprefix $(OBJDIR)/,$(OBJS)))
208 SRC2LIB = crc32 gcstats $(addprefix std/, $(STD_MODULES)) $(addprefix \
209 std/typeinfo/, $(TYPEINFO_MODULES)) $(addprefix std/c/, \
210 $(STD_C_MODULES)) $(addprefix std/c/linux/, $(STD_C_LINUX_MODULES)) \
211 $(addprefix etc/c/, $(ETC_C_MODULES))
213 SRC2LIB := $(addsuffix .d,$(SRC2LIB))
215 $(LIB) : $(SRC2LIB) $(OBJS) $(MAKEFILE_LIST)
216 @echo $(DMD) $(DFLAGS) -lib -of$@ "[...tons of files...]"
217 @$(DMD) $(DFLAGS) -lib -of$@ $(SRC2LIB) $(OBJS)
219 ###########################################################
220 # Dox
222 STDDOC = ../docsrc/std.ddoc
223 DOCDOC = ../docsrc/doc.ddoc
225 $(DOC_OUTPUT_DIR)/%.html : %.d $(STDDOC)
226 $(DMD) -c -o- $(DFLAGS) -Df$@ $(STDDOC) $<
228 $(DOC_OUTPUT_DIR)/std_%.html : std/%.d $(STDDOC)
229 $(DMD) -c -o- $(DFLAGS) -Df$@ $(STDDOC) $<
231 $(DOC_OUTPUT_DIR)/std_c_%.html : std/c/%.d $(STDDOC)
232 $(DMD) -c -o- $(DFLAGS) -Df$@ $(STDDOC) $<
234 $(DOC_OUTPUT_DIR)/std_c_linux_%.html : std/c/linux/%.d $(STDDOC)
235 $(DMD) -c -o- $(DFLAGS) -Df$@ $(STDDOC) $<
237 html : $(addprefix $(DOC_OUTPUT_DIR)/,$(subst /,_,$(subst .d,.html,$(SRC_DOCUMENTABLES))))
239 ##########################################################
241 zip : $(SRC_RELEASEZIP)
242 $(RM) phobos.zip
243 zip phobos $(SRC_RELEASEZIP)
245 clean:
246 $(RM) libphobos2.a all_std_modules_generated.d
247 $(RM) -r $(DOC_OUTPUT_DIR) obj
250 HEADERDIR = include
251 HEADERS = object.d \
252 $(addprefix std/,$(addsuffix .d,$(STD_MODULES))) \
253 $(addprefix std/,$(addsuffix .d,$(STD_MODULES_NOTBUILT))) \
254 $(addprefix std/c/,$(addsuffix .d,$(STD_C_MODULES))) \
255 $(addprefix std/c/,$(addsuffix .d,$(STD_C_MODULES_NOTBUILT))) \
256 $(addprefix std/c/linux/,$(addsuffix .d,$(STD_C_LINUX_MODULES))) \
257 $(addprefix std/c/linux/,$(addsuffix .d,$(STD_C_LINUX_MODULES_NOTBUILT)))
259 HEADERS := $(addprefix $(HEADERDIR)/,$(HEADERS))
261 $(HEADERDIR)/%.d : %.d
262 $(DMD) -I$(dir $<) -o- -c -H $(DFLAGS) -Hf$@ $<
264 headers: $(HEADERS)