2006年3月26日日曜日

(FreeBSD) portversionでportsのバージョンを確認

FreeBSDのportsは、portupgradeでアップデートすることができますが、じゃあ、どのportsをアップデートすればいいのか・・・?



そうときのために、portversionというコマンドが用意されています。



portsのsysutils/portupgradeをインストールすると、portversionコマンドも一緒にインストールされます。



portversionコマンドを使うと、portsで現在インストールされているソフトウェアが、最新版かどうかをチェックできます。たとえば「portversion -v」と実行すると、こんな風に表示されます(-vオプションをつけないと、ちょっと寂しい表示になります)。



# portversion -v
OpenSSH-askpass-1.2.2.2001.02.24  =  up-to-date with port
Xaw3d-1.5E_1                =  up-to-date with port
aalib-1.4.r5_1              <  needs updating (port has 1.4.r5_2)
acroreadwrapper-0.0.20060221  =  up-to-date with port
adobe-cmaps-20051217        =  up-to-date with port
adzap-20060203              =  up-to-date with port
amspsfnt-1.0_3              =  up-to-date with port
analog-6.0_1,1              =  up-to-date with port
apache-2.0.55_3             <  needs updating (port has 2.0.55_4)
(以下略)



  • 「=」マークがついていれば、最新版がインストールされている


  • 「<」マークがついていれば、最新版がでているのでアップデートしたらどうよ?


という意味です。



・・・なんですが、「<」マークがついているものが、予想以上にたくさん表示されているなぁ、って思いませんか?



原因は、portsのバージョン番号の割り当て方法にあります。たとえば、



boehm-gc-6.6_2              <  needs updating (port has 6.6_3)



という風に表示されている場合、



boehm-gcというソフトウェアが今「6.6_2」がインストールされているけど、portsの最新バージョンは「6.6_3」になっているよ、



という意味ですが、



  • もともとの配布されているソフトウェアのバージョンは「6.6」


  • 「_(アンダースコア)」マークのあとについている「_3」というのは、FreeBSD側でportsにしたときに割り当てたバージョン


です。世の中で流通されているソフトウェアを、portsによってFreeBSD用にカスタマイズしてインストールするさいに、何らかの不具合があってうまくインストールできないときや、もしくは、セキュリティホールがあって本家のソフトはアップデートされていないけど対応が必要だと判断された場合などは、portsが変更されていきます。そのportsの変更が行われるたびに「_」マークのあとの数字が増えていきます。

ちょっとここで脱線。portsの名前は「boehm-gc」ですが、本家から配布されているソースパッケージの名前はboehm-gcではありません。それを調べるには・・・



まず「ports_glob 'boehm-gc'」というコマンドを実行します。



すると「devel/boehm-gc」と表示されます。これでportsのディレクトリ名がわかります。



/usr/ports/devel/boehm-gc/Makefileをのぞいてみると、「DISTNAME=       gc${PORTVERSION:S/.a/alpha/}」とかかかれています。



この場合シェルの変数置換とか使っててちょっとわかりにくくなっていますが、どうやら「gcほにゃらら」という名前らしいことがわかります。



というわけで「ls /usr/ports/distfiles/gc*」とかやって、distfilesのなかのダウンロード済みのソースパッケージを探してみると、「/usr/ports/distfiles/gc6.6.tar.gz」とかでてきます。これで「gc6.6.tar.gz」だったことが判明します。



Makefileを読めない人は、「cd /usr/ports/devel/boehm-gc/ ; make patch」とか実行しちゃってログメッセージを見れば、もうちょっとわかりやすいかも。



閑話休題。



さてportsのバージョン番号ですが、もしかして「_」のあとの数字が増えただけなら、アップデートする必要・・・ないんじゃないの?と予想できます。ホントは、必ずしもそうとはいえないのですけどね。



まあ自己責任でやって欲しいのですが、「_」のあとの数字を無視して、ソフトの配布元のバージョン番号だけで比較するようなフィルタを書いてみました。マイナーなGNU Awkを使って(笑)。





# cat portversion-filter
#!/usr/local/bin/gawk -f
#
# portversion -v | portversion-filter



$2 == "<" {
    iv = $1;
    jv = $7;
    gsub(/_[0-9]+/,"",iv);
    gsub(/\)$/,"",jv);
    jv2 = jv;
    gsub(/_[0-9]+/,"",jv2);
    tmp = gensub(/.*-([0-9.]+)$/, "\\1", "g", iv);
    if ( tmp != jv2 ) {
        printf("%s\t\t---> %s\n", iv,jv);
    }
}



「portversion-filter」をダウンロード



いやぁ、Awkっていいですよ。perlにくらべたら、シンプルでわかりやすいんですよ。うん。なんでみんな使わないんだろう。



さて使い方ですが、こんなかんじになります。



# portversion -v | ./portversion-filter
aalib-1.4.r5            ---> 1.4.r5_2
curl-7.15.1             ---> 7.15.3
ja-acroread7-7.0.5              ---> 7.0.1,1
ja-samba-3.0.21a,1              ---> 3.0.21b_1,1
lcms-1.14,1             ---> 1.14_1,1
lzo-1.08,1              ---> 1.08_2,1
p5-Digest-1.14          ---> 1.15
p5-HTML-Parser-3.50             ---> 3.51
p5-Mail-SPF-Query-1.997         ---> 1.999.1
p5-Mail-SpamAssassin-3.1.0              ---> 3.1.1
p5-Mail-Tools-1.73              ---> 1.74
qmake-3.3.5             ---> 3.3.6
qt-3.3.5                ---> 3.3.6_2
razor-agents-2.77               ---> 2.80
sdl-1.2.9,2             ---> 1.2.9_2,2
squid-2.5.12            ---> 2.5.13
t1lib-5.1.0,1           ---> 5.1.0_1,1
tiff-3.8.0              ---> 3.8.1
xterm-206               ---> 211



よく見るとバレちゃいますが、バージョン番号の切り出し方法があんまりよくなくて、「1.4.r5」のようにバージョン番号に数字以外のものが含まれているものは、うまく分離できていません。こんなフィルタを書いちゃって、正規表現が得意な方には、笑われちゃいますね。





0 件のコメント:

コメントを投稿