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 では
- 未インストールの依存 ports を先にインストール
- インストール済の ports のうち、アップグレードすべきものをインストール
という順番で処理されるようになってます。 簡単なケースではこれで問題ないわけですが、
- 未インストールの ports が、インストール済の ports の新しいバージョンを必要とする
なんてケースでは問題が起こります。例えば、
LIB_DEPENDS= slang.2:${PORTSDIR}/japanese/libslang
と書いてある時に、インストールされてる libslang の shlib version が古い時、などですね。 この場合は、下手すると同一 ports の古いバージョンと新しいバージョンが 混在することになるので(portupgrade が処理出来ないから bsd.port.mk の方が処理するわけだけど、こいつは「アップグレード」処理は出来ない」)、 より困ったことになるかも。:(
ただ、これを実装しようとすると、bsd.port.mk の依存関係まわりの処理を Ruby で丸々再実装しないといけない気がするので、ちょっと気が重い… いろんな場面で「車輪の再発明」が発生するのは、何とかならんかなぁ… とか言い出すと、「make ステ」って話にしかならんので、言わないことにするわけですが。