/ platform / osxbuild.sh
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