2011-03-16
■ /usr/local/lib/ruby/site_ruby/1.8/pkgtools.rb:953:in `initialize': ArgumentError (ArgumentError)

portupgrade でエラー出た。なんだろこれ。
freebsd74-1# pkgdb -u
---> Updating the pkgdb
freebsd74-1# portupgrade -na | & tee pna
---> Session started at: Wed, 16 Mar 2011 18:04:03 +0900
---> Upgrade of x11/dri2proto started at: Wed, 16 Mar 2011 18:07:11 +0900
---> Upgrading 'dri2proto-2.2' to 'dri2proto-2.3' (x11/dri2proto)
OK? [no]
(snip)
OK? [no]
---> Upgrade of devel/libpciaccess ended at: Wed, 16 Mar 2011 18:07:13 +0900 (consumed 00:00:00)
---> ** Upgrade tasks 120: 7 done, 0 ignored, 0 skipped and 0 failed
---> Skipping 'bsdpan-LWP-MediaTypes-6.01' because it is held by user (specify -f to force)
---> Session ended at: Wed, 16 Mar 2011 18:07:14 +0900 (consumed 00:03:10)
/usr/local/lib/ruby/site_ruby/1.8/pkgtools.rb:953:in `initialize': ArgumentError (ArgumentError)
from /usr/local/sbin/portupgrade:1004:in `new'
from /usr/local/sbin/portupgrade:1004:in `do_upgrade'
from /usr/local/sbin/portupgrade:814:in `main'
from /usr/local/sbin/portupgrade:810:in `each'
from /usr/local/sbin/portupgrade:810:in `main'
from /usr/local/lib/ruby/1.8/optparse.rb:791:in `initialize'
from /usr/local/sbin/portupgrade:231:in `new'
from /usr/local/sbin/portupgrade:231:in `main'
from /usr/local/sbin/portupgrade:2219
freebsd74-1#
ためしに、bsdpan-LWP-MediaTypes-6.01 をアンインストールして、再度やってみた。
freebsd74-1# pkg_deinstall bsdpan-LWP-MediaTypes-6.01
---> Deinstalling 'bsdpan-LWP-MediaTypes-6.01'
[Updating the pkgdb <format:bdb_btree> in /var/db/pkg ... - 324 packages found (-1 +0) (...)(? bsdpan-L
WP-MediaTypes-6.01) done]
freebsd74-1# portupgrade -na | & tee pna
---> Session started at: Wed, 16 Mar 2011 18:14:50 +0900
---> Upgrade of x11/dri2proto started at: Wed, 16 Mar 2011 18:17:43 +0900
---> Upgrading 'dri2proto-2.2' to 'dri2proto-2.3' (x11/dri2proto)
OK? [no]
(snip)
OK? [no]
---> Upgrade of x11-fonts/libfontenc ended at: Wed, 16 Mar 2011 18:17:44 +0900 (consumed 00:00:00)
---> ** Upgrade tasks 119: 4 done, 0 ignored, 0 skipped and 0 failed
---> Skipping 'bsdpan-Net-HTTP-6.00' because it is held by user (specify -f to force)
---> Session ended at: Wed, 16 Mar 2011 18:17:45 +0900 (consumed 00:02:54)
/usr/local/lib/ruby/site_ruby/1.8/pkgtools.rb:953:in `initialize': ArgumentError (ArgumentError)
from /usr/local/sbin/portupgrade:1004:in `new'
from /usr/local/sbin/portupgrade:1004:in `do_upgrade'
from /usr/local/sbin/portupgrade:814:in `main'
from /usr/local/sbin/portupgrade:810:in `each'
from /usr/local/sbin/portupgrade:810:in `main'
from /usr/local/lib/ruby/1.8/optparse.rb:791:in `initialize'
from /usr/local/sbin/portupgrade:231:in `new'
from /usr/local/sbin/portupgrade:231:in `main'
from /usr/local/sbin/portupgrade:2219
freebsd74-1#
どうすりゃいいんだ。
環境:
freebsd74-1# uname -a FreeBSD freebsd74-1.local 7.4-RELEASE FreeBSD 7.4-RELEASE #0: Thu Feb 17 03:51:56 UTC 2011 root@walker.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386 freebsd74-1#
freebsd74-1# diff -u /usr/local/etc/pkgtools.conf.sample /usr/local/etc/pkgtools.conf
--- /usr/local/etc/pkgtools.conf.sample 2011-03-16 16:21:53.000000000 +0900
+++ /usr/local/etc/pkgtools.conf 2011-03-16 18:26:10.000000000 +0900
@@ -384,6 +384,9 @@
# }
MAKE_ARGS = {
+ '*' => [
+ 'WITHOUT_X11=1',
+ ],
}
MAKE_ENV = {
freebsd74-1#
freebsd74-1# grep -C4 'bsdpan' /usr/local/etc/pkgtools.conf
# cf. pkg_glob(1), ports_glob(1)
#
# e.g.:
# HOLD_PKGS = [
# 'bsdpan-*',
# 'x11*/XFree86*',
# ]
HOLD_PKGS = [
'bsdpan-*',
]
# IGNORE_MOVED: array
#
freebsd74-1#
2009-05-17
■ devel/libmba Shared object "libmba.so.0.9" not found

devel/libmba という ports がある。C 言語用のライブラリだ。
- libmba - A library of generic C modules
- http://www.ioplex.com/~miallen/libmba/
これをインストールして使おうとすると、うまく動かない。
まず、こんなプログラムを書いた:
%cat myhexdump.c
#include <stdio.h>
#include <mba/hexdump.h>
int main(int argc, char **argv) {
int arr[] = {0xff, 0xaa, 0x30, 0x31};
hexdump(stdout, arr, sizeof(int)*4, 16);
return 0;
}
これを、次のようにしてコンパイルした
%cc -pipe -I/usr/local/include -c myhexdump.c %cc -o myhexdump -L/usr/local/lib -lmba myhexdump.o
動かそうとすると、怒られた
%./myhexdump /libexec/ld-elf.so.1: Shared object "libmba.so.0.9" not found, required by "myhexdump"
しょうがないので、/usr/local/lib ディレクトリを調べてみた
%cd /usr/local/lib %ls -l libmba* -rw-r--r-- 1 root wheel 254720 May 17 17:57 libmba.a lrwxrwxrwx 1 root wheel 11 May 17 17:57 libmba.so@ -> libmba.so.0 -rwxr-xr-x 1 root wheel 208372 May 17 17:57 libmba.so.0*
確かに、"libmba.so.0.9" ってのは無い。"libmba.so.0" だったらあるんだけどね。
なので、無理やり "libmba.so.0.9" を、「あるように」した
%su Password: #ln -s libmba.so.0 libmba.so.0.9 #ls -l libmba* -rw-r--r-- 1 root wheel 254720 May 17 17:57 libmba.a lrwxrwxrwx 1 root wheel 11 May 17 17:57 libmba.so@ -> libmba.so.0 -rwxr-xr-x 1 root wheel 208372 May 17 17:57 libmba.so.0* lrwxr-xr-x 1 root wheel 11 May 17 21:42 libmba.so.0.9@ -> libmba.so.0
先ほどのディレクトリに戻って、再度実行
%./myhexdump 00000: ff 00 00 00 aa 00 00 00 30 00 00 00 31 00 00 00 |........0...1...|
うまく行きました。
もうちょっと、調べてみた
ちなみに、libmba の version とか、私の FreeBSD の version は、こうです
%pwd /usr/ports/devel/libmba %head Makefile # ex:ts=8 # Ports collection makefile for: libmba # Date Created: Sep 24, 2002 # Whom: ijliao # # $FreeBSD: ports/devel/libmba/Makefile,v 1.22 2009/03/09 19:29:03 miwi Exp $ # PORTNAME= libmba PORTVERSION= 0.9.1 %uname -prs FreeBSD 7.2-RELEASE i386
もう一度、make install して、様子を見てやる。そのために、まず make deinstall から
#make deinstall ===> Deinstalling for devel/libmba ===> Deinstalling libmba-0.9.1 #make install ===> Installing for libmba-0.9.1 ===> libmba-0.9.1 depends on shared library: expat.6 - found ===> Generating temporary packing list ===> Checking if devel/libmba already installed ./mktool -i libmba.a /usr/local/lib ./mktool -i -libname mba -libvers 0.9.1 /usr/local/lib ./mktool -i src/mba/dbug.h src/mba/msgno.h src/mba/stack.h src/mba/linkedlist.h src/mba/hashmap.h src/mba/hexdump.h src/mba/cfg.h src/mba/pool.h src/mba/varray.h src/mba/shellout.h src/mba/csv.h src/mba/iterator.h src/mba/text.h src/mba/path.h src/mba/eval.h src/mba/svsem.h src/mba/allocator.h src/mba/suba.h src/mba/time.h src/mba/bitset.h src/mba/svcond.h src/mba/daemon.h src/mba/diff.h src/mba/misc.h /usr/local/include/mba ./mktool -i docs/man/*.3m.gz /usr/local/man/man3 make -f Makefile.bsd platform_specific_install make: cannot open Makefile.bsd. installation successful ===> Running ldconfig /sbin/ldconfig -m /usr/local/lib ===> Registering installation for libmba-0.9.1
なんだ、"make: cannot open Makefile.bsd." って怒られてるじゃん。コケてるのに、"installation successful" って言うなよなぁ。
この、"Makefile.bsd" ってのがぜんぜん見当たらないんだけど、どうしたらいいんだろ。
追記
いろいろ調べて原因がわかりました。
libmba を make してる時の様子をじーっとみていると、当然 so ファイルを作る所も見れるのだけど、そのときのコマンドはこうなってる。(改行を勝手に追加)
gcc -shared -Wl,-soname,libmba.so.0.9 -lutil src/dbug.pic.o src/stack.pic.o src/linkedlist.pic.o src/hashmap.pic.o src/hexdump.pic.o src/msgno.pic.o src/cfg.pic.o src/pool.pic.o src/varray.pic.o src/shellout.pic.o src/csv.pic.o src/path.pic.o src/misc.pic.o src/text.pic.o src/eval.pic.o src/svsem.pic.o src/allocator.pic.o src/suba.pic.o src/time.pic.o src/bitset.pic.o src/svcond.pic.o src/daemon.pic.o src/diff.pic.o -o libmba.so.0
このオプション指定の中の -Wl,-soname,libmba.so.0.9 という部分は、リンカにそのまま渡される部分なのだけど、リンカに対して「 soname は libmba.so.0.9 だよ」と言っている。なのに、実際に作ってるファイルは、最後のオプション指定にあるように libmba.so.0 となっている。くいちがってる。
リンカ ld のマニュアルを見てみると、-soname オプションの説明はこうなってる
-soname=name
ELF の共有オブジェクトを生成する際に、内部の DT_SONAME フィールドに
、指定した name を設定します。実行形式が DT_SONAME フィールドを持つ
共有オブジェクトとリンクされると、実行形式が実行される時に、動的リ
ンカはリンカに与えられたファイル名を使う代わりに DT_SONAME フィール
ドで指定された共有オブジェクトをロードしようとします。
なるほどね。実行形式の中に「おいらを動かすときは "libmba.so.0.9" とリンクしてね」って焼き込まれちゃうんだな。共有オブジェクトの中の DT_SONAME フィールドの値が、実行形式の中に書き込まれちゃう。
なので、make が終わってから、make install する前に work/libmba-0.9.1 に降りていって、先ほどのコマンドを、-soname オプションのところだけ変えて実行してやるという方法でもうまく行きます。
gcc -shared -Wl,-soname,libmba.so.0 -lutil src/dbug.pic.o ...(略)... src/diff.pic.o -o libmba.so.0
これをやってあげることによって、libmba.so.0 の中の DT_SONAME フィールドが "libmba.so.0.9" ではなく "libmba.so.0" になるので、実行形式の中に焼きこまれる値と、実際に存在するファイル名が食い違うってことがなくなる。
以下の記事も大変参考になりました。
- 共有ライブラリ - name-3333’s memo
- http://d.hatena.ne.jp/name-3333/20080516/1210918147
2009-01-30
■ src.conf

めもめも。
FreeBSD source tree のビルドに使う KNOB の settings は、etc/make.conf ではなく、etc/src.conf に書く。
いつからなんだろう。
man 5 src.conf
HISTORY
The src.conf file appeared in FreeBSD 7.0.
マニュアルページ src.conf(5) に列挙してある knob 以外の変数は、もし書いたとしても、使われないぽい。
実験
まず、src.conf が /etc に存在しなかったので作成した。
そして、こんな風に書いた
WITHOUT_PROFILE= YES WITHOUT_PROFILEX= YES
上の、WITHOUT_PROFILE は、マニュアルページ src.conf に書いてある KNOB 変数。
下の、WITHOUT_PROFILEX は、私が勝手に決めた変数。X をくっつけた。
そして、カレントディレクトリはどこでもいいので、次のようにコマンドを打つ。
make -dv -n | & less
(せつめい)
- オプション
"-dv"は、makeがどのような変数と値を持って実行されるのか、を表示させるため。 - オプション
"-n"は、makeに、実際には何もさせないように。(もし、カレントディレクトリにMakefileがあったりしても、これをつけておけばmakeは「何をするつもりか」を表示するだけで実際にはなにもしない。カレントディレクトリに何も無ければ必要なし。) "| & less"で、標準出力に出てきたものだけでなく、標準エラー出力に出てきたものもまとめてlessに渡す。
すると、出力に WITHOUT_PROFILE は出てくるけど、X が付いた WITHOUT_PROFILEX は出てこない。
結論
マニュアルページ src.conf(5) に出てこない変数を、src.conf に書いたって意味無いよ。
参考
src.conf(5)
2007-02-06
■ xorg.conf と Xorg.0.log

xorg.conf と Xorg.0.log をここに張り付けておく。張っておくことで誰かの役に立つかも知れないし、その誰かは将来の私かも知れないし。云々。
xorg.conf は、X Window System の設定ファイルで、X を起動するたびに読み込まれる。どこに置けばいいか、とか、どう書けばいいかについての基本的情報は xorg.conf(5) にある。私は /etc/X11/xorg.conf という場所に置いています。
Xorg.0.log は、X が起動している最中に書き残すログ。特に、xorg.conf に間違ったことを書いたりするとそれを報告してくれるので、設定ファイルを書いたり、変更した時に確認すると思わぬミスの発見に役立ったりする。私の FreeBSD 6.2 上で動いている X Window System Version 6.9.0 では、/var/log/Xorg.0.log という場所に作られる。下に張り付けたのは、startx で X を起動して、なにもせずに終了した時のもの。
実際には、私も xorg.conf の書きかたをしっかりと理解していないので、いろいろ文句をいわれている様子。時間があったらもうちょっと勉強したい。
2007-02-01
■ dic コマンド

FreeBSD を再インストールするたびにこんなコマンドを作るので、次回からそうしなくてもいいようにここにメモ。
#! /bin/sh
if [ ! $# -eq 1 ]; then
echo 'usage: dic word'
exit 1
fi
word=`echo -n "$1" | nkf -Ew`
w3m "http://dic.yahoo.co.jp/dsearch?enc=UTF-8&p=$word&stype=0&dtype=2"
これを /home/your_account/bin に dic という名前で置いて、
% dic internet