osxbuild.sh
1 #!/bin/bash 2 3 # build debug/release x86/x86_64/ppc versions of mapster32 and eduke32 on OS X 4 5 cd .. 6 7 # Variable presets: 8 buildppc=1 9 build86=1 10 build64=1 11 buildmain=1 12 buildtools=0 13 installtools=0 14 builddebug=0 15 buildrelease=1 16 pack=1 17 iamhelix=0 18 dummy=0 19 doclean=0 20 package=package 21 lastrevision= 22 23 # Enforce OS: 24 if [ `uname -s` != Darwin ]; then 25 echo This script is for OS X only. 26 exit 1 27 fi 28 29 # Detect and account for OS X version: 30 darwinversion=`uname -r | cut -d . -f 1` 31 32 if [ `expr $darwinversion \< 9` == 1 ]; then 33 echo OS X 10.5 is the minimum requirement for building. 34 exit 1 35 fi 36 if [ `expr $darwinversion \< 10` == 1 ]; then 37 build64=0 38 # x86_64 is disabled by default on Leopard to avoid the additional hassles of getting libvpx installed into a PowerPC environment. 39 fi 40 if [ `expr $darwinversion \> 9` == 1 ]; then 41 buildppc=0 42 # PPC is disabled by default on Snow Leopard for ease of installation. 43 fi 44 # All defaults can be overridden with the command-line parameters. 45 46 # Parse arguments: 47 for i in $*; do 48 case $i in 49 # onlyzip, helix: For Helixhorned's convenience. 50 onlyzip) 51 buildmain=0 52 buildtools=0 53 pack=1 54 ;; 55 helix) 56 iamhelix=1 57 buildppc=0 58 build86=1 59 build64=1 60 buildmain=1 61 buildtools=1 62 builddebug=0 63 pack=1 64 ;; 65 debughelix) 66 iamhelix=1 67 buildppc=0 68 build86=0 69 build64=1 70 buildmain=1 71 buildtools=0 72 builddebug=1 73 buildrelease=0 74 pack=1 75 ;; 76 dummyhelix) 77 iamhelix=1 78 buildppc=0 79 build86=0 80 build64=0 81 buildmain=0 82 buildtools=0 83 builddebug=0 84 buildrelease=0 85 pack=0 86 dummy=1 87 ;; 88 clean) 89 buildppc=0 90 build86=0 91 build64=0 92 buildmain=0 93 buildtools=0 94 builddebug=0 95 buildrelease=0 96 pack=0 97 doclean=1 98 ;; 99 # For the convenience of universal distributors: 100 dist) 101 buildppc=1 102 build86=1 103 build64=1 104 buildmain=1 105 buildtools=0 106 builddebug=1 107 pack=1 108 ;; 109 disttools) 110 buildppc=1 111 build86=1 112 build64=1 113 buildmain=0 114 buildtools=1 115 builddebug=1 116 pack=0 117 ;; 118 full) 119 buildppc=1 120 build86=1 121 build64=1 122 buildmain=1 123 buildtools=1 124 builddebug=1 125 pack=1 126 ;; 127 128 # misc. 129 installtools) 130 buildppc=0 131 build86=0 132 build64=0 133 buildmain=0 134 buildtools=0 135 builddebug=0 136 pack=0 137 installtools=1 138 ;; 139 140 --buildppc=*) 141 buildppc=${i#*=} 142 ;; 143 --build86=*) 144 build86=${i#*=} 145 ;; 146 --build64=*) 147 build64=${i#*=} 148 ;; 149 150 --main=*) 151 buildmain=${i#*=} 152 ;; 153 --tools=*) 154 buildtools=${i#*=} 155 ;; 156 157 --debug=*) 158 builddebug=${i#*=} 159 ;; 160 161 --pack=*) 162 pack=${i#*=} 163 ;; 164 165 --lastrev=*) 166 lastrevision=${i#*=} 167 ;; 168 169 *) 170 echo "usage: ./osxbuild.sh [options]" 171 echo "options:" 172 echo " [--buildppc=<0|1>] [--build86=<0|1>] [--build64=<0|1>]" 173 echo " [--debug=<0|1>]" 174 echo " [--main=<0|1>] [--tools=<0|1>]" 175 echo " [--pack=<0|1>]" 176 echo "presets:" 177 echo " [onlyzip] [dist] [disttools] [full] [installtools]" 178 exit 1 179 ;; 180 esac 181 done 182 183 # Mandatory disabled settings enforced: 184 if [ `expr $darwinversion \< 9` == 1 ]; then 185 build64=0 186 # x86_64 support did not exist before Leopard. 187 fi 188 if [ `expr $darwinversion \> 10` == 1 ]; then 189 buildppc=0 190 # PPC is disabled on Lion and up because support has been removed from the SDKs. 191 fi 192 193 # Detect versioning systems and pull the revision number: 194 export VC_REV=$(svn info 2> /dev/null | grep Revision | awk '{ print $2 }') 195 vc=svn 196 if [ -z "$VC_REV" ]; then 197 vc=git 198 export VC_REV=$(git svn info 2> /dev/null | grep Revision | awk '{ print $2 }') 199 fi 200 201 if [ -z "$VC_REV" ]; then 202 export VC_REV=Unknown 203 vc=none 204 fi 205 206 function dobuildtools () 207 { 208 make veryclean 209 local cmdline="$2" 210 eval $cmdline 211 if [ $? ]; then 212 echo buildtools: "$1" build succeeded. 213 else 214 echo buildtools: "$1" build failed. 215 exit 1 216 fi 217 } 218 219 function dobuildem() # build EDuke32 and Mapster32 220 { 221 make veryclean 222 local cmdline="$2" 223 eval $cmdline 224 if [ $? ]; then 225 echo $1 build succeeded. 226 cp "Mapster32.app/Contents/MacOS/mapster32" mapster32.$1 227 cp "EDuke32.app/Contents/MacOS/eduke32" eduke32.$1 228 else 229 echo $1 build failed. 230 exit 1 231 fi 232 } 233 234 # A little factoring: 235 commonargs="WITHOUT_GTK=1" 236 if [ $buildppc == 1 ] || [ `expr $darwinversion = 9` == 1 ]; then 237 commonargs="$commonargs DARWIN9=1" 238 fi 239 if [ `expr $darwinversion = 10` == 1 ]; then 240 commonargs="$commonargs DARWIN10=1" 241 fi 242 243 if [ $doclean == 1 ]; then 244 cd build 245 rm -f *{.x86,.x64,.ppc} 246 cd .. 247 fi 248 249 # Building the buildtools: 250 if [ $buildtools$installtools != 00 ] && [ -d "build" ]; then 251 252 makecmd="make -k" 253 254 if [ $buildtools == 1 ]; then 255 rm -f *{.x86,.x64,.ppc} 256 make veryclean 257 EXESUFFIX_OVERRIDE=.debug make veryclean 258 259 if [ $build64 == 1 ]; then 260 if [ $builddebug == 1 ]; then 261 dobuildtools "x86_64 debug" \ 262 "ARCH=x86_64 EXESUFFIX_OVERRIDE=.debug.x64 $commonargs RELEASE=0 USE_LIBVPX=1 $makecmd utils" 263 fi 264 265 dobuildtools "x86_64 release" \ 266 "ARCH=x86_64 EXESUFFIX_OVERRIDE=.x64 $commonargs RELEASE=1 USE_LIBVPX=1 $makecmd utils" 267 fi 268 269 if [ $build86 == 1 ]; then 270 if [ $builddebug == 1 ]; then 271 dobuildtools "x86 debug" \ 272 "ARCH=i386 EXESUFFIX_OVERRIDE=.debug.x86 $commonargs RELEASE=0 USE_LIBVPX=0 $makecmd utils" 273 fi 274 275 dobuildtools "x86 release" \ 276 "ARCH=i386 EXESUFFIX_OVERRIDE=.x86 $commonargs RELEASE=1 USE_LIBVPX=0 $makecmd utils" 277 fi 278 279 if [ $buildppc == 1 ]; then 280 if [ $builddebug == 1 ]; then 281 dobuildtools "PowerPC debug" \ 282 "ARCH=ppc EXESUFFIX_OVERRIDE=.debug.ppc $commonargs RELEASE=0 USE_LIBVPX=0 $makecmd utils" 283 fi 284 285 dobuildtools "PowerPC release" \ 286 "ARCH=ppc EXESUFFIX_OVERRIDE=.ppc $commonargs RELEASE=1 USE_LIBVPX=0 $makecmd utils" 287 fi 288 289 mkdir -p tools 290 291 echo buildtools: Creating fat binaries. 292 utils=`make printutils && EXESUFFIX_OVERRIDE=.debug make printutils` 293 for i in $utils; do 294 binaries= 295 for j in ${i}.{x86,x64,ppc}; do 296 if [ -f "$j" ]; then 297 binaries="$binaries $j" 298 fi 299 done 300 if [ -n "$binaries" ]; then 301 lipo -create $binaries -output $i || exit 1 302 # ln -f -s $i tools/$i || exit 1 303 cp -f $i tools/$i || exit 1 304 fi 305 done 306 fi 307 308 if [ $installtools == 1 ]; then 309 if [ -d "/opt/local/bin" ]; then 310 echo buildtools: Installing to MacPorts search path. 311 for i in $utils; do 312 if [ -f "$i" ]; then 313 cp -f "$i" "/opt/local/bin/" || exit 1 314 fi 315 done 316 fi 317 318 if [ -d "/usr/local/bin" ]; then 319 echo buildtools: Installing to Homebrew search path. 320 for i in $utils; do 321 if [ -f "$i" ]; then 322 cp -f "$i" "/usr/local/bin/" || exit 1 323 fi 324 done 325 fi 326 fi 327 328 cd .. 329 fi 330 331 if [ $doclean == 1 ] || [ $buildmain == 1 ]; then 332 rm -f {eduke32,mapster32}{.debug,}{.x86,.x64,.ppc,} 333 rm -rf {$package/,}{EDuke32,Mapster32}{.debug,}.app 334 fi 335 336 # The build process itself: 337 if [ $buildmain == 1 ]; then 338 if [ $iamhelix == 1 ]; then 339 makecmd="make -j 2" 340 else 341 makecmd="make" 342 fi 343 344 if [ $build64 == 1 ]; then 345 if [ $builddebug == 1 ]; then 346 dobuildem debug.x64 "ARCH=x86_64 $commonargs RELEASE=0 $makecmd" 347 fi 348 349 if [ $buildrelease == 1 ]; then 350 dobuildem x64 "ARCH=x86_64 $commonargs RELEASE=1 $makecmd" 351 fi 352 fi 353 354 if [ $build86 == 1 ]; then 355 if [ $builddebug == 1 ]; then 356 dobuildem debug.x86 "ARCH=i386 $commonargs RELEASE=0 USE_LIBPNG=0 USE_LIBVPX=0 $makecmd" 357 fi 358 359 dobuildem x86 "ARCH=i386 $commonargs RELEASE=1 USE_LIBPNG=0 USE_LIBVPX=0 $makecmd" 360 fi 361 362 if [ $buildppc == 1 ]; then 363 if [ $builddebug == 1 ]; then 364 dobuildem debug.ppc "ARCH=ppc $commonargs RELEASE=0 USE_LIBPNG=0 USE_LIBVPX=0 $makecmd" 365 fi 366 367 dobuildem ppc "ARCH=ppc $commonargs RELEASE=1 USE_LIBPNG=0 USE_LIBVPX=0 $makecmd" 368 fi 369 fi 370 371 # Duplicating .app bundles for debug build: 372 if [ $builddebug == 1 ] || [ $pack == 1 ]; then 373 for i in Mapster32 EDuke32; do 374 if [ -d "$i.app" ]; then 375 cp -RP "$i.app" "$i.debug.app" 376 fi 377 done 378 fi 379 380 # Begin assembling archive contents: 381 echo Creating fat binaries. 382 383 success=$dummy 384 if [ $dummy == 0 ]; then 385 for i in {eduke32,mapster32}{.debug,}; do 386 binaries= 387 for j in ${i}.{x86,x64,ppc}; do 388 if [ -f "$j" ]; then 389 binaries="$binaries $j" 390 success=1 391 fi 392 done 393 394 if [ -n "$binaries" ]; then 395 lipo -create $binaries -output $i 396 app=${i//eduke32/EDuke32} 397 app=${app//mapster32/Mapster32}.app 398 cp -f $i "$app/Contents/MacOS/${i%.debug}" 399 mv -f "$app" "$package/" 400 fi 401 done 402 fi 403 404 # Almost done... 405 if [ $success == 1 ]; then 406 cd $package 407 408 echo "Generating README.OSX and Changelog.txt" 409 410 # Output README.OSX: 411 let "darwinversion -= 4" 412 echo "This archive was produced from revision ${VC_REV} by the osxbuild.sh script." > README.OSX 413 echo "Built on: Mac OS X 10.$darwinversion" >> README.OSX 414 echo "EDuke32 home: http://www.eduke32.com" >> README.OSX 415 echo "OS X build discussion on Duke4.net: http://forums.duke4.net/topic/4242-building-eduke-on-mac-os-x/" >> README.OSX 416 echo "The 64-bit build in this archive has LibVPX (http://www.webmproject.org/code/)" >> README.OSX 417 echo "from MacPorts (http://www.macports.org/) and" >> README.OSX 418 echo "LibPNG from Fink (http://www.finkproject.org/) statically linked into it." >> README.OSX 419 420 # Generate Changelog: 421 if [ -z $lastrevision ]; then 422 lastrevision=$(ls -A1 eduke32-osx* | tail -n1 | cut -d- -f3 | cut -d. -f1) 423 424 if [ -z $lastrevision ]; then 425 let lastrevision=VC_REV-1 426 elif [ $lastrevision -lt $VC_REV ]; then 427 let lastrevision+=1 428 else 429 let lastrevision=VC_REV-1 430 fi 431 fi 432 433 echo "Using r$lastrevision as last revision for change log" 434 435 if [ "$vc" == "svn" ]; then 436 svn log -r $VC_REV:$lastrevision > Changelog.txt 437 elif [ "$vc" == "git" ]; then 438 commitid=$(git log --grep="git-svn-id: .*@$lastrevision" -n 1 | grep -E '^commit ' | head -n 1 | awk '{print $2}') 439 # Get the commit messages and strip the email addresses 440 git log $commitid..HEAD | sed 's/<.*@.*>//g' > Changelog.txt 441 fi 442 443 # Package 444 if [ $pack == 1 ]; then 445 arfilename="eduke32-osx-${VC_REV}.zip" 446 echo "Packing distribution into $arfilename" 447 rm -f "$arfilename" 448 zip -r -y "$arfilename" * -x "*.svn*" "*.git*" "*.dll" 449 fi 450 cd .. 451 fi