我正在尝试编译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 和"$@"
下一个中使用行,但这似乎并不重要——它们都是同一件事,因为这个脚本只用一个参数调用。
如果我在两者之间添加两行,然后echo
它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 行使其工作的事实告诉我这不是权限问题(此外,这会生成与 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)但不在其中。
我还验证了尽管失败,但它能够创建第一个目录级别。
还是个谜。