cem*_*ate 8 makefile deb checkinstall
我有一个简单的命令行程序,字面上包含一个python脚本和一些帮助shell脚本.我想学习打包这个程序,虽然它很简单.
从我收集的内容中,我进入了configure/make/install路由.由于我没有任何配置或任何事情要做,我简单地创建了一个Makefile,只有一个安装部分:
install:
cp ./myProgram /usr/bin/my-program
chown root:root /usr/bin/my-program
chmod 777 /usr/bin/my-program
cp -r ./ProgramResources /usr/lib/my-program
chown -hR root:root /usr/lib/my-program
chmod -R 777 /usr/lib/my-program
Run Code Online (Sandbox Code Playgroud)
此时,我的程序安装并运行sudo make install正常运行.
然后,我尝试使用checkinstall创建一个deb文件,如下所示:
sudo checkinstall sudo make install
Run Code Online (Sandbox Code Playgroud)
它似乎超过了安装部分,因为它报告它成功,但随后失败:
======================== Installation successful ==========================
cp: cannot stat `//var/tmp/tmp.jKCmESc0v7/newfiles.tmp': No such file or directory
Copying files to the temporary directory...OK
Stripping ELF binaries and libraries...OK
Compressing man pages...OK
Building file list... FAILED!
Building Debian package...OK
Installing Debian package...OK
Erasing temporary files...OK
Deleting temp dir...OK
**********************************************************************
Done. The new package has been installed and saved to
...
Run Code Online (Sandbox Code Playgroud)
该程序已安装,但据我所知,这个新制作的.deb文件什么都不做.dpkg -L我的程序仅产生
/.
Run Code Online (Sandbox Code Playgroud)
并手动删除它并从deb文件安装似乎没有做任何事情 - 它实际上并没有把任何文件放在任何地方.
那么,(1)我的方法有什么问题吗?(2)如何解决checkinstall问题?
非常感谢您的答案,即使我对代码很好,我也从来不知道有关包装/分发的任何信息.
小智 5
sudo的双重用途是问题所在.
用文件install.sh之类的
#! /bin/bash
set -x
touch useless
cp useless /usr/share/useless
Run Code Online (Sandbox Code Playgroud)
命令
sudo checkinstall --pkgname useless -y ./install.sh
Run Code Online (Sandbox Code Playgroud)
同时工作
sudo checkinstall --pkgname useless -y sudo ./install.sh
^^^^
Run Code Online (Sandbox Code Playgroud)
节目
cp: cannot stat ‘//var/tmp/tmp.Au4ympTNlT/newfiles.tmp’: No such file or directory
Run Code Online (Sandbox Code Playgroud)
并生成一个空包.
我不确定这是否完全回答了问题,但这是我到目前为止得到的(在 ubuntu lucid 上,checkinstall 1.6.1):
我尝试构建一个开源项目,结果构建得很好。然后我尝试将其打包为 debian:
checkinstall -D --install=no --pkgname=$PKGNAME --pkgversion=0.0.1 --pkgrelease="svn-001" --maintainer=test@test.com --strip=no --stripso=no --addso=yes
这基本上同样失败了Building file list... FAILED!
;并有类似grep: /var/tmp/tmp.NaoiwTHT6F/newfile: No such file or directory
报道。
我还尝试在上面make
的命令末尾添加checkinstall
- 这也没有多大作用。
最后,我尝试了这个:
make clean
checkinstall -D --install=no --pkgname=$PKGNAME --pkgversion=0.0.1 --pkgrelease="svn-001" --maintainer=test@test.com --strip=no --stripso=no --addso=yes -d2 make
该开关-d2
用于启用调试;并将... make
重新运行一次。
将-d2
打印出临时目录:
调试:临时目录为:[ /var/tmp/tmp.NaoiwTHT6F ],所以可以通过列表来检查...事实上,我可以确认
newfile
在我的情况下没有生成 a (但是,有newfiles
、newfiles.installwatch
、newfiles-tar
和newfiles.tmp
)。事实上,事实证明checkinstall
这是一个bash
脚本,因此可以确认它只newfile
在其中出现一次:
$ grep 'newfile ' `which checkinstall`
grep '^/home' ${TMP_DIR}/newfile > /${TMP_DIR}/unwanted
Run Code Online (Sandbox Code Playgroud)
此外,调试将指出这些文件/目录:
debug: INSTW_EXCLUDE=/dev,/path/to/myproject-build,/proc,/tmp,/var/tmp,
debug: INSTW_ROOTPATH=/var/tmp/tmp.NaoiwTHT6F
debug: INSTW_LOGFILE=/var/tmp/tmp.NaoiwTHT6F/newfiles.tmp
debug: INSTW_DBGFILE=/var/tmp/tmp.NaoiwTHT6F/dbgfile
Run Code Online (Sandbox Code Playgroud)
请注意,默认情况下,我的构建文件夹的路径/path/to/myproject-build
被排除 - 这也是该项目还存储构建的可执行文件的位置!
显然,当make
内部checkinstall
第一次构建时,它可以捕获新生成的可执行文件 - 它们将列在; 然而,就我而言,问题是可执行文件最终位于调用的同一目录下;因此,在此对话框中:${TMP_DIR}/newfiles
checkinstall
Some of the files created by the installation are inside the build
directory: /path/to/myproject-build
You probably don't want them to be included in the package,
especially if they are inside your home directory.
Do you want me to list them? [n]: y
Should I exclude them from the package? (Saying yes is a good idea) [y]: n
Run Code Online (Sandbox Code Playgroud)
...事实上,我必须n
回答- 否则我什么也得不到!然后我可以使用以下命令检查内容:
dpkg --contents mytest.deb | less
Run Code Online (Sandbox Code Playgroud)
然而,那么问题是checkinstall
:
.o
文件和.svn
目录/usr/bin
和.so
s 到/usr/lib
简而言之,上面的一些方法可能会让一个人得到一个.deb
不完全是空的;但这并不意味着那里只有所需的文件,或者它们将被路由到通常的安装目的地......
好吧,希望这至少有一点帮助,
干杯!