ELF transition for ports

これは 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

    とするべきです.

www@jp.FreeBSD.org
Copyright (C) 1998 The FreeBSD Project (Japan). All rights reserved.
$Date: 1999/08/11 14:57:30 $