file で OCaml なファイルの出力情報が変更になってはまった件

近頃の RPMOCaml なファイルの依存を自動で求めてくれるのだけど、先週末に 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 :( */