libruby.1.dylib うめこむやつ
http://rubycocoa.sourceforge.net/EmbedRubyCocoa の
require 'pathname'
exec = File.join(ENV['TARGET_BUILD_DIR'], ENV['EXECUTABLE_PATH'])
old = Pathname.new('/usr/lib/libruby.1.dylib').realpath
new = '@executable_path/../Resources/libruby.1.dylib'
system("install_name_tool -change '#{old}' '#{new}' '#{exec}'") or exit 1ってうまくいかないようなきがする。Contents/MacOS/APPNAME は otool -L すると libruby にリンクしてなくて、@executable_path/../Frameworks/RubyCocoa.framework/Versions/A/RubyCocoa にリンクしてるし、実際 libruby にリンクしてるのはこっちのほう。install_name_tool の挙動を勘違いしていなければ、たんにこれは指定されたファイルの Mach-O dylib のパスを書きかえるだけだろうから、これだと意図したこと (バンドル内の libruby よむ) ようにならない?
Chemr とかでは結局 standalonefy してあつめられる .bundle とかの libruby.1.dylib へのリンクも一緒に書きかえるようにしてみた。
# in 'package' task
# copy libruby.1.dylib
sh %{rubycocoa standaloneify "build/#{DEFAULT_CONFIGURATION}/#{APPNAME}.app" "image/#{APPNAME}.app"}
system_libruby = Pathname.new("/usr/lib/libruby.1.dylib").realpath
bundle_libruby = "image/#{APPNAME}.app/Contents/Resources/libruby.1.dylib"
linked_binary = "image/#{APPNAME}.app/Contents/Frameworks/RubyCocoa.framework/Versions/A/RubyCocoa"
(Pathname.glob("image/**/*.{bundle,dylib}") + [linked_binary]).each do |l|
sh %{install_name_tool -change '#{system_libruby}' '@executable_path/../Resources/libruby.1.dylib' '#{l}'}
end
cp system_libruby, bundle_librubysudo mv /usr/lib/libruby.1.dylib /usr/lib/libruby.1.dylib_
して起動することを確認してみた。
(たぶん) 完全にスタンドアロンな Chemr と Amalgam
- http://lab.lowreal.net/test/amalgam/Amalgam.2007-11-04.dmg
- http://lab.lowreal.net/test/chemr/Chemr.2007-11-04.dmg
起動バイナリを置きかえて DYLD_LIBRARY_PATH を設定するとかでもいいのかなぁ。この環境変数がどれぐらい強いのかよくわからないけど