]> git.localhorst.tv Git - blank.git/blob - Makefile
linker argument order for old gcc
[blank.git] / Makefile
1 CXX = g++ --std=c++11
2 LDXX = g++
3
4 LIBS = sdl2 SDL2_image SDL2_net SDL2_ttf glew openal freealut zlib
5
6 PKGFLAGS := $(shell pkg-config --cflags $(LIBS))
7 PKGLIBS := $(shell pkg-config --libs $(LIBS))
8 TESTFLAGS := $(shell pkg-config --cflags cppunit)
9 TESTLIBS := $(shell pkg-config --libs cppunit)
10
11 CPPFLAGS ?=
12 CPPFLAGS += $(PKGFLAGS)
13 CXXFLAGS ?=
14 CXXFLAGS += -Wall
15 #CXXFLAGS += -march=native
16 LDXXFLAGS ?=
17 LDXXFLAGS += $(PKGLIBS)
18
19 # source
20 SOURCE_DIR := src
21 TEST_SRC_DIR := tst
22
23 # build configurations
24 # cover:
25 #   coverage reporting
26 #   for use with gcov
27 # debug:
28 #   unoptimized and maximally annotated
29 #   for use with gdb
30 # profile:
31 #   somewhat optimized and maximally annotated
32 #   for use with valgrind
33 # release:
34 #   optimized, without debugging instructions and minimally
35 #   annotated (mainly for stack traces)
36 #   for use with people
37 # tests:
38 #   same flags as release, but with main replaced by cppunit
39 #   test runner and tests (from tst dir) built in
40
41 COVER_FLAGS = -g -O0 --coverage -I$(SOURCE_DIR) $(TESTFLAGS)
42 DEBUG_FLAGS = -g3 -O0
43 PROFILE_FLAGS = -DNDEBUG -O1 -g3 -DBLANK_PROFILING
44 RELEASE_FLAGS = -DNDEBUG -O2 -g1
45 TEST_FLAGS = -g -O2 -I$(SOURCE_DIR) $(TESTFLAGS)
46
47 # destination
48 COVER_DIR := build/cover
49 DEBUG_DIR := build/debug
50 PROFILE_DIR := build/profile
51 RELEASE_DIR := build/release
52 TEST_DIR := build/test
53
54 DIR := $(RELEASE_DIR) $(COVER_DIR) $(DEBUG_DIR) $(PROFILE_DIR) $(TEST_DIR) build
55
56 ASSET_DIR := assets
57 ASSET_DEP := $(ASSET_DIR)/.git
58
59 LIB_SRC := $(wildcard $(SOURCE_DIR)/*/*.cpp)
60 BIN_SRC := $(wildcard $(SOURCE_DIR)/*.cpp)
61 SRC := $(LIB_SRC) $(BIN_SRC)
62 TEST_SRC := $(wildcard $(TEST_SRC_DIR)/*.cpp) $(wildcard $(TEST_SRC_DIR)/*/*.cpp)
63
64 COVER_OBJ := $(patsubst $(TEST_SRC_DIR)/%.cpp, $(COVER_DIR)/%.o, $(TEST_SRC)) $(patsubst $(SOURCE_DIR)/%.cpp, $(COVER_DIR)/src/%.o, $(LIB_SRC))
65 COVER_DEP := $(COVER_OBJ:.o=.d)
66 COVER_BIN := blank.cover
67
68 DEBUG_OBJ := $(patsubst $(SOURCE_DIR)/%.cpp, $(DEBUG_DIR)/%.o, $(SRC))
69 DEBUG_LIB_OBJ := $(patsubst $(SOURCE_DIR)/%.cpp, $(DEBUG_DIR)/%.o, $(LIB_SRC))
70 DEBUG_DEP := $(DEBUG_OBJ:.o=.d)
71 DEBUG_BIN := blank.debug
72
73 PROFILE_OBJ := $(patsubst $(SOURCE_DIR)/%.cpp, $(PROFILE_DIR)/%.o, $(SRC))
74 PROFILE_LIB_OBJ := $(patsubst $(SOURCE_DIR)/%.cpp, $(PROFILE_DIR)/%.o, $(LIB_SRC))
75 PROFILE_DEP := $(PROFILE_OBJ:.o=.d)
76 PROFILE_BIN := blank.profile generate.profile
77
78 RELEASE_OBJ := $(patsubst $(SOURCE_DIR)/%.cpp, $(RELEASE_DIR)/%.o, $(SRC))
79 RELEASE_LIB_OBJ := $(patsubst $(SOURCE_DIR)/%.cpp, $(RELEASE_DIR)/%.o, $(LIB_SRC))
80 RELEASE_DEP := $(RELEASE_OBJ:.o=.d)
81 RELEASE_BIN := blank
82
83 TEST_OBJ := $(patsubst $(TEST_SRC_DIR)/%.cpp, $(TEST_DIR)/%.o, $(TEST_SRC)) $(patsubst $(SOURCE_DIR)/%.cpp, $(TEST_DIR)/src/%.o, $(LIB_SRC))
84 TEST_DEP := $(TEST_OBJ:.o=.d)
85 TEST_BIN := blank.test
86
87 OBJ := $(COVER_OBJ) $(DEBUG_OBJ) $(PROFILE_OBJ) $(RELEASE_OBJ) $(TEST_OBJ)
88 DEP := $(COVER_DEP) $(DEBUG_DEP) $(PROFILE_DEP) $(RELEASE_DEP) $(TEST_DEP)
89 BIN := $(COVER_BIN) $(DEBUG_BIN) $(PROFILE_BIN) $(RELEASE_BIN) $(TEST_BIN)
90
91 release: $(RELEASE_BIN)
92
93 info:
94         @echo "CXX:  $(CXX)"
95         @echo "LDXX: $(LDXX)"
96         @echo
97         @echo "LIBS: $(LIBS)"
98         @echo
99         @echo "CPPFLAGS:  $(CPPFLAGS)"
100         @echo "CXXFLAGS:  $(CXXFLAGS)"
101         @echo "LDXXFLAGS: $(LDXXFLAGS)"
102         @echo "TESTFLAGS: $(TESTFLAGS)"
103         @echo "TESTLIBS:  $(TESTLIBS)"
104         @echo
105         @-lsb_release -a
106         @git --version
107         @g++ --version
108
109 all: $(BIN)
110
111 cover: $(COVER_BIN)
112
113 debug: $(DEBUG_BIN)
114
115 profile: $(PROFILE_BIN)
116
117 tests: $(TEST_BIN)
118
119 run: $(ASSET_DEP) blank
120         ./blank --save-path saves/
121
122 server: $(ASSET_DEP) blank
123         ./blank --server --save-path saves/
124
125 client: $(ASSET_DEP) blank
126         ./blank --client --save-path saves/
127
128 gdb: $(ASSET_DEP) blank.debug
129         gdb ./blank.debug
130
131 cachegrind: $(ASSET_DEP) blank.profile
132         valgrind ./blank.profile --save-path saves/
133
134 callgrind: $(ASSET_DEP) blank.profile
135         valgrind --tool=callgrind \
136                 --collect-atstart=no --toggle-collect="blank::Runtime::RunStandalone()" \
137                 --branch-sim=yes --cacheuse=yes --cache-sim=yes \
138                 --collect-bus=yes --collect-systime=yes --collect-jumps=yes \
139                 --dump-instr=yes --simulate-hwpref=yes --simulate-wb=yes \
140                 ./blank.profile -n 256 -t 16 --no-keyboard --no-mouse -d --no-vsync --save-path saves/
141
142 test: blank.test
143         @echo run: blank.test
144         @./blank.test
145
146 coverage: blank.cover
147         @echo run: blank.cover
148         @./blank.cover
149
150 codecov: coverage
151         @echo run: codecov.io
152         @bash -c 'bash <(curl -s https://codecov.io/bash) -Z'
153
154 clean:
155         rm -f $(OBJ)
156         rm -f $(DEP)
157         find build -type d -empty -delete
158
159 distclean: clean
160         rm -f $(BIN) cachegrind.out.* callgrind.out.*
161         rm -Rf build client-saves saves
162
163 .PHONY: all release cover debug profile tests run gdb cachegrind callgrind test coverage codecov clean distclean
164
165 -include $(DEP)
166
167
168 $(COVER_BIN): $(COVER_OBJ)
169         @echo link: $@
170         @$(LDXX) $(CXXFLAGS) $^ -o $@ $(LDXXFLAGS) $(TESTLIBS) $(COVER_FLAGS)
171
172 $(COVER_DIR)/%.o: $(TEST_SRC_DIR)/%.cpp | $(COVER_DIR)
173         @mkdir -p "$(@D)"
174         @echo compile: $@
175         @$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(COVER_FLAGS) -o $@ -MMD -MP -MF"$(@:.o=.d)" -MT"$@" $<
176
177 $(COVER_DIR)/src/%.o: $(SOURCE_DIR)/%.cpp | $(COVER_DIR)
178         @mkdir -p "$(@D)"
179         @echo compile: $@
180         @$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(COVER_FLAGS) -o $@ -MMD -MP -MF"$(@:.o=.d)" -MT"$@" $<
181
182
183 $(DEBUG_BIN): %.debug: $(DEBUG_DIR)/%.o $(DEBUG_LIB_OBJ)
184         @echo link: $@
185         @$(LDXX) $(CXXFLAGS) $^ -o $@ $(LDXXFLAGS) $(DEBUG_FLAGS)
186
187 $(DEBUG_DIR)/%.o: $(SOURCE_DIR)/%.cpp | $(DEBUG_DIR)
188         @mkdir -p "$(@D)"
189         @echo compile: $@
190         @$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(DEBUG_FLAGS) -o $@ -MMD -MP -MF"$(@:.o=.d)" -MT"$@" $<
191
192
193 $(PROFILE_BIN): %.profile: $(PROFILE_DIR)/%.o $(PROFILE_LIB_OBJ)
194         @echo link: $@
195         @$(LDXX) $(CXXFLAGS) $^ -o $@ $(LDXXFLAGS) $(PROFILE_FLAGS)
196
197 $(PROFILE_DIR)/%.o: $(SOURCE_DIR)/%.cpp | $(PROFILE_DIR)
198         @mkdir -p "$(@D)"
199         @echo compile: $@
200         @$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(PROFILE_FLAGS) -o $@ -MMD -MP -MF"$(@:.o=.d)" -MT"$@" $<
201
202
203 $(RELEASE_BIN): %: $(RELEASE_DIR)/%.o $(RELEASE_LIB_OBJ)
204         @echo link: $@
205         @$(LDXX) $(CXXFLAGS) $^ -o $@ $(LDXXFLAGS) $(RELEASE_FLAGS)
206
207 $(RELEASE_DIR)/%.o: $(SOURCE_DIR)/%.cpp | $(RELEASE_DIR)
208         @mkdir -p "$(@D)"
209         @echo compile: $@
210         @$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(RELEASE_FLAGS) -o $@ -MMD -MP -MF"$(@:.o=.d)" -MT"$@" $<
211
212
213 $(TEST_BIN): $(TEST_OBJ)
214         @echo link: $@
215         @$(LDXX) $(CXXFLAGS) $^ -o $@ $(LDXXFLAGS) $(TESTLIBS) $(TEST_FLAGS)
216
217 $(TEST_DIR)/%.o: $(TEST_SRC_DIR)/%.cpp | $(TEST_DIR)
218         @mkdir -p "$(@D)"
219         @echo compile: $@
220         @$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(TEST_FLAGS) -o $@ -MMD -MP -MF"$(@:.o=.d)" -MT"$@" $<
221
222 $(TEST_DIR)/src/%.o: $(SOURCE_DIR)/%.cpp | $(TEST_DIR)
223         @mkdir -p "$(@D)"
224         @echo compile: $@
225         @$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(TEST_FLAGS) -o $@ -MMD -MP -MF"$(@:.o=.d)" -MT"$@" $<
226
227
228 $(ASSET_DEP): .git/$(shell git symbolic-ref HEAD 2>/dev/null || echo .git/HEAD)
229         @echo fetch: assets
230         @git submodule update --init >/dev/null
231         @touch $@
232
233 $(DIR):
234         @mkdir -p "$@"