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