これは ports@FreeBSD.ORG に流れた ports の ELF 化のガイドを 田口さん <taguchi@tohoku.iij.ad.jp> が翻訳したものです。
原文は http://www.FreeBSD.org/~asami/elf-guidelines.txt からも参照できます。
Subject: ELF transition for ports (revised)
From: asami@cs.berkeley.edu (Satoshi Asami)
To: current@FreeBSD.ORG, ports@FreeBSD.ORG
Date: Wed, 16 Sep 1998 18:14:55 -0700 (PDT)
Reply-to: ports@FreeBSD.ORG
これは,ports を ELF にするための,そして来るべきELF界で portsを用いる
ためのガイドラインです.ELF化された ports を用いるには,最新の
bsd.ports.mk(1.289 や 1.227.2.53) が必要になります.(最新の ports を使
いたいのであるならば,-stable ユーザであっても最新の bsd.ports.mk が必
要であることに注意してください.)
aout共有ライブラリのバージョン番号に関するポリシーが,いくぶん変更され
ていることに注意してください.ELF変換のためにバージョン番号を増加させ
ることは必須ではなくなりました.
aout と ELF 双方で ports tree が動くよう我々が修正を完了するまでは,辛抱
してください.ports のいかなる破損も報告願います.
以上.
あさみ (と,偉大なるELFチーム)
-------
(1) aout なライブラリは /usr/local/lib 直下には置かないようにし,
"aout"サブディレクトリに待避させておきます.待避させておかないと,
elf な ports は何も考えずに aout ライブラリを上書きしてしまうでしょ
う.-current の src/Makefile 中のターゲット "move-aout-libs"
("aout-to-elf" から呼び出される) は,この作業を行ってくれます.
標準ディレクトリに elfと aout双方のライブラリがある場合でも安全に呼
び出せます.
(2) ports木は,そのマシンの形式でpackageを生成します.これは,
2.2-stable ならば aout 形式で,3.0-current であるならば
`objformat` が何を返すかによって elf か aout かが決定されることを
意味します.また,一度 (1) の手順で elf 化してしまう(すなわち,
aout ライブラリをサブディレクトリに移動してしまう)と,aout ライブ
ラリの生成はサポートされません(どうするべきか知ってるならば,動き
はするでしょう.ただし, あくまで自己責任で行うこと).
(3) bsd.port.mk は変数 PORTOBJFORMAT を "aout" や "elf" に設定し,それ
を環境変数 CONFIGURE_ENV と SCRIPTS_ENV と MAKE_ENV にexportします
(-stable ではこれは常に "aout" です).また,PLIST_SUB にも
"PORTOBJFORMAT=${PORTOBJFORMAT}" として渡されます(詳細は(7)参照).
本変数は以下の行を使って設定されます:
PORTOBJFORMAT!= test -x /usr/bin/objformat && /usr/bin/objformat || echo aout
ports のmake 処理は何を行うかこの変数を使って決定できます.ただし,
ports 自身の configure スクリプト(や,それに類するもの)が ELF であ
るか否かを正しく判別できるならば,あえて PORTOBJFORMAT を使う必要はあり
ません.
(3a) ELF ライブラリは "libfoo.so.M" と言う形式で呼ばれねばなりません.
("libfoo.so.M.N" という形式で生成することは許されません.が,シン
ボリックリンクで "libfoo.so.M" からのリンクを張ってもだめです. )
また,"ld" を直接使う代わりに "cc -shared" を使う場合の変更点は
コマンドラインに "-Wl,-soname,libfoo.so.M" を追加する
だけです.
(3b) aout ライブラリは "libfoo.so.M.N" と言う形式で呼ばれねばなりませ
ん.この場合,"libfoo.so.M" からのリンクは張られるべきではありま
せん.
elf 共有ライブラリのバージョン番号は,ports が非互換性のある変更を
加えられた時に,増加されるべきです.その時点で,aout のマイナーバー
ジョンは 0 にされ,以後はずっと 0のままになります(これは,
pkg/PLIST 中には elf 共有ライブラリ名のみが書き込まれることを意味
します.詳細は(4)参照).
(4) pkg/PLIST は,aout のマイナーバージョン番号が0である場合は,短い
(elfな)共有ライブラリ名が書かれるべきです.長い(aoutな)名前は,そ
れ以外の場合(aoutなマイナーバージョン番号が0でない場合)です.
bsd.port.mk は共有ライブラリ名が短い形式の場合,
かつ,PORTOBJFORMAT==aout の場合に,その末尾に ".0" を追加します.
一方,PORTOBJFORMAT==elf かつ,長い共有ライブラリ名の場合は,マイ
ナーバージョン番号を削除します.
(5) ports は,"libfoo.so" が実際の共有ライブラリ(aoutならば
libfoo.so.M.N,elfならば libfoo.so.M)をさすようなシンボリックリン
クをインストールせねばなりません.このリンクはpkg/PLISTにも記
述されねばなりません.
(6) すべての ports の Makefile は,LIB_DEPENDS からマイナーバージョン
番号を削除するよう編集されねばなりません.また,regexp機能の使用も
やめねばなりません(例えば,"foo\\.1\\.\\(33|40\\)" -> "foo.2" とし
ます.これは, bsd.port.mk内で "grep -wF"を使ってマッチン
グされます.
(7) Makefile 中の ldconfig 行は:
${SETENV} OBJFORMAT=${PORTOBJFORMAT} ${LDCONFIG} -m ....
となるべきであり,pkg/PLIST では:
@exec /usr/bin/env OBJFORMAT=%%PORTOBJFORMAT%% /sbin/ldconfig -m ...
@unexec /usr/bin/env OBJFORMAT=%%PORTOBJFORMAT%% /sbin/ldconfig -R
とするべきです.