Простое правило make-файла имеет синтаксис:
<target> : <prerequisites>
<recipe>
, где цель - это выходной файл, который должен быть построен, предварительные условия - это входные файлы, используемые для построения цели, а рецепт - это процесс при котором входные файлы превращаются в выходные файлы.
Команда csplit ...
является частью рецепта . Его не следует указывать как предварительное условие.
Таким образом, ваше правило должно выглядеть примерно так:
cookie.h: chomp.adt
csplit $< "/Split Here/"
cp xx00 $@
cookie.cpp: chomp.adt
csplit $< "/Split Here/"
cp xx01 $@
Вы можете прочитать о $<
и $@
здесь: https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html Их использовать не обязательно.
Однако приведенные выше правила не идеальны, потому что вы запускаете команду csplit дважды, когда в этом нет необходимости. И если вы попытаетесь запустить make с включенными параллельными сборками (make -jN
), это может потерпеть неудачу, потому что оба будут работать одновременно и перезаписать выходные файлы.
Как вы можете сделать лучше, зависит от того, какая версия GNU сделать у вас есть. Если у вас GNU make 4.3, вы можете использовать:
cookie.h cookie.cpp &: chomp.adt
csplit $< "/Split Here/"
cp xx00 cookie.h
cp xx01 cookie.cpp
Это сгруппированная цель, о которой вы можете прочитать здесь: https://www.gnu.org/software/make/manual/html_node/Multiple-Targets.html#index -grouped-target
Если у вас более старая версия, вы можете сыграть с трюком, потому что все цели и предварительные условия начинаются с одного и того же префикса (буква c
); это будет выглядеть так:
%ookie.h %ookie.cpp : %homp.adt
csplit $< "/Split Here/"
cp xx00 cookie.h
cp xx01 cookie.cpp
Это шаблонное правило, о котором вы можете прочитать здесь: https://www.gnu.org/software/make/manual/html_node/Pattern-Intro.html