1 はじめに
2 スタティックライブラリを作る
スタティックライブラリを作るときの面倒臭さって, .a
ファイルを作るための gcc のオプションやコマンド (ar と ranlib) がすぐに思い出せないことです.
PaperHouse::StaticLibraryTask はスタティックライブラリをコンパイルするための rake タスクです.PaperHouse::ExecutableTask と同じく単純なインタフェースで,gcc のオプションやコマンドを知らなくとも簡単にスタティックライブラリをコンパイルできます.
次の例は hello.c
から libhello.a
をコンパイルする Rakefile の例です.何もむずかしいことはありません.
PaperHouse::StaticLibraryTask.new :libhello do |task| task.sources = 'hello.c' end
rake libhello で libhello.a
をコンパイルできます.必要なコマンドが自動的に呼び出されていることが分かります.
$ rake libhello gcc -H -fPIC -I. -c hello.c -o ./hello.o ar -cq ./libhello.a ./hello.o ranlib ./libhello.a
PaperHouse::ExecutableTask と組み合わせれば,こうしてできたスタティックライブラリに実行ファイルをリンクするのも簡単です.
task :hello => :libhello PaperHouse::ExecutableTask.new :hello do |task| task.ldflags = '-L.' task.sources = 'main.c' end PaperHouse::StaticLibraryTask.new :libhello do |task| task.sources = 'hello.c' end
これを Makefile で書くとなると,少し本気を出さなければいけません.でも PaperHouse を使えばこのようにとてもお手軽です.
3 共有ライブラリを作る
共有ライブラリは PaperHouse::SharedLibraryTask です.スタティックライブラリと違って共有ライブラリではファイル名にバージョン番号が必須なので,.new の第二引数にバージョン番号を渡してください.
PaperHouse::SharedLibraryTask.new :libhello, '0.1.0' do |task| task.sources = 'hello.c' end
rake libhello を実行してみましょう.
$ rake libhello gcc -H -fPIC -I. -c hello.c -o ./hello.o gcc -shared -Wl,-install_name,libhello.so.0 -o ./libhello.so.0.1.0 ./hello.o
何も考えなくても libhello.so.0.1.0 ができました.これで共有ライブラリでもスタティックライブラリでも何でも来いです.
4 おわりに
PaperHouse でスタティックライブラリと共有ライブラリをコンパイルする方法を紹介しました.次回は,Ruby の C 拡張モジュールをコンパイルする方法です.