diff options
author | David Robillard <d@drobilla.net> | 2007-01-09 23:24:54 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2007-01-09 23:24:54 +0000 |
commit | 532f6aad4ac79ca15d69deccd18fca90e444c437 (patch) | |
tree | 0d4ca5449af8eb48ad56e163efcab42c4656e8de /tools/osx_packaging/app_build.rb | |
parent | ef6b25432d9c46d71b08c0f7d5f2686df428c4e8 (diff) |
Merged with trunk R1283.
NOTE: Compiles, but broken (crash on adding MIDI track).
git-svn-id: svn://localhost/ardour2/branches/midi@1292 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'tools/osx_packaging/app_build.rb')
-rwxr-xr-x | tools/osx_packaging/app_build.rb | 254 |
1 files changed, 246 insertions, 8 deletions
diff --git a/tools/osx_packaging/app_build.rb b/tools/osx_packaging/app_build.rb index 965d87003d..4cab635034 100755 --- a/tools/osx_packaging/app_build.rb +++ b/tools/osx_packaging/app_build.rb @@ -1,22 +1,260 @@ -#!/usr/bin/ruby +#!/usr/bin/env ruby # Ruby script for pulling together a MacOSX app bundle. -if File.exist?("lib") then - Dir.foreach("lib") {|x| unless x[0] == 46 then File.delete("lib/"+x) end} +# it will be either powerpc or i386 +versionline = `grep -m 1 '^version =' ../../SConstruct` +version = versionline.split(" = ")[1].chomp().slice(1..-2) +$stdout.printf("Version is %s\n", version) + +arch = `uname -p`.strip() +libdir = "lib_" + arch +bindir = "bin_" + arch + +ppc_libdir = "lib_powerpc" +i386_libdir = "lib_i386" +ppc_bindir = "bin_powerpc" +i386_bindir = "bin_i386" +ppc_binlib = "binlib_powerpc.zip" +i386_binlib = "binlib_i386.zip" + +#$stdout.print("libdir is '" + libdir + "'\n") + +# check for the other arch's libbin.zip +if arch == "i386" then + zipfile = ppc_binlib + `rm -rf #{ppc_libdir} #{ppc_bindir}` +else + zipfile = i386_binlib + `rm -rf #{i386_libdir} #{i386_bindir}` +end + +if File.exist?(zipfile) then + $stdout.print("Found #{zipfile} : unpacking...\n") + `unzip -aq #{zipfile}` +end + + +if File.exist?(libdir) then + # remove it + `rm -rf #{libdir}/*` + #Dir.foreach(libdir) {|x| unless ( x[0] == 46 or File.stat(libdir+"/"+x).directory?) then File.delete(libdir + "/" +x) end} else - Dir.mkdir "lib" + Dir.mkdir libdir end -result = `otool -L ../../gtk2_ardour/ardour.bin` +if File.exist?(bindir) then + Dir.foreach(bindir) {|x| unless x[0] == 46 then File.delete(bindir + "/" +x) end} +else + Dir.mkdir bindir +end + +if not File.exist?(libdir+"/surfaces") then + Dir.mkdir(libdir + "/surfaces") +end + + +odir = Dir.getwd +Dir.chdir("../..") + +result = `otool -L gtk2_ardour/ardour.bin` results = result.split("\n") results.delete_at(0) + +result = `otool -L libs/ardour/libardour.dylib` +results = results + result.split("\n").slice(1,result.size-1) + +result = `otool -L libs/surfaces/*/*.dylib` +results = results + result.split("\n").slice(1,result.size-1) + +results.uniq! + +$stdout.print("Copying libs to #{libdir} ...\n"); + results.each do |s| s = s.split[0] # exclude frameworks, system libraries, X11 libraries, and libjack. - unless s =~ /System|\/usr\/lib|\/usr\/X11R6|libjack/ then - `cp #{s} lib` + unless s =~ /System|\/usr\/lib|\/usr\/X11R6|libjack|:$/ then + #$stdout.print("Copying #{s}\n") + `cp #{s} #{odir}/#{libdir}/` end end -`/usr/local/bin/platypus -a 'Ardour2' -t 'Shell' -o 'None' -u 'Paul Davis' -i '/bin/sh' -V '1.0' -s 'ArDr' -I 'org.ardour.Ardour2' -f 'bin' -f 'lib' -f 'Ardour2.icns' -f 'MenuBar.nib' -f 'ProgressWindow.nib' -f 'init' -f 'openDoc' 'script' 'Ardour2.app'`
\ No newline at end of file +# now do it again +result = `otool -L #{odir}/#{libdir}/*.dylib` +results = result.split("\n") +results.uniq! +results.each do |s| + s = s.split[0] + # exclude frameworks, system libraries, X11 libraries, and libjack. + unless s =~ /System|\/usr\/lib|\/usr\/X11R6|libjack|:$/ then + sbase = File.basename(s) + targfile = "#{odir}/#{libdir}/#{sbase}" + #$stdout.print("Targ is : " + targfile + "\n") + if not File.exist?(targfile) then + #$stdout.print("2nd stage Copying #{s}\n") + `cp #{s} #{odir}/#{libdir}/` + end + end +end + + +Dir.chdir(odir) + +# copy ardour.bin to bindir/ardour + + +if File.exist?("../../gtk2_ardour/ardour.bin") then + $stdout.print("Copying bin to #{bindir} ...\n"); + `cp ../../gtk2_ardour/ardour.bin #{bindir}/ardour` +end + +`cp ../../libs/surfaces/*/*.dylib #{libdir}/surfaces` +# remove the basenames from libdir that are in surfaces (copied earlier) +`rm -f #{libdir}/surfaces/libardour_cp.dylib` +begin + Dir.foreach(libdir+"/surfaces") {|x| unless ( x[0] == 46 or x.include?("libardour_cp")) then File.delete(libdir + "/" +x) end} +rescue +end + + +# copy gtk and pango lib stuff +`cp -R /opt/local/lib/pango #{libdir}/` +`cp -R /opt/local/lib/gtk-2.0 #{libdir}/` + +# use our clearlooks +`rm -f #{libdir}/gtk-2.0/2.*/engines/libclearlooks.*` +# must use .so for it to be found :/ +`cp ../../libs/clearlooks/libclearlooks.dylib #{libdir}/gtk-2.0/2.10.0/engines/libclearlooks.so` + + +def lipo_platforms_recurse(src1, src2, target) + + if not File.stat(src1).directory? then + # normal file, lets lipo them if it doesn't already exist there + isbin = `file #{src1}`.include?("Mach-O") + if (! File.exist?(target)) and isbin then + if File.exist?(src2) then + $stdout.print("Lipo'ing " + target + "\n") + `lipo -create -output #{target} #{src1} #{src2}` + else + # just copy it + $stdout.print("Copying " + src1 + "\n") + `cp #{src1} #{target}` + end + else + #$stdout.print("Skipping " + target + "\n") + end + else + # directory, recurse if necessary + if File.exist?(src2) then + # other dir exists, recurse + + # make targetdir if necessary + if not File.exist?(target) then + Dir.mkdir(target) + end + + Dir.foreach(src1) do |file| + if file[0] != 46 then + src1file = src1 + '/' + file + src2file = src2 + '/' + file + targfile = target + '/' + file + lipo_platforms_recurse(src1file, src2file, targfile) + end + end + else + # just copy it recursively to target + $stdout.print("Copying dir " + src1 + "\n") + `cp -R #{src1} #{target}` + end + end +end + +# lipo stuff together if both platforms libs and bins are here + +if File.exist?(ppc_libdir) and File.exist?(i386_libdir) then + $stdout.print("\nBoth platforms in place, lipo'ing...\n"); + `rm -rf lib/*` + `rm -f bin/ardour` + lipo_platforms_recurse(ppc_libdir, i386_libdir, "lib") + lipo_platforms_recurse(i386_libdir, ppc_libdir, "lib") + lipo_platforms_recurse(i386_bindir+'/ardour', ppc_bindir+'/ardour', "bin/ardour") + + # remove existing Ardour2.app + `rm -rf Ardour2.app` + + $stdout.print("\nRunning Playtpus to create Ardour2.app ...\n"); + + `/usr/local/bin/platypus -D -X 'ardour' -a 'Ardour2' -t 'shell' -o 'None' -u 'Paul Davis' -i '/bin/sh' -V "#{version}" -s 'ArDr' -I 'org.ardour.Ardour2' -f 'bin' -f 'lib' -i 'Ardour2.icns' -f 'MenuBar.nib' -f 'ProgressWindow.nib' -f 'init' -f 'openDoc' 'script' 'Ardour2.app'` + + $stdout.print("\nCopying other stuff to Ardour2.app ...\n"); + + if not File.exist?("Ardour2.app/Contents/Resources/etc") then + Dir.mkdir "Ardour2.app/Contents/Resources/etc" + end + + if not File.exist?("Ardour2.app/Contents/Resources/etc/ardour2") then + Dir.mkdir "Ardour2.app/Contents/Resources/etc/ardour2" + end + `cp ../../gtk2_ardour/ardour.bindings ../../gtk2_ardour/ardour.colors ../../gtk2_ardour/ardour.menus Ardour2.app/Contents/Resources/etc/ardour2/` + `cp ../../ardour.rc ../../ardour_system.rc Ardour2.app/Contents/Resources/etc/ardour2/` + `cp ardour2_mac_ui.rc Ardour2.app/Contents/Resources/etc/ardour2/ardour2_ui.rc` + + # copy other etc stuff + if not File.exist?("Ardour2.app/Contents/Resources/etc/gtk-2.0") then + `cp -R etc/gtk-2.0 Ardour2.app/Contents/Resources/etc/` + end + if not File.exist?("Ardour2.app/Contents/Resources/etc/pango") then + `cp -R etc/pango Ardour2.app/Contents/Resources/etc/` + end + if not File.exist?("Ardour2.app/Contents/Resources/etc/fonts") then + `cp -R /opt/local/etc/fonts Ardour2.app/Contents/Resources/etc/` + end + + if not File.exist?("Ardour2.app/Contents/Resources/etc/profile.d") then + `cp -R etc/profile.d Ardour2.app/Contents/Resources/etc/` + end + + # share stuff + + if not File.exist?("Ardour2.app/Contents/Resources/share") then + Dir.mkdir "Ardour2.app/Contents/Resources/share" + end + + if not File.exist?("Ardour2.app/Contents/Resources/share/ardour2") then + Dir.mkdir "Ardour2.app/Contents/Resources/share/ardour2" + Dir.mkdir "Ardour2.app/Contents/Resources/share/ardour2/templates" + `cp -R ../../gtk2_ardour/icons ../../gtk2_ardour/pixmaps ../../gtk2_ardour/splash.png Ardour2.app/Contents/Resources/share/ardour2/` + `cp ../../templates/*.template Ardour2.app/Contents/Resources/share/ardour2/templates/` + end + + # go through and recursively remove any .svn dirs in the bundle + svndirs = `find Ardour2.app -name .svn -type dir`.split("\n") + svndirs.each do |svndir| + `rm -rf #{svndir}` + end + + # make DMG + `rm -rf macdist` + Dir.mkdir("macdist") + `cp -r README.rtf COPYING Ardour2.app macdist/` + dmgname = "Ardour-#{version}" + `rm -f #{dmgname}.dmg` + $stdout.print("\nCreating DMG\n") + `hdiutil create -fs HFS+ -volname #{dmgname} -srcfolder macdist #{dmgname}.dmg` + + + $stdout.print("\nDone\n") + +else + # zip up libdir and bindir + zipfile = "binlib_"+`uname -p`.strip() + ".zip" + $stdout.print("Zipping up #{libdir} and #{bindir} into #{zipfile}...\n") + `zip -rq #{zipfile} #{libdir} #{bindir}` + $stdout.print("Copy #{zipfile} to other platform's osx_packaging dir and run app_build.rb\nthere to complete universal build.\n") + + +end + + |