make clean
[physics.git] / src / Makefile
1
2 LIBGL  := -lGL -lGLU
3 LIBSDL := `sdl-config --libs`
4 LIBS   := ${LIBSDL} ${LIBGL}
5
6 OPTFLAGS := -O2
7 DBGFLAGS := -ggdb
8 PRFFLAGS := ${DBGFLAGS} -pg
9 CXXFLAGS := -Wall -pedantic -ansi ${DBGFLAGS}
10
11 VALFLAGS := --leak-check=full
12
13 WORKINGDIR  := ..
14 TARGETNAME  := run_physics
15 TARGET      := ${WORKINGDIR}/${TARGETNAME}
16
17 SRCS := # := start
18
19 DIRS := # := start
20 DIRS += .
21 DIRS += Entities
22 DIRS += GameStates
23 DIRS += Effects
24 DIRS += config
25 DIRS += input
26 DIRS += graphics
27
28 include $(addsuffix /files.mk,${DIRS})
29
30 OBJSDIR := ../objs/
31 OBJS    := ${SRCS:.cpp=.o}
32 OBJS    := $(addprefix ${OBJSDIR},${OBJS})
33
34 DEPSDIR := ../deps/
35 DEPS    := ${SRCS:.cpp=.d}
36 DEPS    := $(addprefix ${DEPSDIR},${DEPS})
37
38 BLDDIRS := $(addprefix ${DEPSDIR},${DIRS}) $(addprefix ${OBJSDIR},${DIRS})
39
40
41 VERBOSE := 0
42
43 ifeq (${VERBOSE},0)
44     # quiet the echo command
45     Q1 := @
46     # quiet the command that is `replaced' by an echo
47     Q2 := @
48 else
49     # EAT the echo command as if it was not there
50     Q1 := @true # NOTE: the space between @true and the # is VERY important!!
51     # do not quiet the command output
52     Q2 :=
53 endif
54
55 .PHONY: all
56 all: ${TARGET}
57
58 # how to link the main target
59 ${TARGET}: ${OBJS}
60         ${Q1}echo "${CXX}: $@"
61         ${Q2}${CXX} ${CXXFLAGS} -o $@ $^ ${LIBS}
62
63 # how to make a directory
64 ${BLDDIRS}:
65         ${Q2}mkdir -p $@
66
67 # rule to make a depend file from a .cpp
68 ${DEPSDIR}%.d: %.cpp | ${BLDDIRS}
69         ${Q1}echo "DEP: $@"
70         ${Q2}${CXX} -MM ${CXXFLAGS} $< | sed 's,\(^.*\):,${OBJSDIR}\1 $@:,' > $@
71
72 # rule to make an object file from a .cpp
73 ${OBJSDIR}%.o: %.cpp | ${BLDDIRS}
74         ${Q1}echo "${CXX}: $@"
75         ${Q2}${CXX} ${CXXFLAGS} -c -o $@ $<
76
77
78 tags: ${SRCS}
79         ${Q1}echo "ctags: $@"
80         ${Q2}ctags $^
81
82
83 .PHONY: clean
84 clean:
85         ${Q1}echo "CLEAN: OBJS"
86         ${Q2}rm -f ${OBJS}
87         ${Q1}echo "CLEAN: TARGET"
88         ${Q2}rm -f ${TARGET}
89
90 .PHONY: distclean
91 distclean: clean
92         ${Q1}echo "CLEAN: DEPS"
93         ${Q2}rm -f ${DEPS}
94         ${Q1}echo "CLEAN: tags prof gmon.out"
95         ${Q2}rm -f tags prof gmon.out
96
97 .PHONY: gitclean
98 gitclean:
99         ${Q1}echo "git-clean: show, use gitcleanf to force"
100         ${Q2}cd ..; git clean -nxd
101
102 .PHONY: gitcleanf
103 gitcleanf:
104         ${Q1}echo "git-clean: forced"
105         ${Q2}cd ..; git clean -fxd
106
107 .PHONY: tar
108 tar: ../physics.tar.bz2
109
110 .PHONY: ../physics.tar.bz2
111 ../physics.tar.bz2:
112         @echo "git-archive: Warning, archives HEAD not current"
113         ${Q1}echo "git-archive: ../physics.tar.bz2"
114         ${Q2}cd ..; git-archive --prefix=physics/ HEAD | bzip2 > physics.tar.bz2
115
116 .PHONY: run
117 run: all
118         cd ${WORKINGDIR}; ./${TARGETNAME}
119
120 .PHONY: gdb
121 gdb: all
122         cd ${WORKINGDIR}; gdb ${TARGETNAME}
123
124 .PHONY: cgdb
125 cgdb: all
126         cd ${WORKINGDIR}; cgdb ${TARGETNAME}
127
128 .PHONY: val
129 val: all
130         cd ${WORKINGDIR}; valgrind ${VALFLAGS} ${TARGETNAME}
131
132 .PHONY: prof
133 prof: run
134         cd ${WORKINGDIR}; gprof -b ${TARGETNAME} > src/prof
135         kprof -f prof
136
137 -include ${DEPS}