~z-man/armagetronad/0.4-build_eclipse-unified

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# automatically generate configuration files from templates
%: %.template
	touch autoclean
	test -r $@ || cp $< $@
	touch $@
sinclude make.config

# the directory inside the AA source we use to make the debug config, make targets and binaries known
ECLIPSEBUILD=EclipseBuild
INTRUDER=$(AAPATH)/$(ECLIPSEBUILD)

make.config: preconfig sysprofile/profile.config
	test -r $@ || cp make.config.template $@ && ./findsource
	
# register this build in the intruding directory ( so the .global make targets work )
register: $(INTRUDER)/tag
	$(MAKE) unregister
	echo $$(pwd) >> $(INTRUDER)/register
	touch $@

unregister: $(INTRUDER)/tag
	touch $(INTRUDER)/register
	mv $(INTRUDER)/register $(INTRUDER)/register.old
	grep -v "^$$(pwd)$$" < $(INTRUDER)/register.old > $(INTRUDER)/register || true
	rm -f register

$(INTRUDER)/tag:
	# create top level directories inside main project
	test -d $(INTRUDER) || mkdir $(INTRUDER)
	touch $@

# global make targets
%.global: register
	for build in $$(cat $(INTRUDER)/register); do $(MAKE) -C $$build "$*"; done

# combined make targets
client: client_optimize client_debug
server: server_optimize server_debug
optimize: client_optimize server_optimize
debug: client_debug server_debug
all: client server

# just make configuration files and exit
initialize: make.config
	echo "Configuration files created."

# automatically clean project if configuration changed
# uncomment autoclean include in make.config to activate ( note: can be annoying )
autoclean: preconfig make.config Makefile configure confmake $(AAPATH)/configure $(AAPATH)/Makefile.am
	touch autoclean
	make clean

$(AAPATH)/configure: $(AAPATH)/configure.*
	cd $(AAPATH); sh ./bootstrap.sh

$(AAPATH)/config.h.in: $(AAPATH)/configure

# standard targets
clean:
	# delete contents of build, but keep varfiles
	for f in build/*; do if test -d $$f/var; then mv $$f/var varback; rm -rf $$f/* $$f/.cvsfiles; mv varback $$f/var; else rm -rf $$f; fi; done
	# done

distclean: unregister
	# remove everything
	rm -rf build
	rm -f autoclean make.config preconfig sysprofile/profile.config
	rm -rf 

# selects this build as the default build
select: $(INTRUDER)
	# install redirection
	TARGET="$$(pwd)"; cd $(INTRUDER) && echo "$$TARGET" > redirect

	# create lower level directories
	for DIR in maketargets maketargets/*; do \
		test -d $(INTRUDER)/$$DIR || mkdir $(INTRUDER)/$$DIR; \
	done
	rm -rf $(INTRUDER)/maketargets/CVS

	# link output directories
	for TYPE in client server; do\
		for BUILD in optimize debug; do\
			ln -sf $$(pwd)/build/$${TYPE}_$${BUILD} $(INTRUDER)/;\
		done;\
	done

	# link debug configurations
	for TYPE in Client Server; do\
		ln -sf $$(pwd)/intruder/Debug_$$TYPE.launch.template $(INTRUDER)/Debug_$$TYPE.launch;\
	done

	# link make wrapper and make it executable
	ln -sf $$(pwd)/intruder/makewrapper $(INTRUDER)/
	chmod 755 intruder/makewrapper

	# install fake makefile
	ln -sf $$(pwd)/intruder/Makefile $(INTRUDER)/

	# write protect textures, models and sounds
	#for DIR in models textures sound; do\
	#	chmod 555 $(AAPATH)/$$DIR/CVS;\
	#	chmod 555 $(AAPATH)/$$DIR;\
	#done

	echo -e "\nBuild configuration has been selected as the default.\nDon't forget to refresh the AA project!\n"

# all targets should be remade every time
# .PHONY: client_optimize server_optimize client_debug server_debug

# optimizing: just like it is built in releases
client_optimize: register $(AAPATH)/configure
	AAPATH=$(AAPATH) CXX="${CXX}" MAKEFLAGS="${MAKEFLAGS}" MAKE=$(MAKE) DEBUGLEVEL=0 CODELEVEL=$(CODELEVEL) CXXFLAGS="$(CXXFLAGS_OPTIMIZE) $(CXXFLAGS_CLIENT) $(CXXFLAGS_CLIENT_OPTIMIZE)" bash ./confmake $@

server_optimize: register $(AAPATH)/configure
	AAPATH=$(AAPATH) CXX="${CXX}" MAKEFLAGS="${MAKEFLAGS}" MAKE=$(MAKE) DEBUGLEVEL=0 CODELEVEL=$(CODELEVEL) CXXFLAGS="$(CXXFLAGS_OPTIMIZE)  $(CXXFLAGS_SERVER) $(CXXFLAGS_SERVER_OPTIMIZE)" bash ./confmake $@ --disable-glout

# debug: enables extra checks and debug information
client_debug: register $(AAPATH)/configure
	AAPATH=$(AAPATH) CXX="${CXX}" MAKEFLAGS="${MAKEFLAGS}" MAKE=$(MAKE) DEBUGLEVEL=$(DEBUGLEVEL) CODELEVEL=$(CODELEVEL) CXXFLAGS="$(CXXFLAGS_DEBUG) $(CXXFLAGS_CLIENT) $(CXXFLAGS_CLIENT_DEBUG)" bash ./confmake $@

server_debug: register $(AAPATH)/configure
	AAPATH=$(AAPATH) CXX="${CXX}" MAKEFLAGS="${MAKEFLAGS}" MAKE=$(MAKE) DEBUGLEVEL=$(DEBUGLEVEL) CODELEVEL=$(CODELEVEL) CXXFLAGS="$(CXXFLAGS_DEBUG) $(CXXFLAGS_SERVER) $(CXXFLAGS_SERVER_DEBUG)" bash ./confmake $@ --disable-glout

# for valgrind validation: light debug settings
client_valgrind: register $(AAPATH)/configure
	AAPATH=$(AAPATH) MAKE=$(MAKE) DEBUGLEVEL=1 CODELEVEL=$(CODELEVEL) CXX="${CXX}" CXXFLAGS="$(CXXFLAGS_OPTIMIZE) $(CXXFLAGS_CLIENT) $(CXXFLAGS_CLIENT_OPTIMIZE)" bash ./confmake $@

server_valgrind: register $(AAPATH)/configure
	AAPATH=$(AAPATH) MAKE=$(MAKE) DEBUGLEVEL=1 CODELEVEL=$(CODELEVEL) CXX="${CXX}" CXXFLAGS="$(CXXFLAGS_OPTIMIZE)  $(CXXFLAGS_SERVER) $(CXXFLAGS_SERVER_OPTIMIZE)" bash ./confmake $@ --disable-glout

# for bugs in optimized mode that are not found in debug or valgrind builds: optimized with debug symbols. Hard to debug, only for emergencies.
client_optimizedebug: register $(AAPATH)/configure
	AAPATH=$(AAPATH) MAKE=$(MAKE) DEBUGLEVEL=0 CODELEVEL=$(CODELEVEL) CXXFLAGS="$(CXXFLAGS_OPTIMIZE) $(CXXFLAGS_CLIENT) $(CXXFLAGS_CLIENT_OPTIMIZE) -g" bash ./confmake $@

server_optimizedebug: register $(AAPATH)/configure
	AAPATH=$(AAPATH) MAKE=$(MAKE) DEBUGLEVEL=0 CODELEVEL=$(CODELEVEL) CXX="${CXX}" CXXFLAGS="$(CXXFLAGS_OPTIMIZE)  $(CXXFLAGS_SERVER) $(CXXFLAGS_SERVER_OPTIMIZE) -g" bash ./confmake $@ --disable-glout

# for profiling with gprof.
client_profile: register $(AAPATH)/configure
	AAPATH=$(AAPATH) MAKE=$(MAKE) DEBUGLEVEL=0 CODELEVEL=$(CODELEVEL) CXX="${CXX}" CXXFLAGS="$(CXXFLAGS_OPTIMIZE) $(CXXFLAGS_CLIENT) $(CXXFLAGS_CLIENT_OPTIMIZE) -g -pg -fno-inline-functions -fno-default-inline" bash ./confmake $@

server_profile: register $(AAPATH)/configure
	AAPATH=$(AAPATH) MAKE=$(MAKE) DEBUGLEVEL=0 CODELEVEL=$(CODELEVEL) CXX="${CXX}" CXXFLAGS="$(CXXFLAGS_OPTIMIZE)  $(CXXFLAGS_SERVER) $(CXXFLAGS_SERVER_OPTIMIZE) -g -pg" bash ./confmake $@ --disable-glout

# for profiling with gprof. Optimized, but without inline functions so a full callgraph can be generated
client_deepprofile: register $(AAPATH)/configure
	AAPATH=$(AAPATH) MAKE=$(MAKE) DEBUGLEVEL=0 CODELEVEL=$(CODELEVEL) CXX="${CXX}" CXXFLAGS="$(CXXFLAGS_OPTIMIZE) $(CXXFLAGS_CLIENT) $(CXXFLAGS_CLIENT_OPTIMIZE) -g -pg" bash ./confmake $@

server_deepprofile: register $(AAPATH)/configure
	AAPATH=$(AAPATH) MAKE=$(MAKE) DEBUGLEVEL=0 CODELEVEL=$(CODELEVEL) CXX="${CXX}" CXXFLAGS="$(CXXFLAGS_OPTIMIZE)  $(CXXFLAGS_SERVER) $(CXXFLAGS_SERVER_OPTIMIZE) -g -pg -fno-inline-functions -fno-default-inline" bash ./confmake $@ --disable-glout


beautify: $(AAPATH)/configure
	AAPATH=$(AAPATH) CXX="${CXX}" MAKEFLAGS="${MAKEFLAGS}" MAKE=$(MAKE) DEBUGLEVEL=$(DEBUGLEVEL) CODELEVEL=$(CODELEVEL) CXXFLAGS="$(CXXFLAGS_OPTIMIZE) $(CXXFLAGS_SERVER) $(CXXFLAGS_SERVER_OPTIMIZE)" bash ./configure server --disable-glout
	$(MAKE) -C build/server rebeautify 

# run checks before committing to SCM
devcheck_single.%: %
	$(MAKE) -C build/$* devcheck
devcheck: devcheck_single.client_debug devcheck_single.client_optimize devcheck_single.server_debug devcheck_single.server_optimize

# tests distribution
distcheck_fake_single.%: %
	ARMAGETRONAD_FAKERELEASE=true $(MAKE) -C build/$* distcheck
distcheck_single.%: %
	$(MAKE) -C build/$* distcheck
distcheck_fake: distcheck_fake_single.client_debug distcheck_fake_single.server_debug
distcheck: distcheck_single.client_debug
distcheck_full: distcheck_single.client_debug distcheck_single.server_debug distcheck_single.client_optimize distcheck_single.server_optimize

fullcheck: devcheck distcheck_full

nothing:
	@echo nothing to do.