Что, помимо источника, может привести к выполнению явного правила для создания цели 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
метод (то есть, перестроить, только если источник новее, чем цель).