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