MIDI branch becomes trunk
[ardour.git] / tools / osx_packaging / app_build.rb
1 #!/usr/bin/env ruby
2
3 # Ruby script for pulling together a MacOSX app bundle.
4
5 # it will be either powerpc or i386
6 versionline = `grep -m 1 '^ardour_version =' ../../SConstruct`
7 version = versionline.split(" = ")[1].chomp().slice(1..-2)
8 $stdout.printf("Version is %s\n", version)
9
10 arch = `uname -p`.strip()
11 libdir = "lib_" + arch
12 bindir = "bin_" + arch
13
14 ppc_libdir = "lib_powerpc"
15 i386_libdir = "lib_i386"
16 ppc_bindir = "bin_powerpc"
17 i386_bindir = "bin_i386"
18 ppc_binlib = "binlib_powerpc.zip"
19 i386_binlib = "binlib_i386.zip"
20
21 #$stdout.print("libdir is '" + libdir + "'\n")
22
23 # check for the other arch's libbin.zip
24 if arch == "i386" then
25   zipfile = ppc_binlib
26   `rm -rf #{ppc_libdir} #{ppc_bindir}`
27 else
28   zipfile = i386_binlib
29   `rm -rf #{i386_libdir} #{i386_bindir}`
30 end
31
32 if File.exist?(zipfile) then
33   $stdout.print("Found #{zipfile} : unpacking...\n")
34   `unzip -aq #{zipfile}`
35 end
36
37
38 if File.exist?(libdir) then
39   # remove it
40   `rm -rf #{libdir}/*`
41   #Dir.foreach(libdir) {|x| unless ( x[0] == 46 or File.stat(libdir+"/"+x).directory?) then File.delete(libdir + "/" +x) end}
42 else
43     Dir.mkdir libdir
44 end
45
46 if File.exist?(bindir) then
47     Dir.foreach(bindir) {|x| unless x[0] == 46 then File.delete(bindir + "/" +x) end}
48 else
49     Dir.mkdir bindir
50 end
51
52 if not File.exist?(libdir+"/surfaces") then
53    Dir.mkdir(libdir + "/surfaces")
54 end
55
56
57 odir = Dir.getwd
58 Dir.chdir("../..")
59
60 result = `otool -L gtk2_ardour/ardour-#{version}`
61 results = result.split("\n")
62 results.delete_at(0)
63
64 result =  `otool -L libs/ardour/libardour.dylib`
65 results = results + result.split("\n").slice(1,result.size-1)
66
67 result =  `otool -L libs/surfaces/*/*.dylib`
68 results = results + result.split("\n").slice(1,result.size-1)
69
70 results.uniq!
71
72 $stdout.print("Copying libs to #{libdir} ...\n");
73
74 results.each do |s|
75     s = s.split[0]
76     # exclude frameworks, system libraries, X11 libraries, and libjack.
77     unless s =~ /System|\/usr\/lib|\/usr\/X11R6|libjack|:$/ then
78         #$stdout.print("Copying #{s}\n")
79         `cp #{s} #{odir}/#{libdir}/`
80     end
81 end
82
83 # now do it again
84 result =  `otool -L #{odir}/#{libdir}/*.dylib`
85 results = result.split("\n")
86 results.uniq!
87 results.each do |s|
88     s = s.split[0]
89     # exclude frameworks, system libraries, X11 libraries, and libjack.
90     unless s =~ /System|\/usr\/lib|\/usr\/X11R6|libjack|:$/ then
91       sbase = File.basename(s)
92       targfile = "#{odir}/#{libdir}/#{sbase}"
93       #$stdout.print("Targ is : " + targfile + "\n")
94       if not File.exist?(targfile) then
95         #$stdout.print("2nd stage Copying #{s}\n")
96         `cp #{s} #{odir}/#{libdir}/`
97       end
98     end
99 end
100
101
102 Dir.chdir(odir)
103
104 # copy ardour binary to bindir/ardour
105
106
107 if File.exist?("../../gtk2_ardour/ardour-#{version}") then
108    $stdout.print("Copying bin to #{bindir} ...\n");
109    `cp ../../gtk2_ardour/ardour-#{version} #{bindir}/ardour`
110 end
111
112 `cp ../../libs/surfaces/*/*.dylib #{libdir}/surfaces`
113 # remove the basenames from libdir that are in surfaces (copied earlier)
114 `rm -f #{libdir}/surfaces/libardour_cp.dylib`
115 begin
116   Dir.foreach(libdir+"/surfaces") {|x| unless ( x[0] == 46 or x.include?("libardour_cp")) then File.delete(libdir + "/" +x) end}
117 rescue
118 end
119
120
121 # copy gtk and pango lib stuff
122 `cp -R /opt/local/lib/pango #{libdir}/`
123 `cp -R /opt/local/lib/gtk-2.0 #{libdir}/`
124
125 # use our clearlooks
126 `rm -f #{libdir}/gtk-2.0/2.*/engines/libclearlooks.*`
127 # must use .so for it to be found :/
128 `cp ../../libs/clearlooks/libclearlooks.dylib #{libdir}/gtk-2.0/2.10.0/engines/libclearlooks.so`
129
130
131 def lipo_platforms_recurse(src1, src2, target)
132
133   if not File.stat(src1).directory? then
134     # normal file, lets lipo them if it doesn't already exist there
135     isbin = `file #{src1}`.include?("Mach-O")
136     if (! File.exist?(target)) and isbin then
137       if File.exist?(src2) then
138         $stdout.print("Lipo'ing " + target + "\n")
139         `lipo -create -output #{target} #{src1} #{src2}`
140       else
141         # just copy it
142         $stdout.print("Copying " + src1 + "\n")
143         `cp #{src1} #{target}`
144       end
145     else
146       #$stdout.print("Skipping " + target + "\n")
147     end
148   else
149     # directory, recurse if necessary
150     if File.exist?(src2) then
151       # other dir exists, recurse
152       
153       # make targetdir if necessary
154       if not File.exist?(target) then
155         Dir.mkdir(target)
156       end
157       
158       Dir.foreach(src1) do |file| 
159         if file[0] != 46 then
160           src1file = src1 + '/' + file
161           src2file = src2 + '/' + file
162           targfile = target + '/' + file
163           lipo_platforms_recurse(src1file, src2file, targfile)
164         end
165       end
166     else
167       # just copy it recursively to target
168       $stdout.print("Copying dir " + src1 + "\n")
169       `cp -R #{src1} #{target}`
170     end
171   end
172 end
173
174 # lipo stuff together if both platforms libs and bins are here
175
176 if File.exist?(ppc_libdir) and File.exist?(i386_libdir) then
177   $stdout.print("\nBoth platforms in place, lipo'ing...\n");
178   `rm -rf lib/*`
179   `rm -f bin/ardour`
180   lipo_platforms_recurse(ppc_libdir, i386_libdir, "lib")
181   lipo_platforms_recurse(i386_libdir, ppc_libdir, "lib")
182   lipo_platforms_recurse(i386_bindir+'/ardour', ppc_bindir+'/ardour', "bin/ardour")
183
184   # remove existing Ardour2.app
185   `rm -rf Ardour2.app`
186
187   $stdout.print("\nRunning Playtpus to create Ardour2.app  ...\n");
188
189   `/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'`
190
191   $stdout.print("\nCopying other stuff to Ardour2.app  ...\n");
192
193   if not File.exist?("Ardour2.app/Contents/Resources/etc") then
194     Dir.mkdir "Ardour2.app/Contents/Resources/etc" 
195   end
196
197   if not File.exist?("Ardour2.app/Contents/Resources/etc/ardour2") then
198     Dir.mkdir "Ardour2.app/Contents/Resources/etc/ardour2" 
199   end
200   `cp ../../gtk2_ardour/ardour.bindings ../../gtk2_ardour/ardour.colors ../../gtk2_ardour/ardour.menus Ardour2.app/Contents/Resources/etc/ardour2/`
201   `cp ../../ardour.rc ../../ardour_system.rc Ardour2.app/Contents/Resources/etc/ardour2/`
202   `cp ardour2_mac_ui.rc Ardour2.app/Contents/Resources/etc/ardour2/ardour2_ui.rc`
203
204   # copy other etc stuff
205   if not File.exist?("Ardour2.app/Contents/Resources/etc/gtk-2.0") then
206     `cp -R etc/gtk-2.0 Ardour2.app/Contents/Resources/etc/`
207   end
208   if not File.exist?("Ardour2.app/Contents/Resources/etc/pango") then
209     `cp -R etc/pango Ardour2.app/Contents/Resources/etc/`
210   end
211   if not File.exist?("Ardour2.app/Contents/Resources/etc/fonts") then
212     `cp -R /opt/local/etc/fonts Ardour2.app/Contents/Resources/etc/`
213   end
214
215   if not File.exist?("Ardour2.app/Contents/Resources/etc/profile.d") then
216     `cp -R etc/profile.d Ardour2.app/Contents/Resources/etc/`
217   end
218
219   # share stuff
220
221   if not File.exist?("Ardour2.app/Contents/Resources/share") then
222     Dir.mkdir "Ardour2.app/Contents/Resources/share"
223   end
224
225   if not File.exist?("Ardour2.app/Contents/Resources/share/ardour2") then
226     Dir.mkdir "Ardour2.app/Contents/Resources/share/ardour2"
227     Dir.mkdir "Ardour2.app/Contents/Resources/share/ardour2/templates"
228     `cp -R  ../../gtk2_ardour/icons ../../gtk2_ardour/pixmaps ../../gtk2_ardour/splash.png Ardour2.app/Contents/Resources/share/ardour2/`
229     `cp ../../templates/*.template Ardour2.app/Contents/Resources/share/ardour2/templates/` 
230   end
231
232   # go through and recursively remove any .svn dirs in the bundle
233   svndirs = `find Ardour2.app -name .svn -type dir`.split("\n")
234   svndirs.each do |svndir|
235     `rm -rf #{svndir}`
236   end
237
238   # make DMG
239   `rm -rf macdist`
240   Dir.mkdir("macdist")
241   `cp -r README.rtf COPYING Ardour2.app macdist/`
242   dmgname = "Ardour-#{version}"
243   `rm -f #{dmgname}.dmg`
244   $stdout.print("\nCreating DMG\n")
245   `hdiutil create -fs HFS+ -volname #{dmgname} -srcfolder macdist #{dmgname}.dmg`
246
247
248   $stdout.print("\nDone\n")
249
250 else
251   # zip up libdir and bindir
252   zipfile = "binlib_"+`uname -p`.strip() + ".zip" 
253   $stdout.print("Zipping up #{libdir} and #{bindir} into #{zipfile}...\n")
254   `zip -rq #{zipfile} #{libdir} #{bindir}`
255   $stdout.print("Copy #{zipfile} to other platform's osx_packaging dir and run app_build.rb\nthere to complete universal build.\n")
256
257
258 end
259
260