daily memorandum 2.3.0

CBUG | FreeBSD | Hiki | Knoppix | Mac | Ruby | W-ZERO3 | Windows | ad | amd64 | ks | linux | momonga | net | print | security | tdiary | unix | www | 会社 | 鯖缶 | 全学ゼミ |


2008-01-06 (Sun)

_ [会社] いまさらあけおめ

冬休み終わりの日に何言ってんだって感じですが(苦笑)。 その前に「月記」になってるのを何とかしろなんて声もありますが。;)

そうそう。日記 ;) に書き忘れてたけど、 退職 日は今年の1月末になりました。ってことで、あとちょっと今の会社で働かないといけません。 ま、半分近くは有休消化だけどね。;)

_ [FreeBSD] Installation problem of depended ports that are not yet instaled.

portupgrade < 2.3 では、依存する ports にまだインストールされてないものがあった場合、 シレッと無視するという「仕様」になってました *1。 まぁ、portupgrade が無視してても ports system (bsd.ports.mk) の方で よきに計らってくれるし、それで大抵問題ないのでふつーの人は気にしないと思うのだけど、 pkgtools.conf に書いた諸々が無視されてしまうなど、 あんまり気持ちのいいものではないわけです。

portupgrade 2.3 でこれがちゃんと実装されたというのをいつかどこかで読んで、 早速試してみたわけです。たしか FreeBSD の xorg が 6.9 から 7.3 に上がった時だから、 去年の9月か10月頃だったかな。

で、その結果は…全然だめぽ。前と全くおんなじ。orz

これってテストしたのかなーとか思いつつ、2日ほど debug してみたけど、 根が深そうなのでそのまま放置。 で、冬休みになってようやくまとまった時間が取れたので、 正月から再度 debug開始。一時期は「アルゴリズムからして完全に見直さないとダメちゃうか?」 って頭抱えてたのだけど、結論としてはこんな修正で直ったようです。;)

 Index: bin/portupgrade
 ===================================================================
 RCS file: /cvsroot/portupgrade/pkgtools/bin/portupgrade,v
 retrieving revision 1.38
 diff -u -r1.38 portupgrade
 --- bin/portupgrade     9 Aug 2007 15:28:05 -0000       1.38
 +++ bin/portupgrade     6 Jan 2008 15:52:37 -0000
 @@ -695,7 +695,7 @@
             make_env = get_make_env(dep)

             # If has not yet installed
 -           if $pkgdb.deorigin(origin)
 +           if !$pkgdb.deorigin(origin)
               install_tasks << dep
               $task_options[dep] = {
                 :make_args => make_args

つか、そもそもこの if 文って常に false になってないか? ってことで、最終的にはこの if 文削除して send-pr しておきました。( ports/119383 )

テスト

  • portupgrade とその依存パッケージのみをインストール
  • portupgrade -N bash を実行

したログを置いておきます。

*1 「これ、実装してないよ」ってコメントが書いてあった。;)

_ [FreeBSD] これで問題はすべて解決したのか?

portupgrade >= 2.3 では

  1. 未インストールの依存 ports を先にインストール
  2. インストール済の ports のうち、アップグレードすべきものをインストール

という順番で処理されるようになってます。 簡単なケースではこれで問題ないわけですが、

  • 未インストールの ports が、インストール済の ports の新しいバージョンを必要とする

なんてケースでは問題が起こります。例えば、

 LIB_DEPENDS=    slang.2:${PORTSDIR}/japanese/libslang

と書いてある時に、インストールされてる libslang の shlib version が古い時、などですね。 この場合は、下手すると同一 ports の古いバージョンと新しいバージョンが 混在することになるので(portupgrade が処理出来ないから bsd.port.mk の方が処理するわけだけど、こいつは「アップグレード」処理は出来ない」)、 より困ったことになるかも。:(

ただ、これを実装しようとすると、bsd.port.mk の依存関係まわりの処理を Ruby で丸々再実装しないといけない気がするので、ちょっと気が重い… いろんな場面で「車輪の再発明」が発生するのは、何とかならんかなぁ… とか言い出すと、「make ステ」って話にしかならんので、言わないことにするわけですが。

[]