Зависимость от существующей целевой и отсутствующей зависимости

У меня есть makefile, например:

A : B
 echo "made A"
B : D
 echo "made B"

Здесь B существует, но D не делает (иногда это делает, иногда это не так)

Теперь, если я выполняю make, кричит на меня:   make: * Нет правила для создания цели 'D', необходимой для 'B'. Стоп.

Есть ли способ правильно вести себя, т.е.

  • B и D не существуют: fail
  • B существует, D делает и является более новым, чем B, применяет рецепт
  • B существует, существует D, но он старше: ничего не делайте
  • если существует B, а D - нет: не перестраивайте B (вы не можете), но вы можете использовать B для сборки A

используя пустую строку с D как цель, всегда будет выполнять рецепт для построения B, но wiyhout D он не может, поэтому он не нужен!

Есть ли способ?

Я нашел решение с использованием пустого правила

D :

в конце, так что отсутствующий D не завершится. Итак, теперь все в порядке, за исключением того, что B переделан, если D отсутствует, который может быть протестирован в рецепте B:

B : D
 if [ D ] ; then echo "doing B with D"; fi

Но это действительно кажется хакерским...

1 ответ

Вы можете обойти воссоздание B от более старого D, обозначив B как промежуточное:

.INTERMEDIATE : B

Затем вы можете удалить пустое правило для D, и ваши четыре критерия для "правильного" поведения будут сопоставлены.

licensed under cc by-sa 3.0 with attribution.