Debian 在预期的情况下不会重新运行

Debian 在预期的情况下不会重新运行,debian,packaging,deb,debhelper,Debian,Packaging,Deb,Debhelper,我正在将我的一些包从debhelper包转换为使用dh,这时我注意到它不支持重新运行目标 例如: 我运行debian/rules build来检查构建 做一个小的代码更改 再次运行debian/rules build,它什么也不做 或者另一个常见的例子: 我运行fakeroot debian/rules binary检查包中是否正确安装了所有内容 发现遗漏的东西;纠正这个问题 运行fakerootdebian/rules binary来测试更改,但它什么也不做 这是我以前使用的CDB在行为上的一

我正在将我的一些包从debhelper包转换为使用dh,这时我注意到它不支持重新运行目标

例如:

  • 我运行
    debian/rules build
    来检查构建
  • 做一个小的代码更改
  • 再次运行
    debian/rules build
    ,它什么也不做
  • 或者另一个常见的例子:

  • 我运行fakeroot debian/rules binary检查包中是否正确安装了所有内容
  • 发现遗漏的东西;纠正这个问题
  • 运行fakerootdebian/rules binary来测试更改,但它什么也不做
  • 这是我以前使用的CDB在行为上的一个重大变化。这有什么办法吗?我不想在这些情况下需要运行
    debian/rules clean

    debian/规则:

        #!/usr/bin/make -f
    
        export DEB_CXXFLAGS_MAINT_APPEND+=-std=gnu++0x
    
        %:
           dh $@
    

    是的,这是
    dh
    (它必须跟踪已经采取的步骤,因为它通常会在整个包构建过程中被多次调用,并且它不能利用
    make
    的内部来保持状态。这是一种可怕的黑客行为,但考虑到可怕的问题限制,这是一个不错的解决方案)

    公平地说,当已经有一个部分构建时,
    debian/rules build
    应该做什么还没有被很好地定义。如果一个构建之前已经成功,并且没有任何状态被清除,那么Debhelper将该构建视为已完成并不是不合理的

    当您想要开始重新构建时,只需使用
    dh_clean
    就可以解决您的问题。这不会调用
    dh_auto_clean
    ,因此,如果您的代码在
    debian/
    目录之外构建,则不会触及它,但会清除Debhelper状态

    相反,如果您希望能够“倒带”部分构建,使其认为构建尚未完成,那么您可以尝试使用执行以下操作的脚本

    !/bin/bash
    sed-i-e'/dh_auto_build/,$d'debian/*.debhelper.log
    

    这将从任何*.debhelper.log构建状态中删除“
    dh_auto_build
    ”项及其后的所有内容,这样
    dh
    将认为它们尚未完成。到那时为止所采取的任何步骤都将被视为已完成。

    这是不幸的,但似乎是真的。