checkinstall创建无用的deb?

时间:2011-05-17 06:33:54

标签: 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

此时,我的程序安装并运行sudo make install。

然后,我尝试使用checkinstall制作deb文件,如下所示:

sudo checkinstall sudo make install

它似乎已经过了安装部分,因为它报告成功,但随后失败了:

======================== 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

 ...

该程序已安装,但据我所知,这个新制作的.deb文件什么都不做。 dpkg -L my-program仅产生

/.

并手动删除它并从deb文件安装似乎没有做任何事情 - 它实际上并没有把任何文件放在任何地方。

所以,(1)我的方法有什么问题吗? (2)如何修复checkinstall问题?

非常感谢您的回答,即使我对代码很好,但我从来不知道有关包装/分发的任何信息。

3 个答案:

答案 0 :(得分:5)

sudo的双重用途就是问题。

使用像

这样的文件install.sh
#! /bin/bash
set -x
touch useless
cp useless /usr/share/useless

命令

sudo checkinstall --pkgname useless -y ./install.sh

工作时

sudo checkinstall --pkgname useless -y sudo ./install.sh
                                       ^^^^

显示

cp: cannot stat ‘//var/tmp/tmp.Au4ympTNlT/newfiles.tmp’: No such file or directory

并生成一个空包。

答案 1 :(得分:3)

我不确定这是否完全回答了这个问题,但这是我到目前为止所得到的(在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将打印出临时目录:

debug: The temporary directory is: [ /var/tmp/tmp.NaoiwTHT6F ]
,因此可以通过列表进行检查......实际上,我可以确认newfile是在我的情况下没有生成(但是,有newfilesnewfiles.installwatchnewfiles-tarnewfiles.tmp)。事实上,结果checkinstall是一个bash脚本,因此可以确认newfile只出现一次:

$ grep 'newfile ' `which checkinstall`
    grep '^/home' ${TMP_DIR}/newfile > /${TMP_DIR}/unwanted

此外,调试将指出这些文件/目录:

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

请注意,默认情况下,我的构建文件夹/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

......我必须,事实上,回答n - 否则我什么都不包括在内!然后我可以用以下内容检查内容:

dpkg --contents mytest.deb | less

然而,问题是checkinstall

  • 包含.o个文件,以及.svn个目录
  • 将绝对路径计为相对路径(不会自动“发送”可执行文件,例如/usr/bin.so/usr/lib

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

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

答案 2 :(得分:1)

我有类似的问题。最后,我遵循this非常简单但相当手动的方法。

例如,将要打包的文件放在debian / usr / bin中。没有必要完成通常的configure, make, make install步骤。