これは 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 とするべきです.