Quarterをコンパイルし、 checkinstallを使用してパッケージ化しようとしています。
標準の ./configure && make && sudo make install を実行すると、うまくいきます。
$ wget http://ftp.coin3d.org/coin/src/all/Quarter-1.0.0.tar.gz
$ tar xzf Quarter-1.0.0.tar.gz
$ cd Quarter-1.0.0
$ ./configure
$ make
$ sudo make install
しかし、checkinstall を使用すると、mkdir -p
完全に正常に動作するはずのエラーが発生します。-p
失敗する方法は、オプションが指定されていない場合とまったく同じです。これは、私が使用している checkinstall コマンド ラインです。
$ checkinstall -D -y --install=no --pkgname=libquarter --pkgversion=1.0.0 \
--arch=i386 --pkglicense=GPL --maintainer=me@example.com --reset-uids=yes
これは失敗です:
....
/bin/bash ../../../cfg/mkinstalldirs /usr/local/include/Quarter/devices
mkdir -p -- /usr/local/include/Quarter/devices
mkdir: cannot create directory `/usr/local/include/Quarter': No such file or directory
make[4]: *** [install-libdevicesincHEADERS] Error 1
....
これは、スクリプトの関連部分です。
$ cat cfg/mkinstalldirs
....
case $dirmode in
'')
if mkdir -p -- . 2>/dev/null; then
echo "mkdir -p -- $*"
exec mkdir -p -- "$@"
fi
;;
....
なぜそれがあるのか わかり(テストに合格した場合、スクリプトは正しく動作するexec
ません-スクリプトの残りの部分( の後esac
)が決して実行されないことを保証しませんか?if
と想定するため、実際に実行すると終了できます。それ以外の場合は、スクリプトの残りの部分で適切な動作が実装されます。) また、なぜecho と次のこのスクリプトは 1 つの引数だけで呼び出されているため、どちらも同じものです。(トムはコメントで説明しました。)mkdir -p
mkdir -p
mkdir -p
"$*"
"$@"
echo
と の間に2 行を追加すると、次のexec
ように動作します。mkdir -p -- "$@"
echo "Now doing the exec mkdir..."
/bin/bash ../../../cfg/mkinstalldirs /usr/local/include/Quarter/devices
mkdir -p -- /usr/local/include/Quarter/devices
mkdir: cannot create directory `/usr/local/include/Quarter': No such file or directory
Now doing the exec mkdir...
/usr/bin/install -c -m 644 InputDevice.h /usr/local/include/Quarter/devices/InputDevice.h
.... finishes successfully!
さて、 mkdir 行を2回実行すると機能するようになったという事実は、それが権限の問題ではないことを示しています(さらに、これは mkdir とは異なる診断を生成し、これは として実行されsudo
、実際には実際には機能して/var/tmp/...
いません/usr/local/...
)。最初の mkdir 呼び出し (私が追加したもの) が実際にはQuarter
ディレクトリだけを作成して救済し、2 番目の mkdir が実行されるとdevices
、Quarter ディレクトリが既に存在するため、サブディレクトリを作成できると思います。しかし、なぜ mkdir はそのように動作するのでしょうか???
私の回避策は、その mkinstalldirs スクリプトに何らかのパッチを当てることですが、なぜこれが壊れているのか非常に興味があります!
これは、Win7 の VirtualBox で実行されている Ubuntu 10.10 ゲストで、apt-get を介してインストールされた checkinstall バージョン 1.6.2 です。
編集: この環境で何が機能し、何が失敗するかを確認するためにいくつかのテストを行いました...
mkdir -p /foo works correctly
mkdir -p /foo && mkdir -p /foo/bar works correctly
mkdir -p foo/bar works correctly
mkdir /foo/bar failed as expected (correct)
mkdir foo/bar failed as expected (correct)
mkdir -p /foo/bar fails
相対パス名で-p
は機能しますが、絶対パス名では機能しません。あるいは-p
、「chroot」ツリーの外部では (実際に chroot を使用している場合でも) 動作するが、内部では動作しないというのが正しい区別かもしれません。
また、失敗したにもかかわらず、最初のディレクトリ レベルを作成できることも確認しました。
まだまだ謎。