Как мне проверить зависимости при вызове вложенного элемента для сборки, когда есть изменения?
-
05-09-2019 - |
Вопрос
Если у меня есть makefile, который вызывает другой makefile, как мне заставить главный makefile правильно проверять, изменились ли зависимости подчиненного makefile?
Например, если у меня есть правило
server:
@cd $(SERVERDIR) && $(MAKE)
Это вызывает make в подкаталоге, в котором я создаю исполняемый "сервер".Однако, если я изменю один из файлов, составляющих сервер, родительский make не увидит изменений и откажется перестроить сервер - "make:`сервер" обновлен".
Как я могу заставить главный makefile правильно определять, когда происходит изменение в одном из зависимых файлов (что-то вроде $ (SERVERDIR) /server.c, например?
Решение
Похоже, вы хотите использовать фальшивую цель
.PHONY: server
server:
@cd $(SERVERDIR) && $(MAKE)
Там есть подробное описание Фальшивой цели здесь, но краткое описание заключается в том, что вы сообщаете makefile, что никогда не будет файла, соответствующего этому целевому серверу, и поэтому он не будет считать сервер обновленным, если в каталоге есть файл с именем server.
Другие советы
Ваше целевое имя совпадает с именем одного из файлов или каталогов в вашем основном Makefile
справочник.
Предполагая, что вам нужно собрать все в подкаталоге под названием server
, это правило:
server:
$(MAKE) -C server
не сработает, так как цель server
является каталогом, не имеет исходных файлов и затем не нуждается в сборке.
Этот:
srv:
$(MAKE) -C server
будет работать до тех пор, пока не будет вызван файл или каталог srv
.
Ты этого не делаешь:
Но да, если у вас нет выбора, напримерпоскольку вы не контролируете вложенный makefile, a .PHONY
цель - это то, что вы ищете.