build script: use git for fteqcc
[divverent/nexuiz.git] / misc / tools / makebuild.sh
1 #!/bin/bash
2
3 set -e
4
5 # Options:
6 #   pw=foo          extract password
7 #   version=2.5     make a FINAL build
8 #   tag=FOO         insert FOO before the date in build names
9
10 base=`pwd`
11
12 # customizable specific stuff
13 netradiant_release=1.5.0-svn389
14 basepk3=$base/data20090403.pk3 # 2.5
15 hotbasepk3= # hotfix
16 nexdir=$base/nexuiz
17 havocdir=$base/nexuiz/havoc
18 dpdir=$base/darkplaces
19 tmpdir=/tmp/NEX
20 zipdir=$base/builds
21 buildfiles=$base/nexuiz/misc/buildfiles
22 mingwdlls=$buildfiles/w32
23 osxapps=$buildfiles/osx
24 copystrip=$buildfiles/copystrip
25 zipdiff=$base/nexuiz/misc/tools/zipdiff
26 fteqccdir="$base/fteqcc"
27 fteqccflags=""
28 menuqc=menu
29 newest=NEWEST
30 aft="perl -I/chroot/debian-etch/usr/share/aft /chroot/debian-etch/usr/bin/aft"
31 # end system specific stuff
32
33 case "$pw" in
34         '')
35                 zipflags=
36                 ;;
37         *)
38                 zipflags="-P $pw"
39                 ;;
40 esac
41
42 : ${date:=`date +%Y%m%d`}
43 : ${versiontag:=}
44 echo "date stamp: $date"
45
46 case "$version" in
47         '')
48                 version=2-svntest-$date
49                 versiontag=test
50                 defaultcfg=
51                 ext=
52                 ;;
53         *)
54                 version=$version
55                 versiontag=$versiontag
56                 defaultcfg=
57                 ext=_$version
58                 ;;
59 esac
60
61 mk7z()
62 {
63         7za a -tzip -mx=9 "$@"
64         chmod 644 "$1"
65 }
66
67 #if [ -n "$EXPERIMENTAL" ]; then
68 #       basepk3=$base/data20071231.pk3 # newer build to make smaller patches
69 #       nexdir=$base/nexuiz
70 #fi
71
72 # TODO normalize the builds
73 platforms='x86 amd64 osx'
74 buildon()
75 {
76         host=$1
77         prefix=$2
78         fteqccname=$3
79         path=$4
80         makeflags=$5
81         strip=$6
82
83         fteqcc_cflags=
84         case "$fteqccname" in
85                 *.exe)
86                         fteqcc_cflags=win
87                         ;;
88         esac
89
90         rm -f "$fteqccdir"/*.o
91         rm -f "$fteqccdir"/*.bin
92         rsync --exclude "*.o" --exclude "*.d" --exclude "nexuiz-*" --delete-excluded --delete -zvaSHP . "$copystrip" "$fteqccdir" "$host:$path"
93         ssh "$host" ". ~/.profile && cd $path && COPYSTRIP_STRIP=$strip PATH=$path/copystrip:\$PATH make $makeflags clean nexuiz && cd ${fteqccdir##*/} && make $makeflags $fteqcc_cflags"
94         rsync --exclude "*.o" --exclude "*.d" --delete-excluded --delete -zvaSHP "$host:$path/." .
95         for P in -dedicated -sdl -glx -wgl -agl -dedicated.exe -sdl.exe .exe; do
96                 [ -f nexuiz$P ] && mv nexuiz$P "$tmpdir/$prefix$P"
97                 [ -f nexuiz$P-withdebug ] && mv nexuiz$P-withdebug "$tmpdir/debuginfo/$prefix$P"
98         done
99         case "$fteqccname" in
100                 *.exe)
101                         mv "${fteqccdir##*/}"/fteqcc.exe "$tmpdir/fteqcc/$fteqccname"
102                         ;;
103                 *)
104                         mv "${fteqccdir##*/}"/fteqcc.bin "$tmpdir/fteqcc/$fteqccname"
105                         ;;
106         esac
107         make clean
108 }
109
110 build()
111 {
112 #       buildon nexmacbuild                           nexuiz-osx          fteqcc-osx          /tmp/Darkplaces.build 'CC="gcc -g -arch i386 -arch ppc -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4"' strip
113         buildon nexmacbuild                           nexuiz-osx          fteqcc-osx          /tmp/Darkplaces.build 'CC="gcc -g -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4"' strip
114         buildon eos.thruhere.net                      nexuiz-linux-686    fteqcc-linux-686    /tmp/Darkplaces.build 'CC="gcc -g" DP_MODPLUG_STATIC_LIBDIR=/home/divverent/modplug-i386/lib' strip
115         buildon alientrap.org                         nexuiz-linux-x86_64 fteqcc-linux-x86_64 /tmp/Darkplaces.build 'CC="gcc -g -Wl,--hash-style=sysv" DP_MODPLUG_STATIC_LIBDIR=/home/divverent/modplug-x86_64/lib' strip
116         buildon alientrap.org                         nexuiz              fteqcc.exe          /tmp/Darkplaces.build 'DP_MAKE_TARGET=mingw CC="/chroot/debian-etch/usr/bin/i586-mingw32msvc-gcc -g -DSUPPORTDIRECTX -I/home/divverent/dxheaders" WINDRES=/chroot/debian-etch/usr/bin/i586-mingw32msvc-windres SDL_CONFIG=/home/divverent/sdl-win32/SDL-1.2.13/bin/sdl-config' /chroot/debian-etch/usr/bin/i586-mingw32msvc-strip
117                 mv "$tmpdir/nexuiz-osx-agl"     "$tmpdir/Nexuiz.app/Contents/MacOS/nexuiz-osx-agl-bin"
118                 mv "$tmpdir/nexuiz-osx-sdl"     "$tmpdir/Nexuiz-SDL.app/Contents/MacOS/nexuiz-osx-sdl-bin"
119 }
120
121 # avoid dupes
122 i=
123 while [ -f "$zipdir/nexuiz$date$i$ext.zip" ]; do
124         if [ -z "$i" ]; then
125                 i=a
126         else
127                 i=`echo "$i" | tr a-y b-z`
128         fi
129 done
130 ext=$i$ext
131
132 echo "Using build name nexuiz$date$ext"
133 sleep 3
134
135 # check for remains
136 conflicts=`find "$dpdir" "$nexdir" -name '*.orig' -o -name '*.rej' -o -name '*.mine' -o -name '.#*' -o -name '.*~'`
137 if [ -n "$conflicts" ]; then
138         echo "CONFLICTS OR UNNEEDED FILES HAVE BEEN FOUND!"
139         echo "NOT PROCEEDING"
140         echo
141         echo "$conflicts"
142         exit 1
143 fi
144
145 set -x
146
147 # prepare temp dir
148 rm -rf "$tmpdir"
149 mkdir -p "$tmpdir"
150
151 # clean up and patch DP
152 cd "$dpdir"
153 quilt pop -a || true
154 svn revert -R .
155 if [ -s patches/series ]; then
156         quilt push -a # apply all patches
157 fi
158
159 # prepare directory structure
160 cp -r "$osxapps"/*.app "$tmpdir"
161 mkdir "$tmpdir/debuginfo"
162 mkdir "$tmpdir/fteqcc"
163
164 # prepare fteqcc build
165 cd "$fteqccdir"
166 git checkout-index -a -f --prefix="$tmpdir/fteqcc/source/"
167 git log -1 > "$tmpdir/fteqcc/source/fteqcc-base-revision.txt"
168 fteqccrev=`git show --pretty=%ct-%H | head -n 1`
169 echo "fteqcc rev $fteqccrev"
170
171 # build all executables
172 cd "$dpdir"
173 rm -f *.exe nexuiz-* *-withdebug* *.o
174 make clean
175 build
176 rm -f *.exe nexuiz-* *-withdebug '.#'* *.o
177 rm -rf fteqcc copystrip
178 make clean
179
180 # move shell scripts and license
181 cd "$tmpdir"
182 cp "$nexdir/"nexuiz-*.sh "$tmpdir/"
183 cp "$nexdir/gpl.txt" "$tmpdir/"
184 cp "$nexdir/readme.html" "$tmpdir/"
185
186 # prepare data
187 cd "$nexdir/data"
188 svn export . "$tmpdir/data"
189 svn info . > "$tmpdir/data/nexuiz-data-base-revision.txt"
190 svn log > "$tmpdir/data/ChangeLog"
191
192 # prepare havoc
193 cd "$havocdir"
194 svn export . "$tmpdir/havoc"
195
196 # prepare Docs
197 cd "$nexdir/Docs"
198 svn export . "$tmpdir/Docs"
199
200 # prepare server
201 cd "$nexdir/server"
202 svn export . "$tmpdir/server"
203
204 # make gamesource
205 cd "$tmpdir/data"
206 mkdir -p "$tmpdir/sources"
207 mk7z ../sources/gamesource$date.zip qcsrc nexuiz-data-base-revision.txt ChangeLog
208
209 # make enginesource
210 cd "$dpdir"
211 svn export . "$tmpdir/darkplaces"
212 svn info > "$tmpdir/darkplaces/nexuiz-base-revision.txt"
213 svn diff > "$tmpdir/darkplaces/nexuiz-engine-changes.diff"
214 svn log > "$tmpdir/darkplaces/ChangeLog"
215 cd "$tmpdir"
216 mk7z "$tmpdir/sources/enginesource$date.zip" "darkplaces"
217 rm -rf darkplaces
218
219 # make fteqcc archive
220 cd "$tmpdir"
221 zip -9r "$tmpdir/sources/fteqcc-binaries-and-source-rev$fteqccrev.zip" "fteqcc"
222 rm -rf fteqcc
223
224 # clean fteqcc dir
225 cd "$fteqccdir"
226 rm -f *.o *.bin
227 make
228
229 # make local compiler
230 cd "$tmpdir/data"
231 make FTEQCC="$fteqccdir/fteqcc.bin"
232
233 # prepare root
234 rm -rf "$tmpdir/data/qcsrc"
235 cd "$tmpdir/Docs"
236 cp "$dpdir/darkplaces.txt" .
237 cd "$tmpdir/data"
238 mv common-spog.pk3 ..
239 perl -pi -e '/^set g_nexuizversion "?([0-9.]*)[^"]*"?/ and $_ = "set g_nexuizversion '$version'\n"' defaultNexuiz.cfg
240 if [ -z "$versiontag" ]; then
241         perl -pi -e 'm|^//!<showbrand| .. m|^//!>showbrand| and $_ = "";' defaultNexuiz.cfg
242         rm -f gfx/brand.tga
243 fi
244 echo >> defaultNexuiz.cfg
245 echo "$defaultcfg" >> defaultNexuiz.cfg
246 mk7z ../data.pk3 .
247 cd "$tmpdir/havoc"
248 mk7z ../havoc.pk3 .
249
250 # make data pk3
251 cd "$tmpdir"
252 rm -rf data
253 mkdir data
254 mv data.pk3 data/data$tag$date.pk3
255 mv common-spog.pk3 data/
256 rm -rf havoc
257 mkdir havoc
258 mv havoc.pk3 havoc/data$tag${date}havoc.pk3
259
260 cp -r "$mingwdlls"/* .
261 # fix up permissions
262 chmod 644 *.dll *.exe
263
264 mkdir extra
265 cd extra
266 wget http://www.icculus.org/netradiant/files/netradiant-${netradiant_release}-win32.zip
267 #echo "Downloading netradiant, press enter and type the PWs"
268 #read -r DUMMY
269 #scp divverent@icculus.org:netradiant-webspace/files/netradiant-${netradiant_release}-win32.zip .
270 unzip netradiant-${netradiant_release}-win32.zip
271 mv NetRadiant netradiant-${netradiant_release}-win32
272 rm -f netradiant-${netradiant_release}-win32.zip
273 wget http://www.icculus.org/netradiant/files/netradiant-${netradiant_release}-osxintel.zip
274 #scp divverent@icculus.org:netradiant-webspace/files/netradiant-${netradiant_release}-osxintel.zip .
275 unzip netradiant-${netradiant_release}-osxintel.zip
276 mv NetRadiant.app NetRadiant-${netradiant_release}-osxintel.app
277 rm -f netradiant-${netradiant_release}-osxintel.zip
278 cat >> unsupported.txt <<EOF
279 This directory contains NetRadiant, a stabilized Q3 map editor,\r
280 configured for Nexuiz.\r
281 \r
282 It is not officially supported by Alientrap.\r
283 \r
284 Website: http://www.icculus.org/netradiant/\r
285 EOF
286 cd ..
287
288 # make main structure
289 mkdir Nexuiz
290 mv * Nexuiz/ || true
291
292 find . -name .svn -exec rm -rf {} \; -prune
293
294 rm -f "$zipdir/nexuiz$date$ext.zip"
295 zip $zipflags -9yr "$zipdir/nexuiz$date$ext.zip"           Nexuiz/gpl.txt Nexuiz/nexuiz* Nexuiz/Nexuiz* Nexuiz/*.dll Nexuiz/sources Nexuiz/Docs Nexuiz/readme.html Nexuiz/server Nexuiz/data/data$tag$date.pk3 Nexuiz/data/common-spog.pk3 Nexuiz/havoc/* Nexuiz/extra/*
296 ln -snf nexuiz$date$ext.zip "$zipdir/nexuiz-$newest.zip"
297
298 rm -f "$zipdir/nexuizengineonly$date$ext.zip"
299 zip $zipflags -9yr "$zipdir/nexuizengineonly$date$ext.zip" Nexuiz/gpl.txt Nexuiz/nexuiz* Nexuiz/Nexuiz* Nexuiz/*.dll
300 ln -snf nexuizengineonly$date$ext.zip "$zipdir/nexuizengineonly-$newest.zip"
301
302 rm -f "$zipdir/nexuizsource$date$ext.zip"
303 zip $zipflags -9yr "$zipdir/nexuizsource$date$ext.zip"     Nexuiz/gpl.txt                                            Nexuiz/sources
304 ln -snf nexuizsource$date$ext.zip "$zipdir/nexuizsource-$newest.zip"
305
306 # TODO remove these excludes after the version after 2.4.2
307 $zipdiff -o "Nexuiz/data/data$tag$date""patch.pk3" -f "$basepk3" -t Nexuiz/data/data$tag$date.pk3
308 [ -n "$hotbasepk3" ] && $zipdiff -o "Nexuiz/data/data$tag$date""hotfix.pk3" -f "$hotbasepk3" -t Nexuiz/data/data$tag$date.pk3
309 mkdir -p gfx
310 if unzip "Nexuiz/data/data$tag$date.pk3" gfx/brand.tga; then
311         zip -9r "Nexuiz/data/data$tag$date""patch.pk3" gfx/brand.tga
312         [ -n "$hotbasepk3" ] && zip -9r "Nexuiz/data/data$tag$date""hotfix.pk3" gfx/brand.tga
313         rm -rf gfx
314 fi
315
316 rm -f "$zipdir/nexuizpatch$date$ext.zip"
317 zip $zipflags -9yr "$zipdir/nexuizpatch$date$ext.zip"      Nexuiz/gpl.txt Nexuiz/nexuiz* Nexuiz/Nexuiz* Nexuiz/*.dll Nexuiz/sources Nexuiz/Docs Nexuiz/readme.html Nexuiz/server Nexuiz/data/data$tag$date""patch.pk3 Nexuiz/havoc/*
318 ln -snf nexuizpatch$date$ext.zip "$zipdir/nexuizpatch-$newest.zip"
319
320 [ -n "$hotbasepk3" ] && rm -f "$zipdir/nexuizhotfix$date$ext.zip"
321 [ -n "$hotbasepk3" ] && zip $zipflags -9yr "$zipdir/nexuizhotfix$date$ext.zip"      Nexuiz/gpl.txt Nexuiz/nexuiz* Nexuiz/Nexuiz* Nexuiz/*.dll Nexuiz/sources Nexuiz/Docs Nexuiz/readme.html Nexuiz/server Nexuiz/data/data$tag$date""hotfix.pk3 Nexuiz/havoc/*
322 [ -n "$hotbasepk3" ] && ln -snf nexuizhotfix$date$ext.zip "$zipdir/nexuizhotfix-$newest.zip"
323
324 rm -f "$zipdir/nexuizdocs$date$ext.zip"
325 zip $zipflags -9yr "$zipdir/nexuizdocs$date$ext.zip"       Nexuiz/gpl.txt Nexuiz/Docs Nexuiz/readme.html
326 ln -snf nexuizdocs$date$ext.zip "$zipdir/nexuizdocs-$newest.zip"
327
328 rm -f "$zipdir/nexuizdebug$date$ext.zip"
329 zip $zipflags -9yr "$zipdir/nexuizdebug$date$ext.zip"      Nexuiz/gpl.txt Nexuiz/debuginfo/* Nexuiz/sources
330 ln -snf nexuizdebug$date$ext.zip "$zipdir/nexuizdebug-$newest.zip"
331
332 case "$versiontag" in
333         test)
334                 ;;
335         *)
336                 cat <<'EOF'
337
338 NOTE: This is a RELEASE BUILD.
339
340 To upload and finish the build, these things have to be done:
341
342 - Test the build:
343   - On Linux/ATI
344   - On Vista/nvidia
345   - On Vista/ATI
346   - On Vista/Intel
347   - On OSX/ATI
348   - Turn on "developer 1"; watch out for suspicious messages.
349   - While testing, make sure all campaign levels are tested. In CTF/KH levels,
350     try to do a capture. After that, finish the game by prvm_edictset server 1
351     frags 1000.
352   - Play on a server running the new code. Ideally, that server should be public
353     and "somewhat compatible" to old clients, and some other players should be
354     on it.
355 - Post the build on the forum as a test release. E.g. run this script again
356   with the "version" variable NOT SET, so the build gets marked "testing only",
357   and upload it and post it on the forum for testing. Mention the test server
358   that is already running the new code. Wait for at least one week for critical
359   bug reports.
360 - If needed, fix the reported bugs and re-run this script for a release build.
361   Possibly repeat the testing process.
362 - Upload the "final" build you have just made to Sourceforge (upload.sf.net,
363   incoming). Use the naming scheme nexuiz-25.zip, nexuizpatch-24-to-25.zip
364 - Make the download available on sourceforge.
365 - Announce the build on the forum; update the downloads website. Note that the
366   download may be still unavailable because of the SF mirror system.
367 - Wait for the mirrors to catch up.
368 - Edit the website: make a new news item for the new release, change the logo
369   image in the top left for the new version (ask [-z-]).
370
371 EOF
372                 ;;
373 esac