2014年2月21日金曜日

(FreeBSD) make install packageするとpkg-staticがcore dump

FreeBSDの新しいパッケージ管理の仕組み「pkgng」の使い方がだんだんわかってきたところです。



ついでに、portupgradeをやめてportmasterに移行しました。portmasterのほうがキビキビ動作して、気持ちいいです



バイナリパッケージは、公式のものではなく、自前でビルドしたものを使えるようにしておきたいと思っているので、make packageとかやるんですけど・・・

make packageは、すでにインストール済みのファイルからパッケージを作成する

という動作に、いつのころからか変わっていたんですね。昔は、make installもやったあとに、パッケージを作成していたと思ってたんですが、今は、make packageだけでは、installはしてくれないようです。



portsをmakeしたり、portmasterを実行したときに、依存関係のあるportsもついでにビルドしてインストールされたりアップデートされますが、それらのバイナリパッケージも作成したいため、/etc/make.confにてDEPENDS_TARGET=install package と書いておいたら、pkg-staticがcore dumpするようになりました。



gdbでちょっとだけ調べてみたのですが・・・



This GDB was configured as "amd64-marcel-freebsd"...
Core was generated by `pkg-static'.
Program terminated with signal 11, Segmentation fault.
#0  0x00000000005a0bcc in ucl_obj_ref (obj=0x0) at ucl.h:743
743             obj->ref ++;
[New Thread 801009400 (LWP 100485/pkg-static)]
(gdb) where
#0  0x00000000005a0bcc in ucl_obj_ref (obj=0x0) at ucl.h:743
#1  0x00000000005a0b99 in ucl_parser_get_object (parser=0x80105de70)
    at /....../ports/ports-mgmt/pkg/work/pkg-1.2.6/libpkg/../external/libucl/src/ucl_util.c:230
#2  0x0000000000564795 in pkg_parse_manifest_file (pkg=0x8010611c0,
    file=0x7fffffffce60 "/....../ports/x11/smproxy/work/.metadir/+MANIFEST", keys=0x8010258d0) at pkg_manifest.c:748
#3  0x000000000043d83d in pkg_create_staged (
    outdir=0x7fffffffd954 "/usr/ports/packages/10-stable/amd64/All",
    format=TXZ,
    rootdir=0x7fffffffd875 "/....../ports/x11/smproxy/work/stage",
    md_dir=0x7fffffffd8bc "/....../ports/x11/smproxy/work/.metadir",
    plist=0x7fffffffd906 "/....../ports/x11/smproxy/work/.PLIST.mktmp", old=false) at pkg_create.c:248
#4  0x0000000000407e93 in exec_create (argc=1, argv=0x7fffffffd570)
    at create.c:262
#5  0x000000000040bd47 in main (argc=10, argv=0x7fffffffd528) at main.c:774
Current language:  auto; currently minimal



#0  0x00000000005a0bcc in ucl_obj_ref (obj=0x0) at ucl.h:743
743             obj->ref ++;
(gdb) l
738      * Icrease reference count for an object
739      * @param obj object to ref
740      */
741     static inline ucl_object_t *
742     ucl_obj_ref (ucl_object_t *obj) {
743             obj->ref ++;
744             return obj;
745     }
746
747     /**
(gdb) p obj
$1 = (ucl_object_t *) 0x0



nullポインタなわけですね。



NULLかどうかチェックする処理を追加してみたのですが、



===>  Installing for xcalc-1.0.5
===>  Checking if x11/xcalc already installed
===>   Registering installation for xcalc-1.0.5 as automatic
Installing xcalc-1.0.5... done
===>  Building package for xcalc-1.0.5
pkg-static: fopen(/....../ports/x11/xcalc/work/.metadir/+MANIFEST): No such file or directory
*** Error code 1



Stop.
make[3]: stopped in /usr/ports/x11/xcalc
*** Error code 1



となるので、まあそうカンタンには直らないバグのようです。


なぜNULLになるのか、すぐにはわからないので諦めました。



bsd.port.mkを見ると、package-recursiveというターゲットがあるので、それでもよさそうな気がしますが、直近にインストールしたものだけでなくて、全部?のバイナリパッケージを作ってしまうような感じがしました。





20140220



0 件のコメント:

コメントを投稿