サーバいじくり雑記

2013年2月23日

FreeBSDのbuildworldでヘッダファイルの問題でビルドできないとき〜

Filed under: ソフト, FreeBSD — bompopo @ 2:46 PM

Stableを追いかけていると、新しいヘッダファイルを使うようになった時やヘッダファイルの中身が変更された時などでbuildworldが通らないことがあります。
エラーの出るディレクトリを場当たり的に-I/usr/src/include -I/usr/src/sys等をmake.confに書いてもいいですがかなり面倒臭いです。
最初からCFLAGSに上記を設定しておけばと思われるかもですが、実際にはそれを設定することでmakeが通らなくなる箇所もあるのです。特にlegacyなツール類がそれで、それらはbuildの際にlegacyなincludeを参照するように内部で処理されています。

そもそもすでにインストールされている旧バージョンのヘッダファイルやライブラリを使うのがおかしいんじゃねーのかYO?

ということで、新しいバージョンのヘッダファイル郡を先に作業領域にインストールし、コンパイラのデフォルト参照先をそこに設定してからbuildworldを通す方法を取ることに。
mtreeコマンドとかでディレクトリ作成できると思うのですが使い方がイマイチなのでちょっと下手なことを3行目でしています。

$ cd /usr/src
# ヘッダファイルインストール先ディレクトリ郡を作成します
$ find /usr/include -type d | sed -re 's#^/#/tmp/buildheaders/#g' | xargs mkdir -p
# ヘッダファイルをビルドします
$ sudo env MAKEOBJDIRPREFIX=/var/tmp/obj make -j8 build-headers DESTDIR=/tmp/buildheaders/
# ヘッダファイルをインストールします
$ sudo env MAKEOBJDIRPREFIX=/var/tmp/obj make -j8 install-headers DESTDIR=/tmp/buildheaders/

後はbuildworldからinstallworldまでやりますが、コンパイラ向け環境変数とCFLAGS/LDFLAGSを少しいじります。デフォルトでは/usr/includeを見に行くコンパイラが使う環境変数C_INCLUDE_PATHとCPLUS_INCLUDE_PATHを先ほどインストールした新しいバージョンのディレクトリに設定します。更にデフォルトでは/libや/usr/libのライブラリをリンクするのでbuild作業ディレクトリのライブラリのパスをCFLAGSとLDFLAGSに追加しています。

$ sudo env MAKEOBJDIRPREFIX=/var/tmp/obj \
 CFLAGS="-L/var/tmp/obj/usr/src/tmp/lib/ -L/var/tmp/obj/usr/src/tmp/usr/lib/" \
 LDFLAGS="-L/var/tmp/obj/usr/src/tmp/lib/ -L/var/tmp/obj/usr/src/tmp/usr/lib/" \
 C_INCLUDE_PATH=/tmp/buildheaders/usr/include/ \
 CPLUS_INCLUDE_PATH=/tmp/buildheaders/usr/include/ \
 make buildworld

これで万能というわけでは無いと思いますが、これらをしなければたまにstableおっかけができなくなる私は何か致命的な間違いを犯している気がしてならない。
普通はどーすんの?教えて!

広告

コメントする »

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。