top page > la vie en rose > here

maintain ports


概要

目的は,ports のメンテナーあるいはその補助者として貢献する手順を提示することです.

対象は,ここ二年以内の比較的新しい FreeBSD です.


目次

1. はじめに
2. port の更新
3. ソースへの patch の作成
4. portlint
5. poudriere
6. bugzilla
7. svn diff
8. 参考資料

1. はじめに

ここでは,"ports" は ports 全体を,"port" はその中の個々のプログラムの意味で使います.

最近,なにがしかの port を make install する際に,次のようなメッセージが出るようになりました.
(以下に例示するのは,すべて lang/sbcl です.)

===>   NOTICE:

The sbcl port currently does not have a maintainer. As a result,
it is more likely to have unresolved issues, not be up-to-date, or even be
removed in the future. To volunteer to maintain this port, please create an issue at:

https://bugs.freebsd.org/bugzilla

More information about port maintainership is available at:

https://www.freebsd.org/doc/en/articles/contributing/ports-contributing.html#maintain-port

後者の文書は,packages ならば en-freebsd-doc を,ports ならば misc/freebsd-doc-en を導入していれば,以下のところにもあります.

/usr/local/share/doc/freebsd/en_US.ISO8859-1/articles/contributing/

ちなみに,この ports-contributing.html は最近新設されたものです.

愛用している port が更新されなかったり廃止になるのは困りますが,後者に書かれたメンテナーになるのも敷居が高いです.

一方,前者の方はより「気楽」です. 最新の version や bug fix の状況を日常的に監視しなくても,自分のために最新版を試してみて,うまく行ったら ports として整えて bugzilla で報告するという程度ならできる人も多いかと思います. (移植を必ず成功させなければならないのと,時間があったら挑戦して,うまく行った場合にだけ報告するというのでは大違いです.)

そこで,この気楽な方の貢献の手順を以下に提示致します.

2. port の更新

ある port を新しい version に更新する手順を示します. あくまで一般的な説明であり,port によってはより合理的なやり方もあるでしょう.

当然ですが,既に同じことが行なわれていないか事前に bugzilla で検索して確認しましょう.

(1) ソース等の download
  ここは各々の download 先の流儀に従います.

% fetch http://sourceforge.net/projects/sbcl/files/sbcl/1.3.9/sbcl-1.3.9-source.tar.bz2
% fetch http://sourceforge.net/projects/sbcl/files/sbcl/1.3.9/sbcl-1.3.9-documentation-html.tar.bz2

これらは当面は ports/distfiles/ には置きません.

(2) backup と deinstall

# cd /usr/ports/lang
# cp -pR sbcl sbcl.orig     backup を取ります.

# cd sbcl
# make deinstall            古い version があるならば,消します.

# rm -r work

(3) distinfo の修正
   私は mkdist という名前で shell script を作成しています.[1] それを,ソースのあるところで次のように使います.

% mkdist sbcl-1.3.9-source.tar.bz2 > temp
% mkdist sbcl-1.3.9-documentation-html.tar.bz2  >> temp
# cd /usr/ports/lang/sbcl
# vi distinfo

ここで先ほど作成したファイル temp を読み込み,古い内容と交換します.

なお,distinfo の内容が込み入ったものでなければ,temp でなく直接 distinfo に出力した方が合理的です.

(4) Makefile の修正
  version 等を更新します.

# vi Makefile

distinfoMakefile の修正が正しいことを確認するため,ソースを download してみます.

# make fetch

このやり方でソースが download できるところに置いていない場合には,(1) で download したファイルを ports/distfilescp します. 報告する場合にはその旨を記します.

(5) ソースへの patch の作成
  ここは説明がややこしいので,次節にて詳説します. (この節では作業全体の流れを簡潔に示したいので.)

sbcl 1.3.9 のように,ソースを修正する必要がないならば (6) に進みます.

(6) packing list の修正
  packing list は,ファイル pkg-plist に書かれるか,または Makefile の中の PLIST_FILES の後に書かれます.

pkg-plist があるなら,それを消去します.

# rm pkg-plist

Makefile の中に PLIST_FILES があるなら,その行を消します. (comment out する方が効率が良いでしょう.)

この状態で make install まで進みます.

# make >& log.nullplist
# make install

ここで pkg-plist の雛型を作成します.

# make makeplist > pkg-plist
# vi pkg-plist

一行目の "/you/have/to/check/what/makeplist/gives/you" を消します. また,必要に応じて修正します.

または,その内容を Makefile の中の PLIST_FILES= の後に列挙し,pkg-plist を消します.

(7) 最初から make をやり直す

# make deinstall
# rm -r work
# make >& log.make
# make install >& log.inst

ここで,プログラムが動作すること,マニュアルが表示されることなどを確認します.[2]

うまく行かなければ (5) から繰り返します. ただし,(6) を繰り返すのは,packing list 関連の変更があった場合のみです.

(8) port としてのチェック
   portlintpoudriere を用いて,port としての整合性をチェックします.

エラーが出たら修正し,その内容に応じて (6) または (7) から繰り返します.

(9) patch の作成
  ここまでうまく行ったら,報告用に patch を作成します.[3] 例えば,以下のような batch file を作ります. (ファイル名を mkpat とします.)

#!/bin/csh -f
diff -u Makefile.orig Makefile
diff -u distinfo.orig distinfo
diff -u pkg-plist.orig pkg-plist
diff -u files/patch-doc_info_Makefile.in.orig files/patch-doc_info_Makefile.in

これを用いて次のように patch を作成します.(ファイル名を patch_file とします.)

# mkpat > patch_file

(10) 報告
  bugzilla に報告します. (ここに書き込むためには,ユーザー登録が必要です.)

その内容として,(8) で得られた portlint の console 出力,poudriere の log および (9) で作成した sbcl.tgz はほぼ必須です.

[1] 以下に mkdist を示します.

#!/bin/csh -f
#  see ports/Mk/bsd.port.mk

set arg=`basename $0`

if ( $#argv == 0 )  then
   echo "Usage : $arg filename"
else
   sha256 $argv[1]
   echo "SIZE ("$argv[1]") =" `stat -f %z $argv[1]`
endif

distinfo は,make の option として次のようにして作成することもできます.

# make makesum

出力先は distinfo です. 冒頭に以下のような行が付きますが,この有無に依らず動作は一緒です.[4]

TIMESTAMP = 1470465948

ただこれは,自分でソースを作る人向けの機能だと思います. そこで上記のような使い方をするために mkdist を作りました.

[2]「プログラムが動作することを確認します.」と簡単に書きましたが,確認作業は個人ではやりきれないものもあります. bugzilla への報告ならば「あくまで自分としての使い方の範囲で」と解釈してもらえると思います.

[3] 例として用いた maxima のように FreeBSD 独自のソースの修正,すなわち files/ があり,かつその中のファイルに変更がある場合には,patch を作るのが面倒です. なぜなら,make の際には files/ の中のすべてのファイルが patch と見なされるので,元の patch (.orig) をそこに置いておくことができないのです. 一方 patch を作る際には,それらがそこになければなりません. なので,ファイルを cp -p したり rm したりと作業が煩雑なのです.
  この場合には patch でなく tar ball で送りたいところですが,そうしたら「patch を送ってこい」と言われました.

[4] ただし,patch を送る場合には TIMESTAMP があることを要求されます.

3. ソースへの patch の作成

(1) 先ず,ソースを展開します.

# make extract

ものによっては,この段階で旧 version 用の patch をあてることを試みた方が合理的かもしれません.

# make patch

(2) ソースを修正します.
  それに先立って,修正するファイル名の末尾に .orig を付けた名前のファイルに cp -p しておきます.[1] (Option -p は日付を維持するため.) 既に .orig の付いたファイルがある場合には cp は不要です.

(3) ソースへの patch を作成します.

# cd /usr/ports/lang/sbcl
# make makepatch

これで *.orig という名のファイルを探して patch を作り,それを files に入れてくれます.

files が無ければ mkdir してくれます.

既に files もその中身もある場合,中身をしかるべきところに mv してくれます.

(4) 動作を確認します.

(1) で make extract で留めたならば,work を消してから 2.(6) に行きます.
    (2 回目からは「make patch まで終えている」扱いになります.)

# cd /usr/ports/lang/sbcl
# rm -r work

(1) で make patch まで終えているならば,直接 2.(6) に行きます.

動作に問題があれば (2) に戻ります.

[1] 新規にファイル a.c を作成した場合には,次のようにして空の a.c.orig を作成します.

# touch a.c.orig

逆に既存のファイル a.c を消す場合には,次のようにします.

# mv a.c a.c.orig
# touch a.c

4. portlint

ports-mgmt/portlint を導入します. 以下のように実行します. 結果はすぐに出ます.

# cd /usr/ports/lang/sbcl
# portlint
WARN: Makefile: THREADS appears in PORT_OPTIONS:M, but is not listed in OPTIONS_DEFINE.
WARN: Makefile: [0]: possible direct use of command "sh" found. use ${SH} instead.
WARN: Makefile: possible use of absolute pathname "/usr/bin/nm".
WARN: Makefile: possible use of absolute pathname "/bin/date".
0 fatal errors and 4 warnings found.

参考までに,警告に従って sh${SH} に直したらエラーになりました. 過度に警告に神経質にならず,"ERROR" さえ出なければ良いと考えることにしましょう. (より完全なものにしたいという姿勢は否定しませんが.)

5. poudriere

ports-mgmt/poudriere を導入します. 以下のように実行します.

(1) setup jail

# poudriere jail -c -j 103Ramd64 -v 10.3-RELEASE -a amd64
# poudriere jail -l
JAILNAME  VERSION         ARCH  METHOD TIMESTAMP           PATH
103Ramd64 10.3-RELEASE-p5 amd64 ftp    2016-07-20 00:48:12 /usr/local/poudriere/jails/103Ramd64

(2) ports tree の生成

# poudriere ports -c -m git+https -B main
# poudriere ports -l
PORTSTREE METHOD   TIMESTAMP           PATH
default   portsnap 2016-07-20 01:03:07 /usr/local/poudriere/ports/default

(3) port (この例では sbcl) の変更

# cd /usr/local/poudriere/ports/default/lang
# mv sbcl sbcl.orig
# cp -pR /usr/ports/lang/sbcl .
# cd sbcl
# rm -r work

(4) poudriere の実行 [1]

# poudriere testport -j 103Ramd64 -o lang/sbcl >& log.testport

通常の ports の make と同様に,関連する ports に対しても自動的に poudriere が実行されます. それゆえ,対象によっては長い時間を要します. 二回目以降は,再実行されるのは変更箇所だけなのでより短時間で終わります.

それと,これを実行中に df を見ると凄いことになっています. HDD が壊れたわけではないので,終わるのを待ちましょう.

(5) log のチェック
  log は

/usr/local/poudriere/data/logs/bulk/latest-per-pkg/sbcl/1.3.9,1/103Ramd64-default.log

または

/usr/local/poudriere/data/logs/bulk/103Ramd64-default/latest/logs/sbcl-1.3.9,1.log

にあります. これらの内容は同一でした. (なぜ同じ出力を二通り行なうのかは不明.)

エラーの有無は,このファイルから "Error" という文字列を探せば分かります. と言うか,たいていはそこで止まるので,とりあえずはファイルの末尾を見れば良いです.

poudriere により検出されるエラーには,pkg-plist に関連するものが多いです. そのエラーは stage-qa の部分に出力されます.

エラーがあった場合には,対策を施して (4) に戻ります.

[1] ソースは ports と同様に /usr/ports/distfiles/ から読み込まれます.

6. bugzilla

https://bugs.freebsd.org/bugzilla の最初の画面は次のようになっています.

Welcome to FreeBSD Bugzilla

Use the quick links below, if you want to report a defect or update.

    Report an update or defect to a port   ← これを選ぶ.
    Report an issue with the base system
    Report an issue with the FreeBSD documentation or website

If the above quick links do not suit your needs or if you have an issue in a different area:

    File a Bug

Or see, if the issue has been reported already:   ← この下の枠で検索ができる.

メニューから,[Product] としては [Ports & Packages] を (現在はこれしか選択肢がありません),[Component] としては [Individual Port(s)] を選びます.

報告は,所定の欄に記入したり,必要に応じてこちらからファイルを転送して行ないます. 転送したファイルは "attachment" と呼ばれます. これには 1000 KB の制限がありますので,それを越えていたら gzip で圧縮します. その際には,ファイルの種類として "auto detect" を選びます.

default で設定された検索の範囲に不満な場合には,検索画面の左下にある [Edit Search] をクリックして,表示された画面にて調整します.

7. svn diff

patch を作る場合,修正前のファイルはその時点で最新のものでないと相手に余計な労力を使わせてしまいます. (まあ patch を送っても,必ずしも迅速に検討してもらえるわけでもないのですが.)

ですから,何かしようと思ったら,先ず ports を最新のものにするのが合理的です.[1]

# portsnap fetch     /var/db/portsnap/ に download する.
# portsnap update    /usr/ports/ に展開する.

ある時,うっかりこれを怠ったら「svn diff を使え」と注意されました. マニュアルを読みましたが,ちょっと敷居が高いので,上記のような「ports 丸ごと更新」でしのいできて,svn diff のことは忘れておりました.

今日,そのメモが「発掘」されました. そのうち使えるようになりたいです. 備忘録も兼ねてここに書きます.

[1] 2021.4.1 以降は portsnap は使えず,代わりに git を使います.

8. 参考資料

以下の URL は「FreeBSD port 作成者のためのハンドブック」です.

https://www.freebsd.org/doc/ja_JP.eucJP/books/porters-handbook/index.html

または,misc/freebsd-doc-enmisc/freebsd-doc-ja を導入していれば,各々以下のどころにあります.

/usr/local/share/doc/freebsd/en_US.ISO8859-1/books/porters-handbook
/usr/local/share/doc/freebsd/ja_JP.eucJP/books/porters-handbook/index.html