2015-06-10 4 views
0

Вот мой Makefile:GNU сделать - сделать одну задачу сделать еще одну задачу, а

z : a 
    echo "REDOING Z" ; touch z 

a : b b2 
    touch a 
    touch a2 
    touch z # should disable z but doesn't 

b : c c2 
    touch b 
    touch b2 

Когда я make a, z прикосновении в два раза, я хочу, чтобы только прикоснуться раз, как мне это сделать ?

+0

Какова фактическая цель? Вы хотите иметь цель, которая иногда генерирует файл, который другая цель также генерирует и пропускает другую цель, когда это происходит? Вам нужна цель, которая генерирует два файла, которые правильно понимают? Что-то другое? –

+0

У меня есть цель, которая иногда генерирует файл, который генерирует другая цель и пропускает другую цель, когда это происходит, и я хочу эффективно работать, вместо того, чтобы генерировать второй файл дважды (думаю, что 'touch z' на самом деле является чем-то, что требует времени) – tohava

+0

Я не думаю, что вам удастся заставить себя обрабатывать «иногда» выходы абсолютно здоровыми. Для этого он не предназначен. Не говоря уже о том, что здесь есть проблемы с упорядочением (что, если make запускает цель 'z' перед мишенью' a' в экземпляре, где 'a' создаст' z'?). –

ответ

1

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

z : a 
    touch z 

a : b b2 
    touch a 

b : c c2 
    touch b 

# add rules for b2, c and c2 
+1

Это явно ** не ** ответ на заданный вопрос. –

+0

Процесс генерации 'a' также может генерировать' z' очень эффективно, используя промежуточные данные от создания 'a'. Если я вынужу разделение между этими двумя, я вынужден работать неэффективно. Обратите внимание, что у меня нет способа сохранить промежуточные данные в файл. – tohava

+0

@tohava Тогда в вашем правиле должно быть указано, что он генерирует несколько файлов. В GNU Make вы не можете иметь правила, которые генерируют один или несколько файлов, только фиксированное число. –

Смежные вопросы