Сделать многокомпонентные рецепты с grep между ними? - PullRequest
2 голосов
/ 26 октября 2019

Мне нужно запустить многокомпонентный рецепт для моего объекта. Но последующая команда не должна выполняться, если grep предыдущей команды приводит к обнаружению определенной строки. Как я могу написать это?

run_sim:
    $(MAKE) compile; \
    (Here I need grep of results of log of compile command) && $(MAKE) elaborate; \
    (Here I need grep of results of log of elaborate command) && $(MAKE) simulate;

Если grep возвращается с найденной строкой, то make не должен выполнять следующую команду, а останавливаться.

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Verilog?

То, что я сделал в подобной ситуации, и это может быть моей собственной ошибкой новичка / инженера-электрика, это:

compile.summary: compile.log
    @echo Making $@
    @grep -q PASSES $<
    @echo Compile PASSES > $@

Поскольку grep -q потерпит неудачу, если 'PASSES' отсутствует в compile.log, Make остановится.

Вы просто делаете elaborate зависимым от compile.summary.

Если вы искалидля чего-то вроде '* E' или 'Error' вы могли бы вместо этого использовать grep -qv 'Error', где '-v' заставит grep вернуть ошибку, если найдет строку в compile.log.

Это невсе это удобно для пользователя, хотя. В случае сбоя вы просто увидите «Создание файла компиляции» с последующим ... ничем.

В моем случае это было фактически связано с программами, которые никогда не возвращают 0, поэтому журналы должны бытьgrepped для допустимых сбоев по сравнению с фатальными сбоями.

По мере того, как приходит другой ответ, намного проще управлять зависимостями с реальными файлами в качестве целей. Цель компиляции PHONY может означать, что вы всегда перекомпилируете при разработке ... потому что у нее нет файла + отметка времени, чтобы узнать свежесть последней компиляции по сравнению с входными данными для компиляции. Лучше, чтобы compile.log был фактическим файлом, от которого зависит сложность.

0 голосов
/ 27 октября 2019

У меня уже есть 3 отдельных объекта make (компилировать, разрабатывать, моделировать). Теперь мне нужно собрать все 3 вместе в один объект make, чтобы он запускал все три, когда я запускаю 'make run_sim'. Как мне это сделать?

Вот так:

.PHONY: run_sim
run_sim:
    $(MAKE) compile
    $(MAKE) elaborate
    $(MAKE) simulate

Но было бы лучше создать правильное дерево зависимостей:

.PHONY: compile
compile: output.out ;

output.out: something.c
     gcc something.c -o output.out

.PHONY: elaborate
elaborate: compile
    do_the_elaboration


.PHONY: simulate
simulate: compile
    do_the_simulation

.PHONY: run_sim
run_sim: compile elaborate simulate ;

Было бы целесообразно просмотреть GNU make Введение , GNU make manual и просмотр информации о GNU make: обработка ошибок . Информацию о фальшивых целях можно найти в GNU make: фальшивые цели , stackoverflow: Какова цель .PHONY target? ,

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