Dan*_*Dan 7 linux mkdir checkinstall
我正在尝试编译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
Run Code Online (Sandbox Code Playgroud)
但是当我使用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
Run Code Online (Sandbox Code Playgroud)
这是失败:
....
/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
....
Run Code Online (Sandbox Code Playgroud)
这是脚本的相关部分:
$ cat cfg/mkinstalldirs
....
case $dirmode in
'')
if mkdir -p -- . 2>/dev/null; then
echo "mkdir -p -- $*"
exec mkdir -p -- "$@"
fi
;;
....
Run Code Online (Sandbox Code Playgroud)
我不明白为什么(如果exec会这样 - 是不是保证脚本的其余部分(之后esac)永远不会执行?if测试通过,那么脚本假设mkdir -p正常工作,所以一旦它完成mkdir -p它就可以退出;否则脚本的其余部分实现正确的mkdir -p行为.) 我也不明白为什么它(汤姆在评论中解释道.)"$*"在echo和"$@"next中使用但是它似乎并不重要 - 它们都是相同的东西,因为这个脚本只用一个参数调用.
如果我添加两行之间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!
Run Code Online (Sandbox Code Playgroud)
现在,两次执行mkdir行使其工作的事实告诉我这不是一个权限问题(旁边,这将产生一个与mkdir不同的诊断,这是正在运行sudo,它实际上工作的/var/tmp/...不是真实的/usr/local/...).我认为发生的事情是第一个mkdir调用(我添加的那个)实际上只创建了Quarter目录并且拯救了,然后当第二个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
Run Code Online (Sandbox Code Playgroud)
很奇怪,-p适用于相对路径名,但不适用于绝对路径名.或者正确的区别是-p在"chroot"树之外工作(如果它甚至真的使用chroot)但不在其中.
我还验证了尽管失败了,但它能够创建第一个目录级别.
还是个谜.
小智 21
运用
checkinstall --fstrans=no
Run Code Online (Sandbox Code Playgroud)
应该解决这个问题 要么
Set "TRANSLATE=0"
Run Code Online (Sandbox Code Playgroud)
在,/etc/checkinstallrc然后再试一次.
mkdir -p无法正常工作,因为它是 mkdir 的 checkinstall 版本,而不是“真正的”mkdir。checkinstall 中肯定存在一些错误,导致其工作方式有所不同。
该补丁解决了该错误:
./configure
sed -i 's/if mkdir .*-p --.*; then/if false; then ## &/' cfg/mkinstalldirs
....
Run Code Online (Sandbox Code Playgroud)