2015-07-20 3 views
1

Вот простой Makefile:Как использовать ту же команду для разных целей?

all: actual.txt test1.txt test2.txt 

actual.txt: header.txt actual_part1.txt actual_part2.txt footer.txt 
    cat $^ > [email protected] 

test1.txt: header.txt actual_part1.txt test1_part2.txt footer.txt 
    cat $^ > [email protected] 

test2.txt: header.txt test2_huge_part.txt footer.txt 
    cat $^ > [email protected] 

Как вы можете видеть, все три цели построены с той же командой, повторяется три раза. Можно ли как-то уменьшить повторение?

ответ

1

Учитывая make-файл, как вы его предоставили, существует несколько способов.

Один положить рецепт в переменную:

BLDTXT = cat $^ [email protected] 

all: actual.txt test1.txt test2.txt 

actual.txt: header.txt actual_part1.txt actual_part2.txt footer.txt 
     $(BLDTXT) 

test1.txt: header.txt actual_part1.txt test1_part2.txt footer.txt 
     $(BLDTXT) 

test2.txt: header.txt test2_huge_part.txt footer.txt 
     $(BLDTXT) 

Это не уменьшает количество строк, чтобы написать, но это позволит вам внести изменения в рецепт в одном месте.

Другой вариант заключается в создании единого правила и перенести предварительные определения других линий, например:

BLDTXT = cat $^ [email protected] 
ALLTXT = actual.txt test1.txt test2.txt 

all: $(ALLTXT) 

$(ALLTXT): 
     $(BLDTXT) 

actual.txt: header.txt actual_part1.txt actual_part2.txt footer.txt 
test1.txt: header.txt actual_part1.txt test1_part2.txt footer.txt 
test2.txt: header.txt test2_huge_part.txt footer.txt 
+0

Ха, не знаю, что я мог бы иметь два рецепта для цели. Спасибо, я думаю, что в значительной степени это покрывает. –

+1

У вас не может быть двух _recipes_ для цели. Но у вас может быть два (или более) _rules_ для цели, если только правило имеет рецепт (рецепт - это скрипт, используемый для обновления цели). Некоторые из инструментов, которые автоматически генерируют зависимости файлов заголовков, записывают отдельное правило для каждого необходимого условия. – MadScientist

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