changed else ifeq so a lesser make can handle it
[physics.git] / Makefile
1
2 # set this on the command line to 1 to get a windows 32 build
3 WIN32    := 0
4
5 # set this on the command line to 1 to get a final (none debug) build
6 FINAL    := 0
7
8
9 ifeq (${WIN32},1)
10     LIBGL   := -lopengl32 -lglu32
11     LIBSDL  := `/usr/mingw32/bin/sdl-config --libs`
12 else
13     LIBGL   := -lGL -lGLU
14     LIBSDL  := `sdl-config --libs`
15 endif
16 LIBMY       := -lpg
17 LIBS        := ${LIBSDL} ${LIBGL} ${LIBMY}
18
19 OPTFLAGS := -O2
20 DBGFLAGS := -ggdb
21 PRFFLAGS := ${DBGFLAGS} -pg
22 MYFLAGS  := -Wall -pedantic -ansi
23
24 RPATH    := libs/
25
26 VALFLAGS := --leak-check=full
27 LNKFLAGS := -Wl,-rpath,${RPATH}
28
29 ifeq (${WIN32},1)
30     CXXFLAGS    := ${OPTFLAGS}
31 else
32 ifeq (${FINAL},1)
33     CXXFLAGS    := ${OPTFLAGS}
34 else
35     CXXFLAGS    := ${MYFLAGS} ${DBGFLAGS}
36 endif
37 endif
38
39 ifeq (${WIN32},1)
40     CXX := mingw32-g++
41 else
42     CXX := g++
43 endif
44
45 DIRS    := # := start
46
47 SRCSDIR := src/
48 SRCS    := # := start
49
50 ifeq (${WIN32},1)
51     OBJSDIR := objs-mingw32/
52 else
53 ifeq (${FINAL},1)
54     OBJSDIR := objs/
55 else
56     OBJSDIR := objsd/
57 endif
58 endif
59 OBJS        := # := start
60
61 DEPSDIR := deps/
62 DEPS    := # := start
63
64 # include all of the dir.mk
65 DIRMK   := dir.mk
66 include ${SRCSDIR}${DIRMK}
67
68 ifeq (${WIN32},1)
69     WORKINGDIR  := bin-mingw32/
70 else
71 ifeq (${FINAL},1)
72     WORKINGDIR  := bin/
73 else
74     WORKINGDIR  := bind/
75 endif
76 endif
77
78 CFGDIRNAME  := configs/
79 SRCCFGDIR   := ${CFGDIRNAME}
80 DSTCFGDIR   := ${WORKINGDIR}${CFGDIRNAME}
81
82 CFGS := # := start
83 CFGS += keys.cfg
84 CFGS := $(addprefix ${DSTCFGDIR},${CFGS})
85
86 LIBSDIRNAME := libs/
87 SRCLIBSDIR  := ${LIBSDIRNAME}
88 DSTLIBSDIR  := ${WORKINGDIR}${LIBSDIRNAME}
89
90 LIBSTXT     := # := start
91 LIBSTXT     += COPYING-SDL
92 LIBSTXT     += README-SDL
93 LIBSTXT     += VERSION-SDL
94 LIBSTXT     := $(addprefix ${DSTLIBSDIR},${LIBSTXT})
95
96 LIBSCPY     := # := start
97 ifeq (${WIN32},1)
98     LIBSCPY += SDL.dll
99 else
100     LIBSCPY += libSDL-1.2.so.0
101     LIBSCPY += libpg.so.0
102 endif
103 LIBSCPY     := $(addprefix ${DSTLIBSDIR},${LIBSCPY})
104
105 SRCTXTDIR   :=
106 DSTTXTDIR   := ${WORKINGDIR}
107
108 TXT         := # := start
109 TXT         += COPYING
110 TXT         := $(addprefix ${DSTTXTDIR},${TXT})
111
112 ifeq (${WIN32},1)
113     TARGETNAME  := run_physics.exe
114 else
115     TARGETNAME  := run_physics
116 endif
117 TARGETTMP   := ${OBJSDIR}${TARGETNAME}
118 TARGET      := ${WORKINGDIR}${TARGETNAME}
119
120 DEPSBLDDIRS := ${DEPSDIR} $(addprefix ${DEPSDIR},${DIRS})
121 OBJSBLDDIRS := ${OBJSDIR} $(addprefix ${OBJSDIR},${DIRS})
122
123 BLDDIRS     := # := start
124 BLDDIRS     += ${OBJSBLDDIRS}
125 BLDDIRS     += ${DEPSBLDDIRS}
126 BLDDIRS     += ${WORKINGDIR}
127 BLDDIRS     += ${DSTCFGDIR}
128 BLDDIRS     += ${DSTLIBSDIR}
129
130 INCDIRS     := ${SRCSDIR}
131 INCFLAGS    := $(addprefix -I, ${INCDIRS})
132
133
134 PRNTFMT := printf "%-5s: %s\n"
135
136 VERBOSE := 0
137
138 ifeq (${VERBOSE},0)
139     # quiet the printf command
140     Q1 := @
141     # quiet the command that is `replaced' by an echo
142     Q2 := @
143 else
144     # EAT the printf command as if it was not there
145     Q1 := @true # NOTE: the space between @true and the # is VERY important!!
146     # do not quiet the command output
147     Q2 :=
148 endif
149
150 .PHONY: all
151 all: ${TARGET} ${CFGS} ${LIBSTXT} ${LIBSCPY} ${TXT}
152
153 # cause the fancy $$ directory rules to work out
154 .SECONDEXPANSION:
155
156 # how to link the main target
157 ${TARGETTMP}: ${OBJS}
158         ${Q1}${PRNTFMT} "${CXX}" "$@"
159         ${Q2}${CXX} ${CXXFLAGS} ${LNKFLAGS} -o $@ $^ ${LIBS}
160
161 # rule to copy tmp target to working directory
162 ${TARGET}: ${TARGETTMP} | ${WORKINGDIR}
163         ${Q1}${PRNTFMT} "cp" "$@"
164         ${Q2}cp $< $@
165
166 # rule to copy the config files into the working directory
167 ${DSTCFGDIR}%: ${SRCCFGDIR}% | $$(dir $$@)
168         ${Q1}${PRNTFMT} "cp" "$@"
169         ${Q2}cp $< $@
170
171 # rule to copy the library files into the working directory
172 ${DSTLIBSDIR}%: ${SRCLIBSDIR}% | $$(dir $$@)
173         ${Q1}${PRNTFMT} "cp" "$@"
174         ${Q2}cp $< $@
175
176 # rule to copy the library files into the working directory
177 ${DSTTXTDIR}%: ${SRCTXTDIR}% | $$(dir $$@)
178         ${Q1}${PRNTFMT} "cp" "$@"
179         ${Q2}cp $< $@
180
181 # how to make a directory
182 ${BLDDIRS}:
183         ${Q1}${PRNTFMT} "mkdir" "$@"
184         ${Q2}mkdir -p $@
185
186 # rule to make an object file from a .cpp
187 ${OBJSDIR}%.o: ${SRCSDIR}%.cpp | $$(dir $$@)
188         ${Q1}${PRNTFMT} "${CXX}" "$@"
189         ${Q2}${CXX} ${CXXFLAGS} -c -o $@ $< ${INCFLAGS}
190
191 # rule to make a depend file from a .cpp
192 #   be clever and escape the / chars in file paths
193 #   DON'T simply use another sed delimiter or it can't appear in the file paths
194 ${DEPSDIR}%.d: ${SRCSDIR}%.cpp | $$(dir $$@)
195         ${Q1}${PRNTFMT} "DEP" "$@"
196         ${Q2}${CXX} -MM ${CXXFLAGS} $< ${INCFLAGS} | \
197                 sed 's/\(^.*\):/$(subst /,\/,${OBJSDIR}\1 $@):/' > $@
198
199 CLEANCMDS := cleanbin cleanobjs cleandeps clean cleanall
200
201 .PHONY: cleanbin
202 cleanbin:
203         ${Q1}${PRNTFMT} "rm" "${WORKINGDIR}"
204         ${Q2}rm -rf ${WORKINGDIR}
205
206 .PHONY: cleanobjs
207 cleanobjs:
208         ${Q1}${PRNTFMT} "rm" "${OBJSDIR}"
209         ${Q2}rm -rf ${OBJSDIR}
210
211 .PHONY: cleandeps
212 cleandeps:
213         ${Q1}${PRNTFMT} "rm" "${DEPSDIR}"
214         ${Q2}rm -rf ${DEPSDIR}
215
216 .PHONY: clean
217 clean: cleanobjs
218         ${Q1}${PRNTFMT} "rm" "${TARGET}"
219         ${Q2}rm -rf ${TARGET}
220
221 .PHONY: cleanall
222 cleanall: clean cleanbin cleandeps
223
224 .PHONY: gitclean
225 gitclean:
226         ${Q1}${PRNTFMT} "git clean" "showing; use gitcleanf to force removal"
227         ${Q2}git clean -nxd
228
229 .PHONY: gitcleanf
230 gitcleanf:
231         ${Q1}${PRNTFMT} "git clean" "forcing"
232         ${Q2}git clean -fxd
233
234 .PHONY: tar
235 tar: physics.tar.bz2
236
237 .PHONY: physics.tar.bz2
238 physics.tar.bz2:
239         @${PRNTFMT} "git archive" "Warning, archives HEAD not current"
240         ${Q1}${PRNTFMT} "git archive" "physics.tar.bz2"
241         ${Q2}git archive --prefix=physics/ HEAD | bzip2 > physics.tar.bz2
242
243 .PHONY: run
244 run: all
245 ifeq (${WIN32},1)
246         cd ${WORKINGDIR}; wine ${TARGETNAME}
247 else
248         cd ${WORKINGDIR}; ./${TARGETNAME}
249 endif
250
251 .PHONY: gdb
252 gdb: all
253         cd ${WORKINGDIR}; gdb ${TARGETNAME}
254
255 .PHONY: cgdb
256 cgdb: all
257         cd ${WORKINGDIR}; cgdb ${TARGETNAME}
258
259 .PHONY: val
260 val: all
261         cd ${WORKINGDIR}; valgrind ${VALFLAGS} ./${TARGETNAME}
262
263 .PHONY: prof
264 prof: run
265         cd ${WORKINGDIR}; gprof -b ${TARGETNAME} > prof
266         cd ${WORKINGDIR}; kprof -f prof
267
268
269 # Do not include deps files when doing a _single_ clean operation
270 ifeq ($(findstring ${MAKECMDGOALS},${CLEANCMDS}),)
271     -include ${DEPS}
272 endif