Сделать зависимость с существующей целью и отсутствующей зависимостью - PullRequest
3 голосов
/ 17 ноября 2011

У меня есть make-файл, такой как:

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

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

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

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

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

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

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

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

D : 

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

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

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

1 Ответ

3 голосов
/ 17 ноября 2011

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

 .INTERMEDIATE : B

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

...