MacOSX 10.6 Snow Leopard で MacPorts 使っています。コマンド
等の置場所を NFS にすると、install 時に失敗します。たとえば、
こんな感じで。
------------------------------------------------------------
# port activate pstree
---> Activating pstree Error: port activate failed: could not set flags for
file "/usr/local3/share/doc/pstree-2.33": operation not supported
#
------------------------------------------------------------
内部的には、こんな事をしているのではないかと思います。
------------------------------------------------------------
# chflags uchange /usr/local3/share/doc/pstree-2.33
chflags: /usr/local3/share/doc/pstree-2.33: Operation not supported
#
------------------------------------------------------------
この問題を誤魔化すような方法は、ないでしょうか。たとえば、
chflags を実行しないようにするとか。
試しに、MacPorts のソースコードで chflags システムコールを実
行している所を外してみたりはしたのですが、効果ありませんでし
た。src/pextlib1.0/xinstall.c を書き換えて、Pextlib.dylib を
置換えたのですが、ダメでした。
------------------------------------------------------------
% nm Pextlib.dylib,orig,2010-03-26 | egrep chflags
U _chflags
U _fchflags
% nm Pextlib.dylib | egrep chflags
%
------------------------------------------------------------
Tcl に強い人、何かヒントがあれば教えてください。MacPorts の
本体は、tclsh8.5 で動いています。
NFS サーバは、NAS (NetApp) です。
chflags は、FreeBSD 由来のコマンドだと思いますが、その辺りで
も何か情報ありませんか。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
> この問題を誤魔化すような方法は、ないでしょうか。たとえば、
> chflags を実行しないようにするとか。
空の chflags 関数を作って ELF ライブラリにして、
それを環境変数 LD_PRELOAD に指定する、
というのはどうですか。
BSD 系でこの技が使えるか分かりませんが…
In article <hojtti$nfh$1...@speranza.aioe.org>
tesi...@diary.ocn.ne.jp (tesi...@diary.ocn.ne.jp) writes:
> > この問題を誤魔化すような方法は、ないでしょうか。たとえば、
> > chflags を実行しないようにするとか。
> 空の chflags 関数を作って ELF ライブラリにして、
> それを環境変数 LD_PRELOAD に指定する、
> というのはどうですか。
なるほど。その手がありましたね。試してみた所、うまく行きまし
た。ありがとうございました。
動的リンクライブラリを置換える方法としては、次の Web ページ
を参考にしました。
http://d.hatena.ne.jp/eagletmt/20080726/1217085814
実際に作ったのは、次のような C のプログラムです。
------------------------------------------------------------
% cat chflags.c
/*
* fake chflags(2) and fchflags(2) to run port on NFS
*/
#include <sys/stat.h>
#include <unistd.h>
int
chflags(const char *path, __uint32_t flags)
{
return( 0 );
}
int
fchflags(int fd, __uint32_t flags)
{
return( 0 );
}
int
lchflags(const char *path, __uint32_t flags)
{
return( 0 );
}
%
------------------------------------------------------------
Makefile も作ってみました。cc -shared -fPIC -o chflags.dylib
chflags.c でいいんですけれど。
------------------------------------------------------------
% cat Makefile
#
#
#
all: chflags.dylib
chflags.dylib: chflags.c
$(CC) -shared -fPIC -o $@ $<
%
------------------------------------------------------------
うちでは、できあがったものを
/usr/local3/lib/dummy-chflags/chflags.dylib に置きました。
------------------------------------------------------------
% ls -l /usr/local3/lib/dummy-chflags/chflags.dylib
-rwxr-xr-x 1 root admin 4304 3 29 12:31
/usr/local3/lib/dummy-chflags/chflags.dylib
% nm /usr/local3/lib/dummy-chflags/chflags.dylib
0000000000000000 t __mh_dylib_header
0000000000000ecb T _chflags
0000000000000edd T _fchflags
0000000000000eee T _lchflags
U dyld_stub_binder
%
------------------------------------------------------------
シェルスクリプトを作りました。
------------------------------------------------------------
% cat /usr/local3/bin/run-no-chflags
#!/bin/sh
export DYLD_INSERT_LIBRARIES=/usr/local3/lib/dummy-chflags/chflags.dylib
export DYLD_FORCE_FLAT_NAMESPACE=YES
$@
%
------------------------------------------------------------
このシェルスクリプトは、次のように、引数に実行したいコマンド
を与えて使います。
------------------------------------------------------------
# run-no-chflags port activate pstree
---> Activating pstree
#
------------------------------------------------------------
In article <hojtti$nfh$1...@speranza.aioe.org>
tesi...@diary.ocn.ne.jp (tesi...@diary.ocn.ne.jp) writes:
> BSD 系でこの技が使えるか分かりませんが…
やってみると、MacOSX でもこのくらいなら比較的簡単でしたね。
引数を変えながら同じ名前の関数を呼ぶとかしようとすると、また
面倒なのかもしれませんけれど。