Как я могу создать запасное правило в GNU make? - PullRequest
0 голосов
/ 01 апреля 2019

Рассмотрим этот make-файл:

default: c

a:: b
    touch a

a:: b
    ls -lt a b
    touch a

c: a
    touch c

Вывод такой:

$ touch b
$ make
touch a
ls -lt a b
-rw-r--r-- 1 tkcook tkcook 0 Apr  1 11:32 a
-rw-r--r-- 1 tkcook tkcook 0 Apr  1 11:31 b
touch a
touch c

Я понимаю, что правила с двойным двоеточием позволяют выполнять несколько правил для одной и той же цели, но все они все еще зависят от того, являются ли предварительные условия более новыми, чем цель, которую нужно инициировать. Поэтому в этом случае я ожидал, что a новее, чем b после выполнения первого правила, предотвратит запуск рецепта второго правила, но вместо этого будут выполнены оба правила для создания a.

В конечном счете, я пытаюсь справиться с ситуацией, когда есть два возможных способа достижения цели. Один очень дешевый, но не всегда работает, тогда как другой очень дорогой, но всегда работает. Когда цель устарела, я бы хотел сначала попробовать первый метод, а затем вернуться к второму (только), если первый не удался. Учитывая, что правила двойного двоеточия, кажется, не достигают этого, что я могу сделать вместо этого?

1 Ответ

1 голос
/ 01 апреля 2019

Почему оба правила выполнения выполнены, хотя первый делает более новый, чем b?

Имейте в виду, что при выполнении рецептов make проверяет только коды выхода.Он никогда не заботится о том, что целевые файлы были даже созданы, даже не упоминая их временные метки.

Для чего (явные) правила двойного двоеточия предназначены выбор рецептов на основена котором предпосылки изменились.Это означает, что они всегда независимы друг от друга.

Я бы хотел попробовать первый метод, и если он не работает, используйте другой, но оба метода выполняются.

Используйте один рецепт с командами "or-ed", такими как ./script1 || ./script2

...