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

Понятно, что цель новее, чем источник из этих двух ls comands:

[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', / бен / мв "

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

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

Весь вывод 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 ]

1 голос
/ 18 июля 2010

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

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

0 голосов
/ 19 июля 2010

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

Link

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...