/make/edam-mk

To get this branch, use:
bzr branch http://bzr.ed.am/make/edam-mk
11 by edam
- smartened up comments
1
#_______________________________________________________________________________
2
#
15 by edam
added NDEBUG compiler directive
3
#                       edam's general-purpose makefile                     v2.4
11 by edam
- smartened up comments
4
#_______________________________________________________________________________
5
#                                                                COMMON SETTINGS
3 by edam
- added propper header
6
11 by edam
- smartened up comments
7
#
8
# overridable options
9
# (better to specify in environment/command line)
10
#
8 by edam
- added SUBDIRS for recursing
11
#export DEBUGMODE	:= 1
11 by edam
- smartened up comments
12
#export PROFILEMODE := 1
13
#export LINKSTATIC	:= 1
14
15
#
16
# target binary/library
17
#
18
#MKSTATICLIB	:= 1
19
#MKSHAREDLIB	:= 1
20
TARGET		:= tim
21
22
#
23
# all source files
24
#
9 by edam
- combines sources in to one variable, SOURCES
25
SOURCES		:= tim.cc
3 by edam
- added propper header
26
11 by edam
- smartened up comments
27
#
28
# libraries to link against
29
#
7 by edam
- set CC correctly
30
LIBRARIES	:= 
31
11 by edam
- smartened up comments
32
#
33
# subdirectories to make first
34
#
8 by edam
- added SUBDIRS for recursing
35
SUBDIRS		:= 
3 by edam
- added propper header
36
11 by edam
- smartened up comments
37
#
38
# additional build flags
39
#
9 by edam
- combines sources in to one variable, SOURCES
40
CPPFLAGS	:= 
11 by edam
- smartened up comments
41
CFLAGS		:= 
42
CXXFLAGS	:= 
13 by edam
- added support for D!
43
DFLAGS		:= 
11 by edam
- smartened up comments
44
ASFLAGS		:= 
45
LDFLAGS		:= 
46
LDPOSTFLAGS	:= 
47
48
#_______________________________________________________________________________
49
#                                                                 OTHER SETTINGS
50
51
# set debug mode if profiling
52
ifdef PROFILEMODE
53
export DEBUGMODE := 1
54
endif
55
56
# software
57
CC			:= gcc
58
CXX			:= g++
13 by edam
- added support for D!
59
GDC			:= gdc
60
AS			:= nasm
11 by edam
- smartened up comments
61
LD			:= g++
62
AR			:= ar
63
MAKE		:= make
64
13 by edam
- added support for D!
65
# debug/profile build flags
11 by edam
- smartened up comments
66
CPPFLAGS	:= $(if $(PROFILEMODE),-pg -D PROFILE) $(CPPFLAGS)
15 by edam
added NDEBUG compiler directive
67
CPPFLAGS	:= $(if $(DEBUGMODE),-g -D DEBUG -Wall,-D NDEBUG -O2) $(CPPFLAGS)
13 by edam
- added support for D!
68
DFLAGS		:= $(if $(DEBUGMODE),,-frelease)
15 by edam
added NDEBUG compiler directive
69
ASFLAGS		:= -f elf $(if $(DEBUGMODE),-g -dDEBUG,-dNDEBUG -O2) $(ASFLAGS)
12 by edam
- compiler/linker gives all wornings when building in debug
70
LDFLAGS		:= $(if $(PROFILEMODE),-pg) $(LDFLAGS)
13 by edam
- added support for D!
71
LDFLAGS		:= $(if $(or $(PROFILEMODE), $(DEBUGMODE)),,-Wl,-S) $(LDFLAGS)
72
73
# setup options for shared/static libs
74
CPPFLAGS	:= $(if $(MKSHAREDLIB),-fPIC) $(CPPFLAGS)
12 by edam
- compiler/linker gives all wornings when building in debug
75
LDFLAGS		:= $(if $(LINKSTATIC),-static) $(LDFLAGS)
13 by edam
- added support for D!
76
77
# add libraries for d
78
LIBRARIES	:= $(LIBRARIES) $(if $(filter %.d, $(SOURCES)), gphobos pthread m)
79
80
# build flags for libraries
11 by edam
- smartened up comments
81
LDPOSTFLAGS := $(addprefix -l,$(LIBRARIES)) $(LDPOSTFLAGS)
82
83
#_______________________________________________________________________________
12 by edam
- compiler/linker gives all wornings when building in debug
84
#
11 by edam
- smartened up comments
85
86
# object debug/profile suffix
87
BUILDSUFFIX	:= $(if $(PROFILEMODE),_p,$(if $(DEBUGMODE),_d))
88
13 by edam
- added support for D!
89
# work out object and dependency files
11 by edam
- smartened up comments
90
OBJECTS		:= $(addsuffix $(BUILDSUFFIX).o,$(basename $(SOURCES)))
12 by edam
- compiler/linker gives all wornings when building in debug
91
DEPFILES	:= $(addsuffix .dep,$(basename $(SOURCES)))
11 by edam
- smartened up comments
92
13 by edam
- added support for D!
93
# fixup target name
11 by edam
- smartened up comments
94
ifdef TARGET
13 by edam
- added support for D!
95
TARGET		:= $(basename $(TARGET))$(BUILDSUFFIX)$(suffix $(TARGET))
96
TARGET		:= $(patsubst %.so,%,$(patsubst %.a,%,$(TARGET)))
12 by edam
- compiler/linker gives all wornings when building in debug
97
ifneq ($(strip $(MKSHAREDLIB) $(MKSTATICLIB)),)
13 by edam
- added support for D!
98
TARGET		:= $(TARGET)$(if $(MKSHAREDLIB),.so,$(if $(MKSTATICLIB),.a))
99
TARGET		:= lib$(patsubst lib%,%,$(TARGET))
12 by edam
- compiler/linker gives all wornings when building in debug
100
endif
11 by edam
- smartened up comments
101
endif
102
14 by edam
- optimised dependency generation: generate stub dependencies from the compiler and don't use the sed script where possible
103
# Set up dependency generation build flags and, for those languages where the
104
# the compiler/assembler doesn't support dependency generation, commands to be
105
# executed after generating any dependency file. The commands append the names
106
# of all the depended-on files in the dependency file to the end of the file as
11 by edam
- smartened up comments
107
# empty rules with no prerequesits or commands. This causes make not to fail if
14 by edam
- optimised dependency generation: generate stub dependencies from the compiler and don't use the sed script where possible
108
# one of these files becomes non-existant, but causes files dependent on these
109
# files to be rebuilt (and thus also have their dependencies regenerated).
11 by edam
- smartened up comments
110
ifdef DEBUGMODE
111
ifndef PROFILEMODE
14 by edam
- optimised dependency generation: generate stub dependencies from the compiler and don't use the sed script where possible
112
FIXUP_DEPENDENCY_FILES = \
11 by edam
- smartened up comments
113
	sed 's/\#.*//;s/^[^:]*://;s/^[ \t]*//;s/ *\\$$//;/^$$/d;s/$$/:/' < \
12 by edam
- compiler/linker gives all wornings when building in debug
114
	$(basename $<).dep > .$$$$~; cat .$$$$~ >> $(basename $<).dep; rm .$$$$~;
14 by edam
- optimised dependency generation: generate stub dependencies from the compiler and don't use the sed script where possible
115
DEPFLAGS	= -MMD -MP -MF $(basename $<).dep
11 by edam
- smartened up comments
116
endif
117
endif
118
14 by edam
- optimised dependency generation: generate stub dependencies from the compiler and don't use the sed script where possible
119
# include dependencies
11 by edam
- smartened up comments
120
ifneq "$(MAKECMDGOALS)" "clean"
121
ifneq "$(MAKECMDGOALS)" "clean_all"
122
-include $(DEPFILES)
123
endif
124
endif
125
126
# default rule
127
.DEFAULT_GOAL := all
128
129
#_______________________________________________________________________________
130
#                                                                          RULES
10 by edam
- fixed recursive cleaning
131
9 by edam
- combines sources in to one variable, SOURCES
132
.PHONY:	all subdirs target clean clean_all run depend dep $(SUBDIRS)
133
134
all: subdirs target
135
136
subdirs: $(SUBDIRS)
137
138
target: $(TARGET)
1 by edam
initial makefile
139
11 by edam
- smartened up comments
140
clean:
141
ifdef SUBDIRS
142
ifneq "$(MAKECMDGOALS)" "clean_all"
143
	@echo "NOT RECURSING: use 'make clean_all' to clean subdirectories as well."
144
endif
145
endif
13 by edam
- added support for D!
146
	rm -f $(OBJECTS) $(TARGET) *.dep core
11 by edam
- smartened up comments
147
148
clean_all: subdirs clean
149
150
ifndef MKSTATICLIB
151
ifndef MKSHAREDLIB
9 by edam
- combines sources in to one variable, SOURCES
152
run: target
153
	./$(TARGET)
154
endif
155
endif
4 by edam
- replaced debug option with debug switch
156
8 by edam
- added SUBDIRS for recursing
157
$(SUBDIRS):
12 by edam
- compiler/linker gives all wornings when building in debug
158
	@if [ "$@" = "$(firstword $(SUBDIRS))" ]; then echo; fi
11 by edam
- smartened up comments
159
	@$(MAKE) -C $@ $(filter-out $(SUBDIRS),$(MAKECMDGOALS))
160
	@echo
8 by edam
- added SUBDIRS for recursing
161
9 by edam
- combines sources in to one variable, SOURCES
162
$(TARGET): $(OBJECTS)
11 by edam
- smartened up comments
163
ifdef MKSTATICLIB
9 by edam
- combines sources in to one variable, SOURCES
164
	$(AR) rcs $(TARGET) $(OBJECTS)
8 by edam
- added SUBDIRS for recursing
165
else
11 by edam
- smartened up comments
166
	$(LD) $(if $(MKSHAREDLIB),-shared) -o $(TARGET) $(LDFLAGS) $(OBJECTS) $(LDPOSTFLAGS) 
8 by edam
- added SUBDIRS for recursing
167
endif
168
11 by edam
- smartened up comments
169
%.o %_d.o %_p.o: %.c
170
	$(CC) -c $(CPPFLAGS) $(DEPFLAGS) $(CFLAGS) -o $@ $<
171
172
%.o %_d.o %_p.o: %.cc
173
	$(CXX) -c $(CPPFLAGS) $(DEPFLAGS) $(CXXFLAGS) -o $@ $<
174
%.o %_d.o %_p.o: %.C
175
	$(CXX) -c $(CPPFLAGS) $(DEPFLAGS) $(CXXFLAGS) -o $@ $<
176
%.o %_d.o %_p.o: %.cpp
177
	$(CXX) -c $(CPPFLAGS) $(DEPFLAGS) $(CXXFLAGS) -o $@ $<
178
13 by edam
- added support for D!
179
%.o %_d.o %_p.o: %.d
180
	$(GDC) -c $(CPPFLAGS) $(DFLAGS) -o $@ $<
181
11 by edam
- smartened up comments
182
%.o %_d.o %_p.o: %.s
183
	$(AS) $(ASFLAGS) -o $@ $<
14 by edam
- optimised dependency generation: generate stub dependencies from the compiler and don't use the sed script where possible
184
ifdef DEBUGMODE
185
	$(AS) $(ASFLAGS) -M $< > $(basename $<).dep
186
	$(FIXUP_DEPENDENCY_FILES)
187
endif
11 by edam
- smartened up comments
188
%.o %_d.o %_p.o: %.S
189
	$(AS) $(ASFLAGS) -o $@ $<
14 by edam
- optimised dependency generation: generate stub dependencies from the compiler and don't use the sed script where possible
190
ifdef DEBUGMODE
191
	$(AS) $(ASFLAGS) -M $< > $(basename $<).dep
192
	$(FIXUP_DEPENDENCY_FILES)
193
endif
11 by edam
- smartened up comments
194
%.o %_d.o %_p.o: %.asm
195
	$(AS) $(ASFLAGS) -o $@ $<
14 by edam
- optimised dependency generation: generate stub dependencies from the compiler and don't use the sed script where possible
196
ifdef DEBUGMODE
197
	$(AS) $(ASFLAGS) -M $< > $(basename $<).dep
198
	$(FIXUP_DEPENDENCY_FILES)
199
endif
8 by edam
- added SUBDIRS for recursing
200
9 by edam
- combines sources in to one variable, SOURCES
201
#_______________________________________________________________________________