1 # Makefile to build linux D runtime library libphobos2.a and its unit test
4 # Generate each build targets below except clean
6 # release (default target)
8 # Symlink libphobos2.a in the top level directory
11 # -O -release -unittest
23 # Generate the ddocs for phobos
26 # Delete all files created by build process
31 ifeq (,$(MAKECMDGOALS
))
32 MAKECMDGOALS
:= release
34 ifeq (unittest
/release
,$(MAKECMDGOALS
))
36 DFLAGS
:=$(DFLAGS
) -O
-release
-unittest
37 OBJDIR
=obj
/unittest
/release
39 ifeq (unittest
/debug
,$(MAKECMDGOALS
))
41 DFLAGS
:=$(DFLAGS
) -g
-unittest
42 OBJDIR
=obj
/unittest
/debug
44 ifeq (debug
,$(MAKECMDGOALS
))
49 ifeq (release
,$(MAKECMDGOALS
))
51 DFLAGS
:=$(DFLAGS
) -O
-release
54 ifeq (clean,$(MAKECMDGOALS
))
57 ifeq (html
,$(MAKECMDGOALS
))
60 ifeq (all,$(MAKECMDGOALS
))
63 ifeq (headers
,$(MAKECMDGOALS
))
64 DFLAGS
:=$(DFLAGS
) -O
-release
69 $(error Cannot make
$(MAKECMDGOALS
). Please make either \
70 all, debug
, release
, unittest
/debug
, unittest
/release
, clean, or html
)
73 ifneq (none
,$(OBJDIR
))
74 DUMMY
:= $(shell mkdir
--parents
$(OBJDIR
) $(OBJDIR
)/etc
/c
/zlib
$(OBJDIR
)/internal
)
77 LIB
=$(OBJDIR
)/libphobos2.a
78 DOC_OUTPUT_DIR
=..
/web
/phobos
85 $(CC
) -c
$(CFLAGS
) -o
$@
$<
88 g
++ -c
$(CFLAGS
) -o
$@
$<
91 $(DMD
) -I
$(dir $<) -c
$(DFLAGS
) -of
$@
$<
96 debug release unittest
/debug unittest
/release
: $(OBJDIR
)/unittest
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
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 \
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
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
/, \
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 ###########################################################
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
)
243 zip phobos
$(SRC_RELEASEZIP
)
246 $(RM
) libphobos2.a all_std_modules_generated.d
247 $(RM
) -r
$(DOC_OUTPUT_DIR
) obj
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
$@
$<