У меня есть очень простой Makefile, который не делает того, что я ожидал. Конечная цель состоит в том, что он должен вызывать себя рекурсивно, каждый раз включая соответствующий файл, что приводит к сборке, специфичной для того, что было включено (я создаю несколько проектов, которые используют одну и ту же кодовую базу, но используют разные комбинации исходных файлов). ). Я никогда не имел дело с рекурсивными вызовами, поэтому я должен упустить что-то очевидное. На данный момент у меня есть только один файл .mk
в той же папке, что и мой Makefile. Это простая однострочная строка только для целей этого теста. В конечном итоге он будет содержать различные настройки для каждого проекта.
Макетфайл:
SHELL = /bin/sh
ifdef MYFILE
include $(MYFILE)
PROGRAM = $(basename $(MYFILE))
endif
all: $(wildcard *.mk)
dummy:
@echo -- Entering dummy stub ... why do I need this?
%.mk: dummy
@echo Calling $(MAKE) MYFILE=$@ $*
$(MAKE) MYFILE=$@ $*
$(PROGRAM): objs
@echo Time to link!
objs:
@echo Building objs!
test.mk
SOMEVAR = SomeValue
У меня есть следующие две проблемы:
Проблема 1
Если я удаляю необходимое условие dummy
из правила шаблона, правило шаблона никогда не вызывается (я получаю ужасную ошибку «Ничего не делать для всех»). Есть ли способ заставить рецепты по правилу %.mk
работать без необходимости этого фиктивного предварительного условия?
Проблема 2
Учитывая два вышеупомянутых файла, я ожидаю, что make сделает следующее:
- make[1] запускается и выполняет правило
all
- make[1] переходит к правилу шаблона
%.mk
- make[1] вызывает себя рекурсивно (вызов будет выглядеть как
make MYFILE=test.mk test
) - make[2] запускается, включает файл test.mk и устанавливает переменную PROGRAM
- make[2] переходит к правилу $(PROGRAM) (поскольку мы были явно вызваны с этой целью)
- make[2] переходит к правилу objs, запускает рецепты и возвращается вверх по цепочке
На самом деле make застревает на правиле шаблона %.mk
и входит в бесконечный цикл. Я не понимаю, почему он настаивает на соблюдении правила шаблона, когда я явно сказал ему построить test
в моем первом рекурсивном вызове (который должен соответствовать цели $(PROGRAM)
). Что мне здесь не хватает?
make
? Это имеет значение? Во-вторых,make
делает два прохода через make-файл для разрешения/оценки всех переменных. Будут ли они содержать то, что вы ожидаете, когда попадете в рекурсивный вызов? - person HonkyTonk   schedule 04.05.2012