build.sh 20.6 KB
Newer Older
Oliver Bock's avatar
Oliver Bock committed
1
#!/bin/bash
Oliver Bock's avatar
Oliver Bock committed
2

Oliver Bock's avatar
Oliver Bock committed
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
###########################################################################
#   Copyright (C) 2008 by Oliver Bock                                     #
#   oliver.bock[AT]aei.mpg.de                                             #
#                                                                         #
#   This file is part of Einstein@Home.                                   #
#                                                                         #
#   Einstein@Home is free software: you can redistribute it and/or modify #
#   it under the terms of the GNU General Public License as published     #
#   by the Free Software Foundation, version 2 of the License.            #
#                                                                         #
#   Einstein@Home is distributed in the hope that it will be useful,      #
#   but WITHOUT ANY WARRANTY; without even the implied warranty of        #
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the          #
#   GNU General Public License for more details.                          #
#                                                                         #
#   You should have received a copy of the GNU General Public License     #
#   along with Einstein@Home. If not, see <http://www.gnu.org/licenses/>. #
#                                                                         #
###########################################################################

### TODOs #################################################################

# more refactoring (every lib in dedicated function? per traget?)

Oliver Bock's avatar
Oliver Bock committed
27
28
29
### globals ###############################################################

ROOT=`pwd`
30
31
PATH_ORG="$PATH"
PATH_MINGW="$PATH"
32
LOGFILE=$ROOT/build.log
Oliver Bock's avatar
Oliver Bock committed
33
34
TARGET=0

Oliver Bock's avatar
Oliver Bock committed
35
### functions #############################################################
Oliver Bock's avatar
Oliver Bock committed
36

Oliver Bock's avatar
Oliver Bock committed
37
38
failure()
{
39
40
41
	echo "************************************" | tee -a $LOGFILE
	echo "Error detected! Stopping build!" | tee -a $LOGFILE
	echo "`date`" | tee -a $LOGFILE
Oliver Bock's avatar
Oliver Bock committed
42
43
44
45
46
47

    if [ -f "$LOGFILE" ]; then
		echo "------------------------------------"
		echo "Please check logfile: `basename $LOGFILE`"
		echo "These are the final ten lines:"
		echo "------------------------------------"
Oliver Bock's avatar
Oliver Bock committed
48
		tail -n 14 $LOGFILE | head -n 10
Oliver Bock's avatar
Oliver Bock committed
49
50
51
52
53
54
55
    fi

	echo "************************************" | tee -a $LOGFILE

    exit 1
}

Oliver Bock's avatar
Oliver Bock committed
56
57
check_prerequisites()
{
58
	echo "Checking prerequisites..." | tee -a $LOGFILE
Oliver Bock's avatar
Oliver Bock committed
59
60
	
	# required toolchain
61
	TOOLS="automake autoconf m4 cmake wget svn cvs tar gcc g++ ld libtool ar lex yacc"
Oliver Bock's avatar
Oliver Bock committed
62
63
64

	for tool in $TOOLS; do
		if ! ( type $tool >/dev/null 2>&1 ); then
65
			echo "Missing \"$tool\" which is a required tool!" | tee -a $LOGFILE
Oliver Bock's avatar
Oliver Bock committed
66
67
68
69
70
			return 1
		fi
	done

	return 0
Oliver Bock's avatar
Oliver Bock committed
71
72
73
}


74
prepare_source_tree()
Oliver Bock's avatar
Oliver Bock committed
75
{
Oliver Bock's avatar
Oliver Bock committed
76
	echo "Preparing source tree..." | tee -a $LOGFILE
77
78
79
80
81
82
83
84
85
	mkdir -p 3rdparty/oglft >> $LOGFILE || failure
	mkdir -p 3rdparty/boinc >> $LOGFILE || failure

	return 0
}


prepare_build_tree()
{
Oliver Bock's avatar
Oliver Bock committed
86
	echo "Preparing build tree..." | tee -a $LOGFILE
87
88
89
90
91
92
93
94
95
96
97
98
99
100
	mkdir -p build/sdl >> $LOGFILE || failure
	mkdir -p build/freetype2 >> $LOGFILE || failure
	mkdir -p build/oglft >> $LOGFILE || failure
	mkdir -p build/boinc >> $LOGFILE || failure
	mkdir -p build/framework >> $LOGFILE || failure
	mkdir -p build/orc >> $LOGFILE || failure
	mkdir -p build/starsphere >> $LOGFILE || failure

	return 0
}


prepare_install_tree()
{
Oliver Bock's avatar
Oliver Bock committed
101
	echo "Preparing install tree..." | tee -a $LOGFILE
102
103
104
105
106
107
108
109
110
111
112
113
114
115
	mkdir -p install/bin >> $LOGFILE || failure
	mkdir -p install/include >> $LOGFILE || failure
	mkdir -p install/lib >> $LOGFILE || failure

	return 0
}


prepare_generic()
{
	prepare_source_tree || failure
	prepare_build_tree || failure
	prepare_install_tree || failure

Oliver Bock's avatar
Oliver Bock committed
116
	# prepare additional sources
117
118
119
120

	cd $ROOT || failure
	mkdir -p 3rdparty/sdl >> $LOGFILE 2>&1 || failure
	cd $ROOT/3rdparty/sdl || failure
Oliver Bock's avatar
Oliver Bock committed
121
	if [ -d .svn ]; then
122
123
124
125
		echo "Updating SDL..." | tee -a $LOGFIL
		# make sure local changes (patches) are reverted, hence also updated
		svn revert -R . >> $LOGFILE 2>&1 || failure
		svn update >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
126
	else
Oliver Bock's avatar
Oliver Bock committed
127
		echo "Retrieving SDL (this may take a while)..." | tee -a $LOGFILE
128
		svn checkout http://svn.libsdl.org/branches/SDL-1.2 . >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
129
130
	fi
	
Oliver Bock's avatar
Oliver Bock committed
131
	echo "Retrieving Freetype2 (this may take a while)..." | tee -a $LOGFILE
132
	cd $ROOT/3rdparty || failure
133
134
135
136
137
138
	wget http://mesh.dl.sourceforge.net/sourceforge/freetype/freetype-2.3.5.tar.bz2 >> $LOGFILE 2>&1 || failure
	tar -xjf freetype-2.3.5.tar.bz2 >> $LOGFILE 2>&1 || failure
	rm freetype-2.3.5.tar.bz2 >> $LOGFILE 2>&1 || failure
	# substitute old source tree
	rm -rf freetype2 >> $LOGFILE 2>&1 || failure
	mv freetype-2.3.5 freetype2 >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
139
	
140
	cd $ROOT/3rdparty/oglft || failure
Oliver Bock's avatar
Oliver Bock committed
141
	if [ -d .svn ]; then
Oliver Bock's avatar
Oliver Bock committed
142
		echo "Updating OGLFT..." | tee -a $LOGFILE
143
144
145
		# make sure local changes (patches) are reverted, hence also updated
		svn revert -R . >> $LOGFILE  2>&1 || failure
		svn update >> $LOGFILE  2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
146
	else
Oliver Bock's avatar
Oliver Bock committed
147
		echo "Retrieving OGLFT (this may take a while)..." | tee -a $LOGFILE
Oliver Bock's avatar
Oliver Bock committed
148
		svn checkout http://oglft.svn.sourceforge.net/svnroot/oglft/trunk . >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
149
150
	fi
	
151
	cd $ROOT/3rdparty/boinc || failure
Oliver Bock's avatar
Oliver Bock committed
152
	if [ -d .svn ]; then
Oliver Bock's avatar
Oliver Bock committed
153
		echo "Updating BOINC..." | tee -a $LOGFILE
154
155
156
		# make sure local changes (patches) are reverted, hence also updated
		svn revert -R . >> $LOGFILE  2>&1 || failure
		svn update >> $LOGFILE  2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
157
	else
Oliver Bock's avatar
Oliver Bock committed
158
		echo "Retrieving BOINC (this may take a while)..." | tee -a $LOGFILE
159
		svn checkout http://boinc.berkeley.edu/svn/branches/boinc_core_release_6_2 . >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
160
	fi
Oliver Bock's avatar
Oliver Bock committed
161
162

	return 0
Oliver Bock's avatar
Oliver Bock committed
163
164
165
166
167
}


prepare_win32()
{
168
	cd $ROOT || failure
Oliver Bock's avatar
Oliver Bock committed
169

Oliver Bock's avatar
Oliver Bock committed
170
	echo "Preparing MinGW source tree..." | tee -a $LOGFILE
171
172
	mkdir -p 3rdparty/mingw/xscripts >> $LOGFILE || failure
	cd 3rdparty/mingw/xscripts || failure
Oliver Bock's avatar
Oliver Bock committed
173
174

	if [ -d CVS ]; then
Oliver Bock's avatar
Oliver Bock committed
175
		echo "Updating MinGW build script..." | tee -a $LOGFILE
176
		cvs update -C >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
177
	else
178
		cd .. || failure
Oliver Bock's avatar
Oliver Bock committed
179
		echo "Retrieving MinGW build script (this may take a while)..." | tee -a $LOGFILE
180
		cvs -z3 -d:pserver:anonymous@mingw.cvs.sourceforge.net:/cvsroot/mingw checkout -P xscripts >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
181
182
	fi
	
Oliver Bock's avatar
Oliver Bock committed
183
	echo "Preparing MinGW build script..." | tee -a $LOGFILE
184
	cd $ROOT/3rdparty/mingw/xscripts || failure
Oliver Bock's avatar
Oliver Bock committed
185
	# note: svn has no force/overwrite switch. the file might not be updated when patched
186
187
	patch x86-mingw32-build.sh.conf < $ROOT/patches/x86-mingw32-build.sh.conf.patch >> $LOGFILE || failure
	chmod +x x86-mingw32-build.sh >> $LOGFILE || failure
Oliver Bock's avatar
Oliver Bock committed
188
189

	return 0
Oliver Bock's avatar
Oliver Bock committed
190
191
192
193
194
}


build_generic()
{
Oliver Bock's avatar
Oliver Bock committed
195
	echo "Building SDL (this may take a while)..." | tee -a $LOGFILE
196
	cd $ROOT/3rdparty/sdl || failure
197
198
	./autogen.sh >> $LOGFILE 2>&1 || failure
	cd $ROOT/build/sdl || failure
Oliver Bock's avatar
Oliver Bock committed
199
200
201
202
203
	if [ "$1" == "$TARGET_MAC" ]; then
		$ROOT/3rdparty/sdl/configure --prefix=$ROOT/install --enable-shared=no --enable-static=yes --enable-video-x11=no >> $LOGFILE 2>&1 || failure
	else
		$ROOT/3rdparty/sdl/configure --prefix=$ROOT/install --enable-shared=no --enable-static=yes >> $LOGFILE 2>&1 || failure	
	fi
204
205
	make >> $LOGFILE 2>&1 || failure
	make install >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
206
	echo "Successfully built and installed SDL!" | tee -a $LOGFILE
Oliver Bock's avatar
Oliver Bock committed
207

Oliver Bock's avatar
Oliver Bock committed
208
	echo "Building Freetype2 (this may take a while)..." | tee -a $LOGFILE
209
	cd $ROOT/3rdparty/freetype2 || failure
210
211
212
213
	chmod +x autogen.sh >> $LOGFILE 2>&1 || failure
	chmod +x configure >> $LOGFILE 2>&1 || failure
	./autogen.sh >> $LOGFILE 2>&1 || failure
	cd $ROOT/build/freetype2 || failure
Oliver Bock's avatar
Oliver Bock committed
214
	# note: freetype (or sdl?) probably doesn't need *no* configure when static -> ansi build, see readme!
215
216
217
	$ROOT/3rdparty/freetype2/configure --prefix=$ROOT/install --enable-shared=no --enable-static=yes >> $LOGFILE 2>&1 || failure
	make >> $LOGFILE 2>&1 || failure
	make install >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
218
	echo "Successfully built and installed Freetype2!" | tee -a $LOGFILE
Oliver Bock's avatar
Oliver Bock committed
219

Oliver Bock's avatar
Oliver Bock committed
220
	echo "Patching OGLFT..." | tee -a $LOGFILE
221
	cd $ROOT/3rdparty/oglft || failure
Oliver Bock's avatar
Oliver Bock committed
222
223
224
	# note: svn has no force/overwrite switch. patched files might not be updated
	# patch: use fixed settings for freetype, deactivate FindFreetype
	FREETYPE2_INCLUDE_DIR="$ROOT/install/include"
225
	FREETYPE2_LIBRARIES="$ROOT/install/lib/libfreetype.a"
226
	patch CMakeLists.txt < $ROOT/patches/CMakeLists.txt.oglft.patch >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
227
	# patch: build static lib instead of shared
228
229
	cd $ROOT/3rdparty/oglft/liboglft || failure
	patch CMakeLists.txt < $ROOT/patches/CMakeLists.txt.liboglft.patch >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
230
	echo "Building OGLFT..." | tee -a $LOGFILE
231
	cd $ROOT/build/oglft || failure
232
	# TODO: do we wanna create universal binaries on mac? If so, add -DCMAKE_OSX_ARCHITECTURES=ppc;i386
233
234
235
236
237
	cmake -DFREETYPE2_INCLUDE_DIR="$FREETYPE2_INCLUDE_DIR" -DFREETYPE2_LIBRARIES="$FREETYPE2_LIBRARIES" $ROOT/3rdparty/oglft >> $LOGFILE 2>&1 || failure
	make >> $LOGFILE 2>&1 || failure
	mkdir -p $ROOT/install/include/oglft >> $LOGFILE 2>&1 || failure
	cp OGLFT.h $ROOT/install/include/oglft >> $LOGFILE 2>&1 || failure
	cp liboglft/liboglft.a $ROOT/install/lib >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
238
	echo "Successfully built and installed OGLFT!" | tee -a $LOGFILE
Oliver Bock's avatar
Oliver Bock committed
239

Oliver Bock's avatar
Oliver Bock committed
240
	echo "Building BOINC (this may take a while)..." | tee -a $LOGFILE
241
	cd $ROOT/3rdparty/boinc || failure
242
243
244
245
246
	./_autosetup >> $LOGFILE 2>&1 || failure
	cd $ROOT/build/boinc || failure
	$ROOT/3rdparty/boinc/configure --prefix=$ROOT/install --enable-shared=no --enable-static=yes --disable-server --disable-client >> $LOGFILE 2>&1 || failure
	make >> $LOGFILE 2>&1 || failure
	make install >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
247
	echo "Successfully built and installed BOINC!" | tee -a $LOGFILE
Oliver Bock's avatar
Oliver Bock committed
248
249

	return 0
Oliver Bock's avatar
Oliver Bock committed
250
251
}

Oliver Bock's avatar
Oliver Bock committed
252

253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
build_generic_win32()
{
	# general config
	PREFIX=$ROOT/install
	TARGET_HOST=i586-pc-mingw32
	BUILD_HOST=i386-linux
	PATH_MINGW="$PREFIX/bin:$PREFIX/$TARGET_HOST/bin:$PATH"
	PATH="$PATH_MINGW"
	export PATH

	echo "Building SDL (this may take a while)..." | tee -a $LOGFILE
	cd $ROOT/3rdparty/sdl || failure
	./autogen.sh >> $LOGFILE 2>&1 || failure
	if [ -f "$PREFIX/$TARGET_HOST/bin/$TARGET_HOST-sdl-config" ]; then
		SDL_CONFIG="$PREFIX/$TARGET_HOST/bin/$TARGET_HOST-sdl-config"
		export SDL_CONFIG
		echo "Cross-compile SDL_CONFIG: $SDL_CONFIG" >> $LOGFILE
	fi
	cd $ROOT/build/sdl || failure
	$ROOT/3rdparty/sdl/configure --host=$TARGET_HOST --build=$BUILD_HOST --prefix=$PREFIX --enable-shared=no --enable-static=yes >> $LOGFILE 2>&1 || failure
	make >> $LOGFILE 2>&1 || failure
	make install >> $LOGFILE 2>&1 || failure
	echo "Successfully built and installed SDL!" | tee -a $LOGFILE

	echo "Patching Freetype2..." | tee -a $LOGFILE
	cd $ROOT/3rdparty/freetype2/builds || failure
	# patch: deactivating invocation of apinames (would run win32 binary on linux host)
	patch < $ROOT/patches/freetype2.exports.mk.patch >> $LOGFILE 2>&1 || failure
	echo "Building Freetype2 (this may take a while)..." | tee -a $LOGFILE
	cd $ROOT/3rdparty/freetype2 || failure
	chmod +x autogen.sh >> $LOGFILE 2>&1 || failure
	chmod +x configure >> $LOGFILE 2>&1 || failure
	./autogen.sh >> $LOGFILE 2>&1 || failure
	if [ -f "$PREFIX/$TARGET_HOST/bin/$TARGET_HOST-freetype-config" ]; then
		FT_CONFIG="$PREFIX/$TARGET_HOST/bin/$TARGET_HOST-freetype-config"
		export FT_CONFIG
		echo "Cross-compile FT_CONFIG: $FT_CONFIG" >> $LOGFILE
	fi
	cd $ROOT/build/freetype2 || failure
	# note: freetype (or sdl?) probably doesn't need *no* configure when static -> ansi build, see readme!
	$ROOT/3rdparty/freetype2/configure --host=$TARGET_HOST --build=$BUILD_HOST --prefix=$PREFIX --enable-shared=no --enable-static=yes >> $LOGFILE 2>&1 || failure
	make >> $LOGFILE 2>&1 || failure
	make install >> $LOGFILE 2>&1 || failure
	echo "Successfully built and installed Freetype2!" | tee -a $LOGFILE

	echo "Patching OGLFT..." | tee -a $LOGFILE
	cd $ROOT/3rdparty/oglft || failure
	# note: svn has no force/overwrite switch. patched files might not be updated
	# patch: use fixed settings for freetype, deactivate FindFreetype
	FREETYPE2_INCLUDE_DIR="$ROOT/install/include"
	FREETYPE2_LIBRARIES="$ROOT/install/lib/libfreetype.a"
	patch CMakeLists.txt < $ROOT/patches/CMakeLists.txt.oglft.patch >> $LOGFILE 2>&1 || failure
	# patch: build static lib instead of shared
	cd $ROOT/3rdparty/oglft/liboglft || failure
	patch CMakeLists.txt < $ROOT/patches/CMakeLists.txt.liboglft.patch >> $LOGFILE 2>&1 || failure
	cp $ROOT/patches/toolchain-linux-mingw.oglft.cmake $ROOT/build/oglft >> $LOGFILE 2>&1 || failure
	export OGLFT_INSTALL=$ROOT/install
	echo "Building OGLFT..." | tee -a $LOGFILE
	cd $ROOT/build/oglft || failure
	cmake -DCMAKE_TOOLCHAIN_FILE="toolchain-linux-mingw.oglft.cmake" -DFREETYPE2_INCLUDE_DIR="$FREETYPE2_INCLUDE_DIR" -DFREETYPE2_LIBRARIES="$FREETYPE2_LIBRARIES" $ROOT/3rdparty/oglft >> $LOGFILE 2>&1 || failure
	make >> $LOGFILE 2>&1 || failure
	mkdir -p $ROOT/install/include/oglft >> $LOGFILE 2>&1 || failure
	cp OGLFT.h $ROOT/install/include/oglft >> $LOGFILE 2>&1 || failure
	cp liboglft/liboglft.a $ROOT/install/lib >> $LOGFILE 2>&1 || failure
	echo "Successfully built and installed OGLFT!" | tee -a $LOGFILE

	echo "Patching BOINC..." | tee -a $LOGFILE
	cd $ROOT/3rdparty/boinc/lib || failure
	# patch: fix a couple of BOINC vs. MinGW issues
	patch boinc_win.h < $ROOT/patches/boinc.boinc_win.h.minggw.patch >> $LOGFILE 2>&1 || failure
	patch filesys.C < $ROOT/patches/boinc.filesys.C.mingw.patch >> $LOGFILE 2>&1 || failure
	# patch: add graphics2 and customize build path (see below)
	echo "Building BOINC (this may take a while)..." | tee -a $LOGFILE
	cd $ROOT/3rdparty/boinc || failure
	./_autosetup >> $LOGFILE 2>&1 || failure
	cd $ROOT/build/boinc || failure
Oliver Bock's avatar
Oliver Bock committed
329
	# note: configure is still required but we don't use the generated Makefile
330
331
332
333
334
335
336
337
	$ROOT/3rdparty/boinc/configure --host=$TARGET_HOST --build=$BUILD_HOST --prefix=$ROOT/install --includedir=$ROOT/install/include --oldincludedir=$ROOT/install/include --enable-shared=no --enable-static=yes --disable-server --disable-client >> $LOGFILE 2>&1 || failure
	cd $ROOT/build/boinc/api || failure
	cp $ROOT/3rdparty/boinc/api/Makefile.mingw . >> $LOGFILE 2>&1 || failure
	patch Makefile.mingw < $ROOT/patches/boinc.Makefile.mingw.patch >> $LOGFILE 2>&1 || failure
	export BOINC_SRC=$ROOT/3rdparty/boinc || failure
	cd $ROOT/build/boinc || failure
	make -f api/Makefile.mingw >> $LOGFILE 2>&1 || failure
	cp $ROOT/build/boinc/libboinc.a $ROOT/install/lib >> $LOGFILE 2>&1 || failure
338
339
340
341
342
343
344
345
346
347
348
349
350
	mkdir -p $ROOT/install/include/BOINC >> $LOGFILE 2>&1 || failure
	cp $ROOT/3rdparty/boinc/api/boinc_api.h $ROOT/install/include/BOINC >> $LOGFILE 2>&1 || failure
	cp $ROOT/3rdparty/boinc/api/graphics2.h $ROOT/install/include/BOINC >> $LOGFILE 2>&1 || failure
	cp $ROOT/3rdparty/boinc/lib/app_ipc.h $ROOT/install/include/BOINC >> $LOGFILE 2>&1 || failure
	cp $ROOT/3rdparty/boinc/lib/boinc_win.h $ROOT/install/include/BOINC >> $LOGFILE 2>&1 || failure
	cp $ROOT/3rdparty/boinc/lib/common_defs.h $ROOT/install/include/BOINC >> $LOGFILE 2>&1 || failure
	cp $ROOT/3rdparty/boinc/lib/hostinfo.h $ROOT/install/include/BOINC >> $LOGFILE 2>&1 || failure
	cp $ROOT/3rdparty/boinc/lib/proxy_info.h $ROOT/install/include/BOINC >> $LOGFILE 2>&1 || failure
	cp $ROOT/3rdparty/boinc/lib/prefs.h $ROOT/install/include/BOINC >> $LOGFILE 2>&1 || failure
	cp $ROOT/3rdparty/boinc/lib/miofile.h $ROOT/install/include/BOINC >> $LOGFILE 2>&1 || failure
	cp $ROOT/3rdparty/boinc/lib/mfile.h $ROOT/install/include/BOINC >> $LOGFILE 2>&1 || failure
	cp $ROOT/3rdparty/boinc/lib/parse.h $ROOT/install/include/BOINC >> $LOGFILE 2>&1 || failure
	cp $ROOT/3rdparty/boinc/lib/util.h $ROOT/install/include/BOINC >> $LOGFILE 2>&1 || failure
351
352
353
354
	echo "Successfully built and installed BOINC!" | tee -a $LOGFILE
}


Oliver Bock's avatar
Oliver Bock committed
355
356
build_mingw()
{
357
358
359
360
361
362
	TARGET_HOST=i586-pc-mingw32

	echo "Building MinGW (this will take quite a while)..." | tee -a $LOGFILE
	# note: the script's current config for unattended setup expects it to be run from three levels below root!
	cd $ROOT/3rdparty/mingw/xscripts || failure
	./x86-mingw32-build.sh --unattended $TARGET_HOST >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
363
364

	return 0
Oliver Bock's avatar
Oliver Bock committed
365
366
}

Oliver Bock's avatar
Oliver Bock committed
367

Oliver Bock's avatar
Oliver Bock committed
368
369
build_starsphere()
{
370
371
372
	# make sure ORC is always compiled for host platform (it's exexuted during starsphere build!)
	export PATH=$PATH_ORG

Oliver Bock's avatar
Oliver Bock committed
373
	echo "Building Starsphere [ORC]..." | tee -a $LOGFILE
374
375
376
377
378
379
	export ORC_SRC=$ROOT/src/orc || failure
	export ORC_INSTALL=$ROOT/install || failure
	cd $ROOT/build/orc || failure
	cp $ROOT/src/orc/Makefile . >> $LOGFILE 2>&1 || failure
	make >> $LOGFILE 2>&1 || failure
	make install >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
380
	echo "Successfully built and installed Starsphere [ORC]!" | tee -a $LOGFILE
381

382
383
384
385
386
387
388
	# set main include directory
	if [ "$1" == "$TARGET_WIN32" ]; then
		export PATH=$PATH_MINGW
	else
		export PATH=$PATH_ORG
	fi

Oliver Bock's avatar
Oliver Bock committed
389
	echo "Building Starsphere [Framework]..." | tee -a $LOGFILE
390
391
392
	export FRAMEWORK_SRC=$ROOT/src/framework || failure
	export FRAMEWORK_INSTALL=$ROOT/install || failure
	cd $ROOT/build/framework || failure
393
394
395
396
397
	if [ "$1" == "$TARGET_WIN32" ]; then
		cp -f $ROOT/src/framework/Makefile.mingw Makefile >> $LOGFILE 2>&1 || failure
	else
		cp -f $ROOT/src/framework/Makefile . >> $LOGFILE 2>&1 || failure
	fi
398
399
	make >> $LOGFILE 2>&1 || failure
	make install >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
400
	echo "Successfully built and installed Starsphere [Framework]!" | tee -a $LOGFILE
401

Oliver Bock's avatar
Oliver Bock committed
402
	echo "Building Starsphere [Application]..." | tee -a $LOGFILE
403
404
405
406
	export STARSPHERE_SRC=$ROOT/src/starsphere || failure
	export STARSPHERE_INSTALL=$ROOT/install || failure
	cd $ROOT/build/starsphere || failure
	cp $ROOT/src/starsphere/*.res . >> $LOGFILE 2>&1 || failure
407
408
409
410
	if [ "$1" == "$TARGET_MAC" ]; then
		cp -f $ROOT/src/starsphere/Makefile.macos Makefile >> $LOGFILE 2>&1 || failure
	elif [ "$1" == "$TARGET_WIN32" ]; then
		cp -f $ROOT/src/starsphere/Makefile.mingw Makefile >> $LOGFILE 2>&1 || failure
411
	else
412
		cp -f $ROOT/src/starsphere/Makefile . >> $LOGFILE 2>&1 || failure
413
	fi
414
415
	make >> $LOGFILE 2>&1 || failure
	make install >> $LOGFILE 2>&1 || failure
Oliver Bock's avatar
Oliver Bock committed
416
	echo "Successfully built and installed Starsphere [Application]!" | tee -a $LOGFILE
Oliver Bock's avatar
Oliver Bock committed
417
418

	return 0
Oliver Bock's avatar
Oliver Bock committed
419
}
Oliver Bock's avatar
Oliver Bock committed
420

Oliver Bock's avatar
Oliver Bock committed
421

Oliver Bock's avatar
Oliver Bock committed
422
423
build_linux()
{
424
425
	build_generic || failure
	build_starsphere || failure
Oliver Bock's avatar
Oliver Bock committed
426
427

	return 0
Oliver Bock's avatar
Oliver Bock committed
428
429
430
431
432
}


build_mac()
{
433
434
	build_generic $TARGET_MAC || failure
	build_starsphere $TARGET_MAC || failure
Oliver Bock's avatar
Oliver Bock committed
435
436

	return 0
Oliver Bock's avatar
Oliver Bock committed
437
438
439
440
441
}


build_win32()
{
442
443
444
445
	prepare_win32 || failure
	build_mingw || failure
	build_generic_win32 || failure
	build_starsphere $TARGET_WIN32
Oliver Bock's avatar
Oliver Bock committed
446
447

	return 0
Oliver Bock's avatar
Oliver Bock committed
448
449
450
}


Oliver Bock's avatar
Oliver Bock committed
451
452
distclean()
{
453
454
455
	cd $ROOT || failure

	echo "Purging build system..." | tee -a $LOGFILE
Oliver Bock's avatar
Oliver Bock committed
456

457
458
459
	rm -rf 3rdparty || failure
	rm -rf build || failure
	rm -rf install || failure
460
461
	rm -rf doc/html || failure
	rm -f doc/*.tag || failure
Oliver Bock's avatar
Oliver Bock committed
462

463
	rm -f .lastbuild || failure
Oliver Bock's avatar
Oliver Bock committed
464
465
466
}


Oliver Bock's avatar
Oliver Bock committed
467
468
check_last_build()
{
469
470
	echo "Checking previous build target..." | tee -a $LOGFILE

Oliver Bock's avatar
Oliver Bock committed
471
	LASTBUILD=`cat .lastbuild 2>/dev/null`
Oliver Bock's avatar
Oliver Bock committed
472

Oliver Bock's avatar
Oliver Bock committed
473
	if [[ ( -f .lastbuild ) && ( "$LASTBUILD" != "$1" ) ]]; then
474
475
476
477
		cd $ROOT || failure
		echo "Build target changed! Purging build and install trees..." | tee -a $LOGFILE
		rm -rf build >> $LOGFILE || failure
		rm -rf install >> $LOGFILE || failure
Oliver Bock's avatar
Oliver Bock committed
478
479
	fi

480
	echo "$1" > .lastbuild || failure
Oliver Bock's avatar
Oliver Bock committed
481
482

	return 0
Oliver Bock's avatar
Oliver Bock committed
483
484
}

Oliver Bock's avatar
Oliver Bock committed
485

Oliver Bock's avatar
Oliver Bock committed
486
487
488
489
490
491
492
493
494
495
496
print_usage()
{
	cd $ROOT

	echo "*************************"
	echo "Usage: `basename $0` <target>"
	echo
	echo "Available targets:"
	echo "  --linux"
	echo "  --mac"
	echo "  --win32"
Oliver Bock's avatar
Oliver Bock committed
497
	echo "  --doc"
Oliver Bock's avatar
Oliver Bock committed
498
499
	echo "*************************"

Oliver Bock's avatar
Oliver Bock committed
500
	echo "Wrong usage. Stopping!" >> $LOGFILE
Oliver Bock's avatar
Oliver Bock committed
501
502

	return 0
Oliver Bock's avatar
Oliver Bock committed
503
504
505
}


Oliver Bock's avatar
Oliver Bock committed
506
### main control ##########################################################
Oliver Bock's avatar
Oliver Bock committed
507
508
509
510

TARGET_LINUX=1
TARGET_MAC=2
TARGET_WIN32=3
Oliver Bock's avatar
Oliver Bock committed
511
TARGET_DOC=4
Oliver Bock's avatar
Oliver Bock committed
512

513
514
515
516
echo "************************************" | tee -a $LOGFILE
echo "Starting new build!" | tee -a $LOGFILE
echo "`date`" | tee -a $LOGFILE
echo "************************************" | tee -a $LOGFILE
517

Oliver Bock's avatar
Oliver Bock committed
518
# crude command line parsing :-)
519

Oliver Bock's avatar
Oliver Bock committed
520
521
522
if [ $# -ne 1 ]; then
  print_usage
  exit 1
523
524
fi

Oliver Bock's avatar
Oliver Bock committed
525
526
527
case "$1" in
	"--linux")
		TARGET=$TARGET_LINUX
528
		check_last_build "$1" || failure
Oliver Bock's avatar
Oliver Bock committed
529
		echo "Building linux version:" | tee -a $LOGFILE
Oliver Bock's avatar
Oliver Bock committed
530
531
532
		;;
	"--mac")
		TARGET=$TARGET_MAC
533
		check_last_build "$1" || failure
Oliver Bock's avatar
Oliver Bock committed
534
		echo "Building mac version:" | tee -a $LOGFILE
Oliver Bock's avatar
Oliver Bock committed
535
536
		;;
	"--win32")
Oliver Bock's avatar
Oliver Bock committed
537
		TARGET=$TARGET_WIN32
538
		check_last_build "$1" || failure
Oliver Bock's avatar
Oliver Bock committed
539
		echo "Building win32 version:" | tee -a $LOGFILE
Oliver Bock's avatar
Oliver Bock committed
540
		;;
Oliver Bock's avatar
Oliver Bock committed
541
542
543
544
	"--doc")
		TARGET=$TARGET_DOC
		echo "Building documentation..." | tee -a $LOGFILE
		;;
Oliver Bock's avatar
Oliver Bock committed
545
	"--distclean")
546
		distclean || failure
Oliver Bock's avatar
Oliver Bock committed
547
548
		exit 0
		;;
549
550
551
552
553
554
	"--starsphere")
		# "hidden" bonus option :-)
		TARGET=$TARGET_LINUX
		build_starsphere || failure
		exit 0
		;;
Oliver Bock's avatar
Oliver Bock committed
555
	*)
Oliver Bock's avatar
Oliver Bock committed
556
557
558
		print_usage
		exit 1
		;;
Oliver Bock's avatar
Oliver Bock committed
559
esac
560

Oliver Bock's avatar
Oliver Bock committed
561
# here we go...
562

Oliver Bock's avatar
Oliver Bock committed
563
564
case $TARGET in
	$TARGET_LINUX)
Oliver Bock's avatar
Oliver Bock committed
565
566
		check_prerequisites || failure
		prepare_generic || failure
567
		build_linux || failure
Oliver Bock's avatar
Oliver Bock committed
568
569
		;;
	$TARGET_MAC)
Oliver Bock's avatar
Oliver Bock committed
570
571
		check_prerequisites || failure
		prepare_generic || failure
572
		build_mac || failure
Oliver Bock's avatar
Oliver Bock committed
573
574
		;;
	$TARGET_WIN32)
Oliver Bock's avatar
Oliver Bock committed
575
576
		check_prerequisites || failure
		prepare_generic || failure
577
		build_win32 || failure
Oliver Bock's avatar
Oliver Bock committed
578
		;;
Oliver Bock's avatar
Oliver Bock committed
579
580
581
582
583
	$TARGET_DOC)
		doxygen Doxyfile >> $LOGFILE 2>&1 || failure
		cp -f $ROOT/doc/default/*.png $ROOT/doc/html >> $LOGFILE 2>&1 || failure
		cp -f $ROOT/doc/default/*.gif $ROOT/doc/html >> $LOGFILE 2>&1 || failure
		;;
Oliver Bock's avatar
Oliver Bock committed
584
585
586
587
588
589
590
	*)
		# should be unreachable
		print_usage
		exit 1
		;;
esac

591
592
593
594
595
echo "************************************" | tee -a $LOGFILE
echo "Build finished successfully!" | tee -a $LOGFILE
echo "`date`" | tee -a $LOGFILE
echo "************************************" | tee -a $LOGFILE

Oliver Bock's avatar
Oliver Bock committed
596
exit 0