MacPortsで入れる代わりに自前でビルドしたライブラリを使ってswftoolsをビルドしてみた
MacPortsでswftools@0.9.2を入れようとしたら失敗した - kanonjiの日記でインストール出来なかったswftoolsを、なんとかビルドしてみました。
状況
- MacPortsのswftoolsは、ソースコード配布版と同じで最新の0.9.2。
- swftoolsはgiflibに依存してる。
- swftools 0.9.2のビルドにgiflib 4.2.0は使えない。
- giflib 4.1.6ならビルド出来るはずという情報あり。
$ port installed giflib The following ports are currently installed: giflib @4.2.0_2+x11 (active)
MacPortsではgiflibは4.2.0になっていて、これだとswftoolのビルドは出来ません。MacPortsはパッケージのダウングレードがとても面倒なので、古いgiflibを自前でビルドして、それを使ってswftoolも自前ビルドする方法を探ってやってみました。
なお、調べながらやってみたということで、これが正しい・最善の方法かどうかはちょっと自信がありません。
$ pwd /Users/myuser/Downloads/swftools-0.9.2 $ ./configure --help [snip] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> LIBS libraries to pass to the linker, e.g. -l<library> CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations.
configure
のヘルプを見たら、最後のほうにLDFLAGS
とLIBS
の2つの環境変数が書いてありました。どちらもライブラリのパスを指定するものみたいで、LDFLAGS
は標準的な場所にないライブラリを指定する的な事が書いてあります。この辺りを調べたら、どうやらいけそうなのでLDFLAGS
を使ってビルドしました。
手順
$ cd /Users/myuser/Downloads/giflib-4.1.6 $ ./configure --prefix=/Users/myuser/local/ $ make $ make install $ cd /Users/myuser/Downloads/swftools-0.9.2 $ LDFLAGS=-L/Users/myuser/local/lib/ ./configure --prefix=/Users/myuser/local/ $ make $ make install
動作すると思われる4.1.6のgiflibをビルドし、swftoolsのconfigure
のコマンド変数として、LDFLAGS=-L/Users/myuser/local/lib/
を設定します。
/Users/myuser/local
には/usr/local
と同じようにbinやlibやinclude
などが作られて、インストールされます。/usr/local/lib
は、ライブラリのパスも通ってるので、古いgiflibを入れると、今後giflib 4.2.0で問題ないものまで4.1.6とくっついちゃうかもと思って、一時的な場所にインストールしました。
$ cd /Users/myuser/local/bin $ ./swf[tab][tab] swfbbox swfc swfcombine swfdump swfextract swfrender swfstrings
無事、giflib 4.1.6を使ってswftoolsのビルドが出来たみたいです。
補足
LDFLAGSにセットする値
./configure --helpを見てください。
LDFLAGS linker flags, e.g. -Lif you have libraries in a
nonstandard directory
LIBS linker flags, e.g. -l.{a,so} if you have nonstandard
libraries to link
とあります。これらの変数は最終的にMakefileで
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=3865&forum=10
$(CC) $(LD_FLAGS) -o taget $(LIBS)
のように使われます。
ですからgccに与えるオプションをそのままわたせばいいと思います。
パスだけじゃなく-L
オプションも含めて書く必要がある。
LIBS
LIBS='-lsocket -lnsl'
http://page.freett.com/ux4800/memo/mh-6.8.4-JP-3.03.inst48.txt
LIBS
は今回使ってないので、よく分からずじまいだけど、検索していた感じ、上記のようにパスよりもライブラリ名?を指定している様子。前述の引用にある説明からすると、socket.a
socket.so
nsl.a
nsl.so
をライブラリに指定した事になるのかな?パスじゃなく名前だけってとこから考えると、依存するライブラリの追加って事で、探す場所はLDFLAGS
と元々システムが把握してるライブラリのパスって事になるんだろうか。
otool -L
リンクしてる共有ライブラリを確認するコマンドotool -L
の結果を追記しておきます。Linuxのldd
は無く、その代わりとなるコマンドです。
$ otool -L local/bin/swfextract local/bin/swfextract: /opt/local/lib/libmp3lame.0.dylib (compatibility version 1.0.0, current version 1.0.0) /Users/myuser/local//lib/libgif.4.dylib (compatibility version 6.0.0, current version 6.6.0) /opt/local/lib/libjpeg.8.dylib (compatibility version 13.0.0, current version 13.0.0) /opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.7) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.7) /opt/local/lib/libfreetype.6.dylib (compatibility version 16.0.0, current version 16.0.0) /opt/local/lib/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6) /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)