checkinstall创建无用的deb?

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)

并生成一个空包.


sda*_*aau 4

我不确定这是否完全回答了问题,但这是我到目前为止得到的(在 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 (但是,有newfilesnewfiles.installwatchnewfiles-tarnewfiles.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}/newfilescheckinstall

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.sos 到/usr/lib

 

简而言之,上面的一些方法可能会让一个人得到一个.deb不完全是空的;但这并不意味着那里只有所需的文件,或者它们将被路由到通常的安装目的地......

好吧,希望这至少有一点帮助,
干杯!