2012年12月24日月曜日

portsにあるものを一般ユーザとしてインストールする方法(FreeBSD)

(2014年3月 加筆修正)(2016年7月 加筆修正)

自分がroot権限を持っていないFreeBSDマシンに新しいソフトウェアをインストールするにはどうしたらよいか。 あるいは、自分の管理下のマシンでも、一般ユーザとしてソフトウェアをインストールしたいことがある(例えば、portsシステムで不要なconflictを起こしたくないときなど)。

もちろん、大抵のものはソースコードが公開されていて、自分でコンパイルすればよいのだけれど、FreeBSDにインストールするには、大抵はMakefileの編集が必要で、結構大変。 せっかくportsとして先人が数多のソフトウェアをFreeBSDで使えるように整えてくれたのだから、一般ユーザもportsシステム使えたらいいのにと思う。

このような背景のもと、 最近、games/nethack34をユーザ権限で、homeの下にinstallしてみたので、記録し公開する。 (ユーザ権限でインストールした、真の理由は察してください。)

1. インストール場所の用意、portsの知恵を借りる。

mkdir ~/nethack/
mkdir ~/nethack/ports/
mkdir ~/nethack/ports/distfiles/
cp -r /usr/ports/games/nethack34/* ~/nethack/ports/

2. Makefile を編集する。

portsのdirectoryで普通にmakeしようとすると、rootにしか書き込み権限のないところに作業ディレクトリを作ろうとしたり、logを残そうとしたりしてmakeに失敗する。 だから、さっきコピーしたMakefileを編集する。

~/nethack/ports/Makefileの一番上に、以下を追加する。
DISTDIR= ${HOME}/nethack/ports/distfiles/
PREFIX= ${HOME}/nethack/
WRKDIR= /tmp/work/
TARGETDIR= ${HOME}/nethack/
PORT_DBDIR=/tmp/var/db/ports
INSTALL_AS_USER= yes

3. makeして、配置する。

(この部分を2016年7月に更新しました(次の節の第2段落も削除)。更新前の記述は、取り消し線つきで灰色にした部分。昔は手作業でやっていた。)
cd ~/nethack/ports/
make
で、/tmp/wrok/stage/${HOME}/nethack/の下に一通りのものができる。 これをhomeの下にコピーする。
cp -r /tmp/wrok/stage/${HOME}/nethack/* ${HOME}/nethack/
これでできあがり。必要ならばPathを通しておこう。
cd ~/nethack/ports/
make
make install
でもinstallは途中でsuをしようとして失敗するので、手で配置する。
mkdir ~/nethack/lib/nethack/
mkdir ~/nethack/bin/
cp -r /tmp/work/nethack-3.4.3/dat/* ~/nethack/lib/nethack/
cp /tmp/work/nethack-3.4.3/src/nethack ~/nethack/bin/nethack
この~/nethack/bin/nethackが実行ファイル。
実行したら、permがないとか、saveする場所がないとか怒られたので、以下も実行した。
mkdir nethack/lib/nethack/save/
touch ~/nethack/lib/nethack/perm

4. 補足

上のMakefileの編集内容は、nethackでなくてもどのportsでも同じはず。
nethackの場合は、実行ファイルに$PREFIXがあらわに書き込まれる。て、${PREFIX}/lib/nethack/の下のファイルを見に行くので、安易に/tmpとかしないように注意(もしかして$PREFIXでなくて$TARGETDIRかも)。
環境変数は、/usr/ports/Mk/bsd.*.mkあたり(とくにbsd.port.mk)を参考にすればよろしい。

install中にあらわれるsuの対処法は不明。unpackしたsourceのMakefile(ここでは/tmp/work/nethack-3.4.3/Makefile)を参考にすればよい。

それから、MASTERDIRが存在するportsのときは、MakefileのMASTERDIR変数も処置しておくことが必要なので忘れないように(例えば、nethack34-nox11のMASTERDIRはnethack-34)。場合によってはMASTERDIRもhomeの下にコピーしてしまってもいいかもしれない。

2014年3月追記
久しぶりに同じことをやろうとしたら、
Switching to root credentials to create /var/db/ports/games_nethack34
su: Sorry
と出て、うまく動かなかった。 バージョン管理システムが CVS から Subversion に変更になったことと関係があるのかな。 (参考:FreeBSDハンドブック 5.6. Ports Collection の利用
フォーラムでの議論を参考に、Makefileに
PORT_DBDIR=/tmp/var/db/ports
INSTALL_AS_USER= yes
と追加する必要があった。
なお、現在の環境は、9.2-STABLE #5 r260877Mである。

2016年7月追記
久しぶりに同じことをやってmakeまでしたら、 installすべきもの一式が、
/tmp/wrok/stage/home/_account_name_/nethack/
の下にbin、lib、shareのディレクトリなどに整理されてできあがっていることに気がついた。
(上記のパスは、Makefileで設定しているところの
${WRKDIR}/stage/${TARGET_DIR}である。)
したがって、「配置する」のが単純に
cp -r /tmp/wrok/stage/${HOME}/nethack/* ${HOME}/nethack/
とすれば良くなった。 (参考:FreeBSD portsのStageDir - msllの日記にportsであらわれるstageについて書いてあります。)
ちなみに
make install
とすると、packageを登録しようとして、権限が足りなくて何も起こらない。
なお、現在の環境は、10.3-STABLE #22 r300148である。