diff --git a/src/perl/deployapp.pl b/src/perl/deployapp.pl new file mode 100644 --- /dev/null +++ b/src/perl/deployapp.pl @@ -0,0 +1,114 @@ +#!/usr/bin/perl + +# +# $Id$ +# +# This file is part of the Virtual Leaf. +# +# The Virtual Leaf is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# The Virtual Leaf is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with the Virtual Leaf. If not, see . +# +# Copyright 2010 Roeland Merks. +# +# + +# get dependencies for executable +sub get_frameworks { + my $exec = shift; + my @frameworks = (); + my $fw; +# print "get_frameworks says: exec = $exec\n"; + open deps, "otool -L $exec |"; + # omit first line + ; + + while () { + # look for lines with ".framework", that do not start with / or @. + if (/\.framework/ && !/^[ \t]*\// && !/^[ \t]*\@/) { + chomp; + @line = split; + $f = $line[0]; + # get framework directory name + @line = split(/\//,$f); + for $d (@line) { + if ($d =~ /\.framework/) { + $fw = $d; +# print "get_framework finds framework $d\n"; + last; + } + } + if (defined($fw)) { +# print "get_frameworks pushes $fw on stack\n"; + push @frameworks, $fw; + } + } + } + @frameworks; +} + +$app = $ARGV[0]; +$appdir = $app.".app"; +if ($appdir =~ /\.app\.app/) { + $appdir = $ARGV[0]; +} +$exec = $appdir."/Contents/MacOS/$app"; + +@frameworks = get_frameworks( $exec ); + +#for $f (@frameworks) { +# print "$f\n"; +#} + +# copy all frameworks to appdir/frameworks + +system ("mkdir $appdir/Contents/Frameworks"); +for $fw (@frameworks) { + system "cp -R /Library/Frameworks/$fw $appdir/Contents/Frameworks/."; +} + + +# set identification names for the frameworks + +for $fw (@frameworks) { + $lib = $fw; $lib =~ s/\.framework//g; + system "install_name_tool -id \@executable_path/../Frameworks/$fw/Versions/4.0/$lib $appdir/Contents/Frameworks/$fw/Versions/4.0/$lib"; + + + # tell dynamic linker where to look for the frameworks + system "install_name_tool -change $fw/Versions/4/$lib \@executable_path/../Frameworks/$fw/Versions/4.0/$lib $appdir/Contents/MacOs/$app"; + +} + + +# now, set the frameworks' reciprocal dependencies right +for $fw (@frameworks) { + $lib = $fw; $lib =~ s/\.framework//g; + my @frameworks_of_fw = get_frameworks ( "$appdir/Contents/Frameworks/$fw/Versions/4.0/$lib" ); + for $fwfw (@frameworks_of_fw) { +# print "$fwfw\n"; + $liblib = $fwfw; $liblib =~ s/\.framework//g; + system "install_name_tool -change $fwfw/Versions/4/$liblib \@executable_path/../Frameworks/$fwfw/Versions/4.0/$liblib $appdir/Contents/Frameworks/$fw/Versions/4.0/$lib"; + } +} + +# do the same for additional libs not in a framework depending on frameworks (e.g. libqwt...) +@additionallibs = ( "libqwt.dylib" ); + +for $lib (@additionallibs) { + my @frameworks_of_lib = get_frameworks ( "$appdir/Contents/Frameworks/$lib" ); + for $fwfw (@frameworks_of_lib) { + # print "$fwfw\n"; + $liblib = $fwfw; $liblib =~ s/\.framework//g; + system "install_name_tool -change $fwfw/Versions/4/$liblib \@executable_path/../Frameworks/$fwfw/Versions/4.0/$liblib $appdir/Contents/Frameworks/$lib"; + } +}