У меня есть 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
Но это действительно кажется хакерским ...