file で OCaml なファイルの出力情報が変更になってはまった件
近頃の RPM は OCaml なファイルの依存を自動で求めてくれるのだけど、先週末に OCaml を 3.12.0 へ上げた際にその機能が正しく動いてくれなくなって少々悩んだ。とりあえず _use_internal_dependency_generator を 0 にすれば目的の依存は生成されるとはいえ、意図通りに動かないのは気に入らないので調べた。
RPM 4.8.1 や 4.9.0 Beta-1 のソースを見る限りおかしなところはなく、もしかしたら RPM が内部で使っている libmagic に変更があったのではと思った次第。
見事に 5.04 と 5.05 では出力が違った。
$ file --version file-5.04 magic file from /usr/share/misc/magic $ file unix.cmi unix.cmi: Objective caml interface file (.cmi) (Version 012).
$ file --version file-5.05 magic file from /usr/share/misc/magic $ file unix.cmi unix.cmi: OCaml interface file (.cmi) (Version 012)
RPM は「Objective caml」で始まった場合に OCaml に関する依存を求める。もっと正確に言うと internal dependency generator が動く。ちなみに、_use_internal_dependency_generator が 0 のときに問題が起こらない理由は、このときに代わりとして動かす ocaml-find-{provides,requires}.sh が libmagic や file とは無関係なため。
diff -rup file-5.04/magic/Magdir/ocaml file-5.05/magic/Magdir/ocaml --- file-5.04/magic/Magdir/ocaml 2009-09-20 01:28:11.000000000 +0900 +++ file-5.05/magic/Magdir/ocaml 2010-10-07 10:13:42.000000000 +0900 @@ -1,8 +1,8 @@ #------------------------------------------------------------------------------ -# $File: ocaml,v 1.4 2009/09/19 16:28:11 christos Exp $ +# $File: ocaml,v 1.5 2010/09/20 18:55:20 rrt Exp $ # ocaml: file(1) magic for Objective Caml files. -0 string Caml1999 Objective caml +0 string Caml1999 OCaml >8 string X exec file >8 string I interface file (.cmi) >8 string O object file (.cmo) @@ -11,4 +11,4 @@ >8 string Z native library file (.cmxa) >8 string M abstract syntax tree implementation file >8 string N abstract syntax tree interface file ->9 string >\0 (Version %3.3s). +>9 string >\0 (Version %3.3s)
で、RPM 側でどうするかというと、RPM 4.9 系なら __ocaml_maic というマクロを変えればいいだろう。4.8 系だと build/rpmfc.c にパッチか。後者はなんか美しくないね。
diff -up rpm-4.8.1/build/rpmfc.c.file505 rpm-4.8.1/build/rpmfc.c --- rpm-4.8.1/build/rpmfc.c.file505 2010-06-11 17:45:34.000000000 +0900 +++ rpm-4.8.1/build/rpmfc.c 2011-01-24 22:20:00.462914543 +0900 @@ -471,7 +471,7 @@ static const struct rpmfcTokens_s const { "libtool library ", RPMFC_LIBTOOL|RPMFC_INCLUDE }, { "pkgconfig ", RPMFC_PKGCONFIG|RPMFC_INCLUDE }, - { "Objective caml ", RPMFC_OCAML|RPMFC_INCLUDE }, + { "OCaml ", RPMFC_OCAML|RPMFC_INCLUDE }, /* XXX .NET executables and libraries. file(1) cannot differ from win32 * executables unfortunately :( */