9

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 -pmkdir -pmkdir -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 を使用している場合でも) 動作するが、内部では動作しないというのが正しい区別かもしれません。

また、失敗したにもかかわらず、最初のディレクトリ レベルを作成できることも確認しました。

まだまだ謎。

4

3 に答える 3

22

使用する

checkinstall --fstrans=no

これを修正する必要があります。または

Set "TRANSLATE=0"

入れて/etc/checkinstallrc再試行してください。

于 2011-10-26T09:32:05.693 に答える
2

mkdir -p「真の」mkdirではなく、mkdirのcheckinstallバージョンであるため、本来のように機能しません。checkinstall のバグで、動作が少し異なるはずです。

このパッチはバグを回避します。

./configure
sed -i 's/if mkdir .*-p --.*; then/if false; then ## &/' cfg/mkinstalldirs
....
于 2011-02-12T11:59:21.680 に答える
0
sed -i -e 's/TRANSLATE=1/TRANSLATE=0/g' /etc/checkinstallrc
于 2014-11-02T13:47:58.470 に答える