phobos/linux.mak
2008-07-03 21:35:36 +00:00

286 lines
8.7 KiB
Makefile

# Makefile to build linux D runtime library libphobos2.a and its unit test
# Targets:
# all
# Generate each build targets below except clean
#
# release (default target)
# -O -release
# Symlink libphobos2.$(LIBEXT) in the top level directory
#
# unittest/release
# -O -release -unittest
#
# debug
# -g
#
# headers
# -O -release
#
# unittest/debug
# -g -unittest
#
# html
# Generate the ddocs for phobos
#
# clean
# Delete all files created by build process
ifdef WIN32
OBJDIR = obj/win32
OBJEXT = obj
LIBEXT = lib
EXEEXT = .exe
CC = wine dmc
DMD = wine dmd
CFLAGS = -mn -6 -r
DFLAGS =
else
OBJDIR = obj/linux
OBJEXT = o
LIBEXT = a
EXEEXT =
CC = gcc
DMD = dmd
CFLAGS = -m32
DFLAGS =
endif
ifeq (,$(MAKECMDGOALS))
MAKECMDGOALS := release
endif
ifeq (unittest/release,$(MAKECMDGOALS))
CFLAGS := $(CFLAGS) -O
DFLAGS := $(DFLAGS) -O -release -unittest
OBJDIR := $(OBJDIR)/unittest/release
endif
ifeq (unittest/debug,$(MAKECMDGOALS))
CFLAGS := $(CFLAGS) -g
DFLAGS := $(DFLAGS) -g -unittest
OBJDIR : = $(OBJDIR)/unittest/debug
endif
ifeq (debug,$(MAKECMDGOALS))
CFLAGS := $(CFLAGS) -g
DFLAGS := $(DFLAGS) -g
OBJDIR := $(OBJDIR)/debug
endif
ifeq (release,$(MAKECMDGOALS))
CFLAGS := $(CFLAGS) -O
DFLAGS := $(DFLAGS) -O -release
OBJDIR := $(OBJDIR)/release
endif
ifeq (clean,$(MAKECMDGOALS))
OBJDIR = none
endif
ifeq (html,$(MAKECMDGOALS))
OBJDIR = none
endif
ifeq (all,$(MAKECMDGOALS))
OBJDIR = none
endif
ifeq (headers,$(MAKECMDGOALS))
DFLAGS := $(DFLAGS) -O -release
OBJDIR = none
endif
ifndef OBJDIR
$(error Cannot make $(MAKECMDGOALS). Please make either all, \
debug, release, unittest/debug, unittest/release, clean, or html)
endif
ifneq (none,$(OBJDIR))
DUMMY := $(shell mkdir --parents $(OBJDIR) $(OBJDIR)/etc/c/zlib \
$(OBJDIR)/internal $(OBJDIR)/internal/gc)
endif
LIB=$(OBJDIR)/libphobos2.$(LIBEXT)
DOC_OUTPUT_DIR=../web/phobos
.SUFFIXES: .d
$(OBJDIR)/%.$(OBJEXT) : %.c
$(CC) -c $(CFLAGS) -o$@ $<
$(OBJDIR)/%.$(OBJEXT) : %.cpp
g++ -c $(CFLAGS) -o$@ $<
$(OBJDIR)/%.$(OBJEXT) : %.d
$(DMD) -I$(dir $<) -c $(DFLAGS) -of$@ $<
$(OBJDIR)/%.$(OBJEXT) : %.asm
$(CC) -c -o$@ $<
debug release unittest/debug unittest/release : $(OBJDIR)/unittest$(EXEEXT)
all :
$(MAKE) -f linux.mak release
$(MAKE) -f linux.mak unittest/release
$(MAKE) -f linux.mak debug
$(MAKE) -f linux.mak unittest/debug
$(MAKE) -f linux.mak html
$(OBJDIR)/unittest$(EXEEXT) : $(OBJDIR)/unittest.$(OBJEXT) \
$(OBJDIR)/all_std_modules_generated.$(OBJEXT) $(LIB)
ifdef WIN32
cp $(LIB) ../../lib/phobos.lib
$(DMD) $(DFLAGS) unittest.d minit.obj
mv unittest.exe $@
wine $@
else
$(CC) -o$@ $^ -lpthread -lm -g -ldl
endif
ifeq (release,$(MAKECMDGOALS))
ln -sf `pwd`/$(OBJDIR)/libphobos2.$(LIBEXT) ../../lib
endif
$(OBJDIR)/unittest.$(OBJEXT) : unittest.d all_std_modules_generated.d
all_std_modules_generated.d : $(MAKEFILE_LIST)
for m in $(STD_MODULES); do echo public import std.$$m\;; done > $@
INTERNAL_MODULES = aApply aApplyR aaA adi alloca arraycast arraycat \
cast cmath2 deh2 dmain2 invariant llmath memset monitor obj \
object qsort switch trace arrayassign
INTERNAL_CMODULES = complex critical
INTERNAL_CMODULES_NOTBUILT = deh
INTERNAL_EXTRAFILES = internal/mars.h internal/minit.asm
INTERNAL_GC_MODULES = gc gcold gcx gcbits gclinux
INTERNAL_GC_EXTRAFILES = \
internal/gc/gcstub.d \
internal/gc/win32.d \
internal/gc/testgc.d \
internal/gc/win32.mak \
internal/gc/linux.mak
STD_MODULES = algorithm array asserterror base64 bigint bind bitarray \
bitmanip boxer compiler complex contracts conv cover cpuid \
cstream ctype date dateparse demangle encoding file format \
functional getopt hiddenfunc intrinsic iterator loader math \
md5 metastrings mmfile moduleinit numeric openrj outbuffer \
outofmemory path perf process random regexp signals socket \
socketstream stdint stdio stream string switcherr syserror \
synchro system thread traits typecons typetuple uni uri utf \
variant xml zip zlib
STD_MODULES_NOTBUILT = stdarg
STD_C_MODULES = stdarg stdio
STD_C_MODULES_NOTBUILT = fenv math process stddef stdlib string time locale \
wcharh
STD_C_LINUX_MODULES = linux socket
STD_C_LINUX_MODULES_NOTBUILT = linuxextern pthread termios
STD_C_WINDOWS_MODULES_NOTBUILT = windows com winsock stat
STD_WINDOWS_MODULES_NOTBUILT = registry iunknown charset
ZLIB_CMODULES = adler32 compress crc32 gzio uncompr deflate trees \
zutil inflate infback inftrees inffast
TYPEINFO_MODULES = ti_wchar ti_uint ti_short ti_ushort ti_byte \
ti_ubyte ti_long ti_ulong ti_ptr ti_float ti_double ti_real \
ti_delegate ti_creal ti_ireal ti_cfloat ti_ifloat ti_cdouble \
ti_idouble ti_dchar ti_Ashort ti_Ag ti_AC ti_C ti_int ti_char \
ti_Aint ti_Along ti_Afloat ti_Adouble ti_Areal ti_Acfloat \
ti_Acdouble ti_Acreal ti_void
ETC_MODULES_NOTBUILT = gamma
ETC_C_MODULES = zlib
SRC = errno.c object.d unittest.d crc32.d
SRC_ZLIB = ChangeLog README adler32.c algorithm.txt compress.c crc32.c \
crc32.h deflate.c deflate.h example.c gzio.c infback.c \
inffast.c inffast.h inffixed.h inflate.c inflate.h inftrees.c \
inftrees.h linux.mak minigzip.c trees.c trees.h uncompr.c \
win32.mak zconf.h zconf.in.h zlib.3 zlib.h zutil.c zutil.h
SRC_ZLIB := $(addprefix etc/c/zlib/,$(SRC_ZLIB))
SRC_DOCUMENTABLES = phobos.d $(addprefix std/, $(addsuffix .d, \
$(STD_MODULES) $(STD_MODULES_NOTBUILT))) $(addprefix std/c/, \
$(addsuffix .d, $(STD_C_MODULES) $(STD_C_MODULES_NOTBUILT))) \
$(addprefix std/c/linux/,$(addsuffix .d, \
$(STD_C_LINUX_MODULES) $(STD_C_LINUX_MODULES_NOTBUILT)))
SRC_RELEASEZIP = linux.mak win32.mak phoboslicense.txt $(SRC) \
$(SRC_ZLIB) $(INTERNAL_EXTRAFILES) $(INTERNAL_GC_EXTRAFILES) \
$(addprefix internal/,$(addsuffix .c, \
$(INTERNAL_CMODULES_NOTBUILT))) $(addprefix internal/, \
$(addsuffix .c, $(INTERNAL_CMODULES))) $(addprefix internal/, \
$(addsuffix .d, $(INTERNAL_MODULES))) $(addprefix \
internal/gc/, $(addsuffix .d, $(INTERNAL_GC_MODULES))) \
$(addprefix std/, $(addsuffix .d, $(STD_MODULES) \
$(STD_MODULES_NOTBUILT))) $(addprefix std/c/, $(addsuffix .d, \
$(STD_C_MODULES) $(STD_C_MODULES_NOTBUILT))) $(addprefix \
std/c/linux/, $(addsuffix .d, $(STD_C_LINUX_MODULES) \
$(STD_C_LINUX_MODULES_NOTBUILT))) $(addprefix std/c/windows/, \
$(addsuffix .d, $(STD_C_WINDOWS_MODULES_NOTBUILT))) \
$(addprefix std/typeinfo/, $(addsuffix .d, \
$(TYPEINFO_MODULES))) $(addprefix std/windows/, $(addsuffix \
.d, $(STD_WINDOWS_MODULES_NOTBUILT))) $(addprefix etc/, \
$(addsuffix .d, $(ETC_MODULES_NOTBUILT))) $(addprefix etc/c/, \
$(addsuffix .d, $(ETC_C_MODULES)))
OBJS = errno $(addprefix internal/, $(INTERNAL_MODULES) \
$(INTERNAL_CMODULES)) $(addprefix internal/gc/, \
$(INTERNAL_GC_MODULES)) $(addprefix etc/c/zlib/, \
$(ZLIB_CMODULES))
OBJS := $(addsuffix .$(OBJEXT),$(addprefix $(OBJDIR)/,$(OBJS)))
SRC2LIB = crc32 gcstats $(addprefix std/, $(STD_MODULES)) $(addprefix \
std/typeinfo/, $(TYPEINFO_MODULES)) $(addprefix std/c/, \
$(STD_C_MODULES)) $(addprefix std/c/linux/, $(STD_C_LINUX_MODULES)) \
$(addprefix etc/c/, $(ETC_C_MODULES))
SRC2LIB := $(addsuffix .d,$(SRC2LIB))
$(LIB) : $(SRC2LIB) $(OBJS) $(MAKEFILE_LIST)
@echo $(DMD) $(DFLAGS) -lib -of$@ "[...tons of files...]"
@$(DMD) $(DFLAGS) -lib -of$@ $(SRC2LIB) $(OBJS)
###########################################################
# Dox
STDDOC = std.ddoc
$(DOC_OUTPUT_DIR)/%.html : %.d $(STDDOC)
$(DMD) -c -o- $(DFLAGS) -Df$@ $(STDDOC) $<
$(DOC_OUTPUT_DIR)/std_%.html : std/%.d $(STDDOC)
$(DMD) -c -o- $(DFLAGS) -Df$@ $(STDDOC) $<
$(DOC_OUTPUT_DIR)/std_c_%.html : std/c/%.d $(STDDOC)
$(DMD) -c -o- $(DFLAGS) -Df$@ $(STDDOC) $<
$(DOC_OUTPUT_DIR)/std_c_linux_%.html : std/c/linux/%.d $(STDDOC)
$(DMD) -c -o- $(DFLAGS) -Df$@ $(STDDOC) $<
html : $(addprefix $(DOC_OUTPUT_DIR)/,$(subst /,_,$(subst .d,.html,$(SRC_DOCUMENTABLES))))
##########################################################
zip : $(SRC_RELEASEZIP)
$(RM) phobos.zip
zip phobos $(SRC_RELEASEZIP)
clean:
$(RM) libphobos2.$(LIBEXT) all_std_modules_generated.d
$(RM) -r $(DOC_OUTPUT_DIR) obj
HEADERDIR = include
HEADERS = object.d \
$(addprefix std/,$(addsuffix .d,$(STD_MODULES))) \
$(addprefix std/,$(addsuffix .d,$(STD_MODULES_NOTBUILT))) \
$(addprefix std/c/,$(addsuffix .d,$(STD_C_MODULES))) \
$(addprefix std/c/,$(addsuffix .d,$(STD_C_MODULES_NOTBUILT))) \
$(addprefix std/c/linux/,$(addsuffix .d,$(STD_C_LINUX_MODULES))) \
$(addprefix std/c/linux/,$(addsuffix .d,$(STD_C_LINUX_MODULES_NOTBUILT)))
HEADERS := $(addprefix $(HEADERDIR)/,$(HEADERS))
$(HEADERDIR)/%.d : %.d
$(DMD) -I$(dir $<) -o- -c -H $(DFLAGS) -Hf$@ $<
headers: $(HEADERS)