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测试通过,那么脚本假定mkdir -p工作正常,所以一旦它真正mkdir -p运行它就可以退出;否则脚本的其余部分实现正确的mkdir -p行为。) 我也不明白为什么它"$*"在 echo 和"$@"下一个中使用行,但这似乎并不重要——它们都是同一件事,因为这个脚本只用一个参数调用。(汤姆在评论中解释道。)

如果我在两者之间添加两行,然后echoexec会像这样工作 - 更好,但仍然令人困惑: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 行使其工作的事实告诉我这不是权限问题(此外,这会生成与 mkdir 不同的诊断,并且它正在运行sudo,并且它实际上/var/tmp/...不是在真正的/usr/local/.... 我认为发生的事情是第一个 mkdir 调用(我添加的那个)实际上只是创建Quarter目录并退出,然后当第二个 mkdir 运行时,它能够创建devices子目录,因为 Quarter 目录已经存在。但是为什么 mkdir 会那样工作???

我的解决方法是以某种方式修补该 mkinstalldirs 脚本,但我真的很好奇为什么这会破坏!

这是在 Win7 上的 VirtualBox 中运行的 Ubuntu 10.10 来宾,检查安装版本 1.6.2 通过 apt-get 安装。


编辑: 我做了一些测试,看看在这个环境中什么有效,什么失败......

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 的 checkinstall 版本,而不是“真正的”mkdir。一定是 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 回答