bzr branch
http://bzr.ed.am/make/edam-mk
11
by edam
- smartened up comments |
1 |
#_______________________________________________________________________________ |
2 |
# |
|
16
by edam
- renamed to edam.mk; makefile should now be included rather than duplicated and modified |
3 |
# edam's general-purpose makefile |
4 |
#_______________________________________________________________________________ |
|
5 |
# version 3.0 |
|
6 |
# Copyright (c) 2008 Tim Marston <edam@waxworlds.org>. |
|
7 |
# |
|
8 |
# Permission is hereby granted, free of charge, to any person obtaining a copy |
|
9 |
# of this software and associated documentation files (the "Software"), to deal |
|
10 |
# in the Software without restriction, including without limitation the rights |
|
11 |
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
12 |
# copies of the Software, and to permit persons to whom the Software is |
|
13 |
# furnished to do so, subject to the following conditions: |
|
14 |
# |
|
15 |
# The above copyright notice and this permission notice shall be included in |
|
16 |
# all copies or substantial portions of the Software. |
|
17 |
# |
|
18 |
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
19 |
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
20 |
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
21 |
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
22 |
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
23 |
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|
24 |
# THE SOFTWARE. |
|
25 |
#_______________________________________________________________________________ |
|
26 |
# |
|
27 |
# |
|
28 |
# This is a general-purpose makefile for use with GNU make. It can be downloaded |
|
29 |
# from http://www.waxworlds.org/edam/software/general-purpose-makefile where you |
|
30 |
# might also find more information/documentation on it's use. The following text |
|
31 |
# can only really be considered a reference to it's use. |
|
32 |
# |
|
33 |
# To use this makefile, put a file named "Makefile" in your project directory. |
|
34 |
# Add all your project's settings to your Makefile and then include this file |
|
35 |
# from it. For example, your Makefile might look something like this: |
|
36 |
# |
|
37 |
# TARGET = my_program |
|
38 |
# SOURCES = main.cc foo.cc |
|
39 |
# LIBRARIES = bar |
|
40 |
# include ~/src/edam.mk |
|
41 |
# |
|
42 |
# A complete list of all the settings you can use in your Makefile follows. It |
|
43 |
# should be noted, though, that some settings are better defined in the shell's |
|
44 |
# environment and/or specified on the make command line than hard-coded straight |
|
45 |
# in to the Makefile. For example, the "DEBUGMODE" is an ideal candidate for |
|
46 |
# exporting from your shell: |
|
47 |
# export DEBUGMODE=1 |
|
48 |
# and overridding on the command line when necessary: |
|
49 |
# make DEBUGMODE= |
|
50 |
# |
|
51 |
# It should also be noted that boolean parameters should either be undefined (or |
|
52 |
# defined as an empty string) for "off", and defined as "1" for "on"; as in the |
|
53 |
# above example with setting DEBUGMODE. |
|
54 |
# |
|
55 |
# Here is a list of all configuration parameters: |
|
56 |
# |
|
57 |
# DEBUGMODE Boolean. Build a debugable version of the target suitable for |
|
58 |
# debugging with gdb. It's probably better to set this from the |
|
59 |
# command line or the shell's environment than to hard-code it. |
|
60 |
# PROFILEMODE Boolean. When set, DEBUGMODE is also implied. Build a profiling |
|
61 |
# version of the target, for use with gprof. It's probably better |
|
62 |
# to set this from the command line or the shell's environment |
|
63 |
# than to hard-code it. |
|
64 |
# |
|
65 |
# LINKSTATIC Boolean. Set to build a target that staticly links against all |
|
66 |
# its libraries and doesn't use shared libraries. |
|
67 |
# |
|
68 |
# MKSTATICLIB Boolean. Target type: Set to build a static library target. If |
|
69 |
# neither this nor MKSHAREDLIB are set, the target defaults to a |
|
70 |
# binary executable. |
|
71 |
# MKSHAREDLIB Boolean. Target type: Set to build a shared library target. If |
|
72 |
# neither this nor MKSTATICLIB are set, the target defaults to a |
|
73 |
# binary executable. |
|
74 |
# |
|
75 |
# TARGET The name of the target file. |
|
76 |
# |
|
77 |
# SOURCES A list of all source files of whatever language. The language |
|
78 |
# type is determined by the file extension. |
|
79 |
# |
|
80 |
# LIBRARIES A list of libraries to link against. Don't include the 'lib' |
|
81 |
# prefix. |
|
82 |
# |
|
83 |
# SUBDIRS A list of subdirectories to build before attempting to build the |
|
84 |
# target. These subdirectories are also included in a clean_all. |
|
85 |
# |
|
86 |
# CPPFLAGS Flags to give to the C and C++ compilers |
|
87 |
# CFLAGS Flags to give to the C compiler |
|
88 |
# CXXFLAGS Flags to give to the C++ compiler |
|
89 |
# DFLAGS Flags to give to the D compiler |
|
90 |
# ASFLAGS Flags to give to the assembler |
|
91 |
# LDFLAGS Flags to give to the linker before librarys |
|
92 |
# LDPOSTFLAGS Flags to give to the linker after libraries |
|
93 |
# |
|
94 |
# This general-purpose makefile also defines the following goals for use on the |
|
95 |
# command line when you run make: |
|
96 |
# |
|
97 |
# all This is the default if no goal is specified. It builds subdirs |
|
98 |
# first and then the target. |
|
99 |
# |
|
100 |
# subdirs Changes to the subdirectories specified for the project and runs |
|
101 |
# make in them. |
|
102 |
# |
|
103 |
# target Builds the target of your Makefile. |
|
104 |
# |
|
105 |
# run Builds the target of your Makefile and, if successful, runs it. |
|
106 |
# This is not available if you're building a library of some kind. |
|
107 |
# |
|
108 |
# clean Deletes temporary files. |
|
109 |
# |
|
110 |
# clean_all Deletes temporary files and then goes through then project's |
|
111 |
# subdirectories doing the same. |
|
112 |
# |
|
113 |
# <subdir> Builds the specified subdirectory from those that are listed for |
|
114 |
# the project. |
|
115 |
# |
|
116 |
# <file> Builds the specified file, either an object file or the target, |
|
117 |
# from those that that would be built for the project. |
|
118 |
# |
|
119 |
# Please report any problems to Tim Marston <edam@waxworlds.org> |
|
120 |
# |
|
121 |
# Known shortcommings: |
|
122 |
# - Using C is probably broken because g++ is currently used for linking. We |
|
123 |
# should switch to ld and specify the correct crt as required by source files. |
|
124 |
# - Currently can only specify one target. If we could specify several targets |
|
125 |
# though, we'd need separate sources, libraries and build params for each! |
|
126 |
# |
|
127 |
#_______________________________________________________________________________ |
|
128 |
# |
|
11
by edam
- smartened up comments |
129 |
|
130 |
# set debug mode if profiling |
|
131 |
ifdef PROFILEMODE |
|
132 |
export DEBUGMODE := 1 |
|
133 |
endif |
|
134 |
||
135 |
# software |
|
136 |
CC := gcc |
|
137 |
CXX := g++ |
|
13
by edam
- added support for D! |
138 |
GDC := gdc |
139 |
AS := nasm |
|
11
by edam
- smartened up comments |
140 |
LD := g++ |
141 |
AR := ar |
|
142 |
MAKE := make |
|
143 |
||
13
by edam
- added support for D! |
144 |
# debug/profile build flags |
11
by edam
- smartened up comments |
145 |
CPPFLAGS := $(if $(PROFILEMODE),-pg -D PROFILE) $(CPPFLAGS) |
15
by edam
added NDEBUG compiler directive |
146 |
CPPFLAGS := $(if $(DEBUGMODE),-g -D DEBUG -Wall,-D NDEBUG -O2) $(CPPFLAGS) |
13
by edam
- added support for D! |
147 |
DFLAGS := $(if $(DEBUGMODE),,-frelease) |
15
by edam
added NDEBUG compiler directive |
148 |
ASFLAGS := -f elf $(if $(DEBUGMODE),-g -dDEBUG,-dNDEBUG -O2) $(ASFLAGS) |
12
by edam
- compiler/linker gives all wornings when building in debug |
149 |
LDFLAGS := $(if $(PROFILEMODE),-pg) $(LDFLAGS) |
13
by edam
- added support for D! |
150 |
LDFLAGS := $(if $(or $(PROFILEMODE), $(DEBUGMODE)),,-Wl,-S) $(LDFLAGS) |
151 |
||
152 |
# setup options for shared/static libs |
|
153 |
CPPFLAGS := $(if $(MKSHAREDLIB),-fPIC) $(CPPFLAGS) |
|
12
by edam
- compiler/linker gives all wornings when building in debug |
154 |
LDFLAGS := $(if $(LINKSTATIC),-static) $(LDFLAGS) |
13
by edam
- added support for D! |
155 |
|
156 |
# add libraries for d |
|
157 |
LIBRARIES := $(LIBRARIES) $(if $(filter %.d, $(SOURCES)), gphobos pthread m) |
|
158 |
||
159 |
# build flags for libraries |
|
11
by edam
- smartened up comments |
160 |
LDPOSTFLAGS := $(addprefix -l,$(LIBRARIES)) $(LDPOSTFLAGS) |
161 |
||
162 |
#_______________________________________________________________________________ |
|
12
by edam
- compiler/linker gives all wornings when building in debug |
163 |
# |
11
by edam
- smartened up comments |
164 |
|
165 |
# object debug/profile suffix |
|
166 |
BUILDSUFFIX := $(if $(PROFILEMODE),_p,$(if $(DEBUGMODE),_d)) |
|
167 |
||
13
by edam
- added support for D! |
168 |
# work out object and dependency files |
11
by edam
- smartened up comments |
169 |
OBJECTS := $(addsuffix $(BUILDSUFFIX).o,$(basename $(SOURCES))) |
12
by edam
- compiler/linker gives all wornings when building in debug |
170 |
DEPFILES := $(addsuffix .dep,$(basename $(SOURCES))) |
11
by edam
- smartened up comments |
171 |
|
13
by edam
- added support for D! |
172 |
# fixup target name |
11
by edam
- smartened up comments |
173 |
ifdef TARGET |
13
by edam
- added support for D! |
174 |
TARGET := $(basename $(TARGET))$(BUILDSUFFIX)$(suffix $(TARGET)) |
175 |
TARGET := $(patsubst %.so,%,$(patsubst %.a,%,$(TARGET))) |
|
12
by edam
- compiler/linker gives all wornings when building in debug |
176 |
ifneq ($(strip $(MKSHAREDLIB) $(MKSTATICLIB)),) |
13
by edam
- added support for D! |
177 |
TARGET := $(TARGET)$(if $(MKSHAREDLIB),.so,$(if $(MKSTATICLIB),.a)) |
178 |
TARGET := lib$(patsubst lib%,%,$(TARGET)) |
|
12
by edam
- compiler/linker gives all wornings when building in debug |
179 |
endif |
11
by edam
- smartened up comments |
180 |
endif |
181 |
||
14
by edam
- optimised dependency generation: generate stub dependencies from the compiler and don't use the sed script where possible |
182 |
# Set up dependency generation build flags and, for those languages where the |
183 |
# the compiler/assembler doesn't support dependency generation, commands to be |
|
184 |
# executed after generating any dependency file. The commands append the names |
|
185 |
# of all the depended-on files in the dependency file to the end of the file as |
|
11
by edam
- smartened up comments |
186 |
# 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 |
187 |
# one of these files becomes non-existant, but causes files dependent on these |
188 |
# files to be rebuilt (and thus also have their dependencies regenerated). |
|
11
by edam
- smartened up comments |
189 |
ifdef DEBUGMODE |
190 |
ifndef PROFILEMODE |
|
14
by edam
- optimised dependency generation: generate stub dependencies from the compiler and don't use the sed script where possible |
191 |
FIXUP_DEPENDENCY_FILES = \ |
11
by edam
- smartened up comments |
192 |
sed 's/\#.*//;s/^[^:]*://;s/^[ \t]*//;s/ *\\$$//;/^$$/d;s/$$/:/' < \ |
12
by edam
- compiler/linker gives all wornings when building in debug |
193 |
$(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 |
194 |
DEPFLAGS = -MMD -MP -MF $(basename $<).dep |
11
by edam
- smartened up comments |
195 |
endif |
196 |
endif |
|
197 |
||
14
by edam
- optimised dependency generation: generate stub dependencies from the compiler and don't use the sed script where possible |
198 |
# include dependencies |
11
by edam
- smartened up comments |
199 |
ifneq "$(MAKECMDGOALS)" "clean" |
200 |
ifneq "$(MAKECMDGOALS)" "clean_all" |
|
201 |
-include $(DEPFILES) |
|
202 |
endif |
|
203 |
endif |
|
204 |
||
205 |
# default rule |
|
206 |
.DEFAULT_GOAL := all |
|
207 |
||
208 |
#_______________________________________________________________________________ |
|
209 |
# RULES |
|
10
by edam
- fixed recursive cleaning |
210 |
|
9
by edam
- combines sources in to one variable, SOURCES |
211 |
.PHONY: all subdirs target clean clean_all run depend dep $(SUBDIRS) |
212 |
||
213 |
all: subdirs target |
|
214 |
||
215 |
subdirs: $(SUBDIRS) |
|
216 |
||
217 |
target: $(TARGET) |
|
1
by edam
initial makefile |
218 |
|
11
by edam
- smartened up comments |
219 |
clean: |
220 |
ifdef SUBDIRS |
|
221 |
ifneq "$(MAKECMDGOALS)" "clean_all" |
|
222 |
@echo "NOT RECURSING: use 'make clean_all' to clean subdirectories as well." |
|
223 |
endif |
|
224 |
endif |
|
13
by edam
- added support for D! |
225 |
rm -f $(OBJECTS) $(TARGET) *.dep core |
11
by edam
- smartened up comments |
226 |
|
227 |
clean_all: subdirs clean |
|
228 |
||
229 |
ifndef MKSTATICLIB |
|
230 |
ifndef MKSHAREDLIB |
|
9
by edam
- combines sources in to one variable, SOURCES |
231 |
run: target |
232 |
./$(TARGET) |
|
233 |
endif |
|
234 |
endif |
|
4
by edam
- replaced debug option with debug switch |
235 |
|
8
by edam
- added SUBDIRS for recursing |
236 |
$(SUBDIRS): |
12
by edam
- compiler/linker gives all wornings when building in debug |
237 |
@if [ "$@" = "$(firstword $(SUBDIRS))" ]; then echo; fi |
11
by edam
- smartened up comments |
238 |
@$(MAKE) -C $@ $(filter-out $(SUBDIRS),$(MAKECMDGOALS)) |
239 |
@echo |
|
8
by edam
- added SUBDIRS for recursing |
240 |
|
9
by edam
- combines sources in to one variable, SOURCES |
241 |
$(TARGET): $(OBJECTS) |
11
by edam
- smartened up comments |
242 |
ifdef MKSTATICLIB |
9
by edam
- combines sources in to one variable, SOURCES |
243 |
$(AR) rcs $(TARGET) $(OBJECTS) |
8
by edam
- added SUBDIRS for recursing |
244 |
else |
11
by edam
- smartened up comments |
245 |
$(LD) $(if $(MKSHAREDLIB),-shared) -o $(TARGET) $(LDFLAGS) $(OBJECTS) $(LDPOSTFLAGS) |
8
by edam
- added SUBDIRS for recursing |
246 |
endif |
247 |
||
11
by edam
- smartened up comments |
248 |
%.o %_d.o %_p.o: %.c |
249 |
$(CC) -c $(CPPFLAGS) $(DEPFLAGS) $(CFLAGS) -o $@ $< |
|
250 |
||
251 |
%.o %_d.o %_p.o: %.cc |
|
252 |
$(CXX) -c $(CPPFLAGS) $(DEPFLAGS) $(CXXFLAGS) -o $@ $< |
|
253 |
%.o %_d.o %_p.o: %.C |
|
254 |
$(CXX) -c $(CPPFLAGS) $(DEPFLAGS) $(CXXFLAGS) -o $@ $< |
|
255 |
%.o %_d.o %_p.o: %.cpp |
|
256 |
$(CXX) -c $(CPPFLAGS) $(DEPFLAGS) $(CXXFLAGS) -o $@ $< |
|
257 |
||
13
by edam
- added support for D! |
258 |
%.o %_d.o %_p.o: %.d |
259 |
$(GDC) -c $(CPPFLAGS) $(DFLAGS) -o $@ $< |
|
260 |
||
11
by edam
- smartened up comments |
261 |
%.o %_d.o %_p.o: %.s |
262 |
$(AS) $(ASFLAGS) -o $@ $< |
|
14
by edam
- optimised dependency generation: generate stub dependencies from the compiler and don't use the sed script where possible |
263 |
ifdef DEBUGMODE |
264 |
$(AS) $(ASFLAGS) -M $< > $(basename $<).dep |
|
265 |
$(FIXUP_DEPENDENCY_FILES) |
|
266 |
endif |
|
11
by edam
- smartened up comments |
267 |
%.o %_d.o %_p.o: %.S |
268 |
$(AS) $(ASFLAGS) -o $@ $< |
|
14
by edam
- optimised dependency generation: generate stub dependencies from the compiler and don't use the sed script where possible |
269 |
ifdef DEBUGMODE |
270 |
$(AS) $(ASFLAGS) -M $< > $(basename $<).dep |
|
271 |
$(FIXUP_DEPENDENCY_FILES) |
|
272 |
endif |
|
11
by edam
- smartened up comments |
273 |
%.o %_d.o %_p.o: %.asm |
274 |
$(AS) $(ASFLAGS) -o $@ $< |
|
14
by edam
- optimised dependency generation: generate stub dependencies from the compiler and don't use the sed script where possible |
275 |
ifdef DEBUGMODE |
276 |
$(AS) $(ASFLAGS) -M $< > $(basename $<).dep |
|
277 |
$(FIXUP_DEPENDENCY_FILES) |
|
278 |
endif |
|
8
by edam
- added SUBDIRS for recursing |
279 |
|
9
by edam
- combines sources in to one variable, SOURCES |
280 |
#_______________________________________________________________________________ |
16
by edam
- renamed to edam.mk; makefile should now be included rather than duplicated and modified |
281 |