2013-02-11 3 views
0

Ниже приводится мое настоящее «решение» моей проблемы. Я думал, что make должен был делать это автоматически, когда правило не было найдено для зависимости в другом каталоге, но я не могу понять, почему я так думал. Вы знаете лучший способ?Вызов в другом каталоге

Существует другой каталог ../a/, у которого есть Makefile для создания ../a/generated.h.

.PHONY: FORCE 

FORCE: 

my.c: ../a/generated.h 
    cp --preserve=timestamps $< [email protected] 

../a/generated.h: FORCE 
    $(MAKE) -C $(dir [email protected]) $(notdir [email protected]) 

У меня есть общий вид я могу использовать, чтобы избежать дублирования второе правило для каждого «внешнего» файла, но как я уже сказал, я подумал, что это все лишнее.

define REMOTE 
$(1): FORCE 
    $$(MAKE) -C $$(dir [email protected]) $$(notdir [email protected]) 
endef 

$(eval $(call REMOTE,../a/generated.h)) 
$(eval $(call REMOTE,../a/anotherGeneratedFile.h)) 
+0

Это не очень хороший дизайн. У вас есть много других каталогов с их собственными make-файлами? – Beta

+0

Казалось бы, я забыл, что make автоматически перестроит любые файлы, которые включены в 'Makefile'. – altendky

ответ

1

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

Одним из возможных решений вашей проблемы может быть наличие одного Makefile для вашего проекта, как предлагается в "Recursive Make Considered Harmful". В противном случае вы можете «поднять» уровень абстракции вашей сборной системы и перейти к инструменту, например, cmake.

+0

Хорошее чтение, и оно (предположительно) улучшит мое использование Make в целом и, возможно, даже решит мою основную дилемму. Благодарю. – altendky

0

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

Для GNU Make нет такого встроенного правила. См. Все встроенные правила в Catalogue of Implicit Rules.

Ваше решение должно работать на полпути. Он не имеет зависимостей ../a/generated.h (потому что вы используете рекурсивный make, и эти зависимости известны только файлу makefile в этом каталоге), поэтому он не будет автоматически перестраивать его. Но он будет строить ../a/generated.h, если он не существует.

+0

Поскольку он явно вызывает make в другом каталоге во все времена (обратите внимание на идиому FORCE), я верю, что это «сработает». Просто у него будут дополнительные накладные расходы и все затраты на разделенные группы DAG, перечисленные в связанной статье Массимилиано. – altendky

+0

Истинно, если нет файла под названием 'FORCE'. 'FORCE' должен быть фальшивой целью. –

+0

Это была неточность в моем упрощении для вопроса. Исправленный. – altendky

Смежные вопросы