Что, помимо источника, может привести к выполнению явного правила для создания цели make-файла?

Ясно, что цель новее, чем источник из этих двух команд 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 / местные / бен / Emacs', /home/metaperl/edan/pkg/gist.el/yank/gist.el/gist.el', / Bin / мв"

Какой аспект логики make диктует, что действия по созданию цели являются частью цепочки зависимостей при принятии решения о создании цели?

На мой взгляд, только перечисленные источники должны влиять на то, будет ли цель восстановлена.

Целиком 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 ответа

Решение

При использовании стандартного make содержимое команд для создания цели не учитывается при принятии решения о необходимости перестроения цели. Только зависимости принимаются во внимание; это может пойти дальше источника, если у вас есть зависимости, объявленные в другом месте.

Вы не показываете свой make-файл, поэтому я не уверен, но Parsing command... сообщения от makepp -v заставьте меня подозревать, что makepp ведет себя не так, как стандартная make в этом отношении.

makepp восстановит цель, если какая-либо из зависимостей изменилась или если команда изменилась. В вашем случае я подозреваю, что либо некоторые из переменных, которые вы используете в правиле, чтобы сделать $(TARGET) изменились или что makepp видит, что команды создаются динамически и автоматически перестраивает цель. Попробуйте использовать -m target_newer возможность makepp заставить его использовать старый GNU make метод (то есть, перестроить, только если источник новее, чем цель).

Ссылка на сайт

Другие вопросы по тегам