ホーム > linux > staticなmapservをビルドする

staticなmapservをビルドする

いろいろあって、共有ライブラリにまったく依存しないmapserv (MapServerのcgi実行ファイル)をビルドする必要ができた。これ、できあがると何かと便利で、たとえば、/etc/ld.so.confに入っていないライブラリを使ってmapservをビルドすると、apacheの.htacessにsetenv LD_LIBRARY_PATH=…って入れたりする必要があるんだけど、場合によっちゃ、諸々の事情でやりづらいこともある。ということで、共有ライブラリに全く依存しないmapservを作って、こんな悩みを一挙に解決する。

今回のポイントは、依存するライブラリについて、全て静的ライブラリ( lib*.a)を用意しなきゃならないということ。現在では、共有ライブラリを使うのが常識になっていて、ディストリビューションによっては、静的ライブラリを用意していないパッケージもある。そんな場合は、自分でビルドするしかない。この作業で苦労するのはビルドするのはmapservだけでなく、依存ライブラリと、その依存ライブラリ(孫ライブラリ?)までビルドしなければならないことなのだ。

ライブラリのビルドで共通して使えるTipsが以下。

  • gcc の実行オプション -static -static-libgcc -pthread はそれぞれ、静的リンク、GCCライブラリの静的リンク、pthreadの静的リンクを表す。付けておくと共有ライブラリが紛れ込んでも静的リンクに縛ってくれるのでミスがすくなくなる。ただし、GCCとGLIBCのビルドには付けない。
  • ./configure に –enable-static を付けておくと、たいてい静的ライブラリのビルドもやってくれる。
  • 静的リンクだと実行ファイルがずいぶんと膨らむのでgccに-O3を付けておくとよい。

以下手順。なお、参考にした手順

まず、VMWareで適当なVMを作る。mapservを実行するマシンのプロセッサに合っていれば良い。今回は、ここで配布されているCentOS 5 Server x86_64の仮想アプライアンスを使って、作業は全てrootでやった(パッケージのインストールとか、いちいちsuするのが、めんどくさかったので。大失敗しても仮想アプライアンスだし)。

次によく使う開発ツールをインストール。とりあえずは、gcc, make, flex, bison, glibc-devel, make, autoconf, automake なんかのパッケージを入れておけばいいと思う。足りないときには逐次インストール。

ビルドひとつめ、gcc。上記の記事を参考にして、下記の通りにビルド。libstdc++とかは多分gcc由来だった気がする。

mkdir build
cd build
CONFIG_SHELL=/bin/ksh
export CONFIG_SHELL
../configure --with-as=/usr/bin/as --with-ld=/usr/bin/ld  --enable-languages=c,c++ --disable-nls
make bootstrap
make install

としておくと良い。なお、CFLAGS、CXXFLAGSは何も付けない方が吉。今回はgcc-4.2.4を使った。

次のビルド、glibc。CentOS5にはglibc-develなんてパッケージがあるけど、静的ライブラリが含まれていない。したがって、自分でビルド。これもgccと同様にCFLAGS、CXXFLAGSは何も付けない。特に注意が必要なのは、/etc/ld.so.confやLD_LIBARARY_PATHのディレクトリにインストールしないこと。やっちゃうと、ほとんどすべてのコマンドが影響されるので、–prefixで指定するよう注意する。

mkdir build
cd build
../configure --enable-static --prefix=/usr/local/static/
make
make install

ほかのソフトウェアは -O3 -static -static-libgcc -pthread でコンパイルする。また、さっきにビルドしたglibcの静的ライブラリをリンクさせるためにLD_LIBRARY_PATHをいじる。

FLAGS="-O3 -static -static-libgcc -pthread"
export CFLAGS=$FLAGS
export CXXFLAGS=$FLAGS
export CPPFLAGS=$FLAGS
export LD_LIBRARY_PATH=/usr/local/static/

configureが通らない場合はconfig.log適宜にgccのオプションや依存ライブラリのバージョンを変える。

今回、ビルドしたソフトウェアは以下のとおり。他に必要なパッケージがあれば適宜にインストールする。geosも入れたかったが、なぜかmapserverのビルドで通ってくれなかったし、今回の用途では不要だったので外した。

  • zlib-1.2.6
  • fontconfig-2.9.0
  • jpeg-6b
  • libiconv-1.14
  • libX11-1.0.99.2
  • libXpm-3.5.6
  • libxcb-0.9.93
  • xcb-proto-0.9.93
  • libgd-2.0.33
  • proj-4.8.0
  • gdal-1.7.3

これらをインストールしたらmapserverをビルドする。今回使ったのは5.6.8。configureのオプションは

./configure --with-gd=static,/usr/local/ --with-gdal=/usr/local/bin/gdal-config --with-wms --with-proj=/usr/local/
make

mapservができあがったら、静的リンクがキチンとできているかチェック。

ldd mapserv
ldd shp2img
# 他の実行ファイルも適宜にチェック。

not a dynamic executable と出れば成功。実行したいサーバーにファイルを転送して実行してみる。

おわり。

カテゴリー: linux タグ:
  1. コメントはまだありません。
  1. トラックバックはまだありません。