什么,除了源,将导致一个显式规则执行生成一个makefile目标?

时间:2010-07-18 15:13:34

标签: makefile makepp

很明显,目标比这两个ls的来源更新 系统管理命令:

[metaperl@andLinux ~/edan/pkg/gist.el] ls -l ../../wares/gist.el/gist.elc #target
-rw-r--r-- 1 metaperl metaperl 10465 Jul 18 10:56 ../../wares/gist.el/gist.elc
[metaperl@andLinux ~/edan/pkg/gist.el] ls -l yank/gist.el/gist.el #source
-rw-r--r-- 1 metaperl metaperl 13025 Jul 18 10:57 yank/gist.el/gist.el
[metaperl@andLinux ~/edan/pkg/gist.el] 

然而,当我跑makepp -v时,我被告知这条规则不仅仅取决于 在列出的目标上,还有cd和mv命令。

  

makepplog:目标   /home/metaperl/edan/wares/gist.el/gist.elc' depend on的/ usr / local / bin中/ emacs的,   /home/metaperl/edan/pkg/gist.el/yank/gist.el/gist.el', / bin中/ MV'

制作逻辑的哪个方面决定了制作这个制作的动作 target是决定是否制作的依赖链的一部分 目标?

在我看来,只有列出的来源应该影响是否 目标重建。

整个makepp -v输出很长,存在于: http://gist.github.com/480468

我的makepp文件:

include main.makepp

#VER
PKG := gist.el
URL := http://github.com/defunkt/$(PKG).git

TARGET := $(WARES)gist.el/gist.elc

$(TARGET) : yank/gist.el/gist.el
    cd $(dir $(input)) && $(BYTECOMPILE) gist.el
    mv $(dir $(input)) $(WARES)
    perl {{
        print 'github username: ';
        my $username = <STDIN>;
        print 'github API token: ';
        my $api_token = <STDIN>;
        system "git config --global github.user $username";
        system "git config --global github.token $api_token";
        use File::Butler;
        my $lines = Butler('init.el', 'read');
        my $loc = sprintf '%s%s', $EDAN_PKG, "$PKG/";
        $lines =~ s/__LOC__/$loc/g;
        $lines =~ s/__PKG__/$PKG/g;
        Butler( $EDAN_EL, prepend => \$lines );
    }}

yank/gist.el/gist.el : yank
    cd yank && git clone http://github.com/defunkt/gist.el.git

yank:
    mkdir yank

$(phony clean):
    $(RM) -rf $(dir $(TARGET)) yank

2 个答案:

答案 0 :(得分:1)

使用标准 make,在决定是否重建目标时,不会考虑制作目标的命令的内容。只考虑依赖关系;如果您在其他地方声明了依赖项,那么这可能会超出源代码。

你没有显示你的makepp文件,所以我无法确定,但来自Parsing command的{​​{1}} ...消息让我怀疑makepp的行为与此计数的标准make不同。

答案 1 :(得分:0)

如果任何依赖项已更改或命令发生更改,

makepp将重建目标。在您的情况下,我怀疑您在规则中使用的某些变量$(TARGET)已经更改,或者makepp看到命令是动态构造的并且是自动重建目标。尝试使用-m target_newer makepp选项强制它使用旧的GNU make方法(即,如果源比目标更新,则只重新构建)。

Link