MacPortsで入れる代わりに自前でビルドしたライブラリを使ってswftoolsをビルドしてみた

MacPortsでswftools@0.9.2を入れようとしたら失敗した - kanonjiの日記でインストール出来なかったswftoolsを、なんとかビルドしてみました。

状況

$ 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のヘルプを見たら、最後のほうにLDFLAGSLIBSの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をビルドし、swftoolsconfigureのコマンド変数として、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. -L if you have libraries in a
nonstandard directory
LIBS linker flags, e.g. -l.{a,so} if you have nonstandard
libraries to link
とあります。

これらの変数は最終的にMakefile
$(CC) $(LD_FLAGS) -o taget $(LIBS)
のように使われます。
ですからgccに与えるオプションをそのままわたせばいいと思います。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=3865&forum=10

パスだけじゃなく-Lオプションも含めて書く必要がある。

LIBS

LIBS='-lsocket -lnsl'

http://page.freett.com/ux4800/memo/mh-6.8.4-JP-3.03.inst48.txt

LIBSは今回使ってないので、よく分からずじまいだけど、検索していた感じ、上記のようにパスよりもライブラリ名?を指定している様子。前述の引用にある説明からすると、socket.asocket.sonsl.ansl.soをライブラリに指定した事になるのかな?パスじゃなく名前だけってとこから考えると、依存するライブラリの追加って事で、探す場所はLDFLAGSと元々システムが把握してるライブラリのパスって事になるんだろうか。

otool -L

リンクしてる共有ライブラリを確認するコマンドotool -Lの結果を追記しておきます。Linuxlddは無く、その代わりとなるコマンドです。

$ 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)

環境

Mac Mac OS X 10.5.8(Leopard
システムにあるgiflib 4.2.0
ビルドに使ったgiflib 4.1.6
ビルドしたswftools 0.9.2