Ваши примеры недостаточно ясны, чтобы мы могли на них ответить.
С одной стороны, не ясно, как имя исполняемого файла теста связано с именем модуля. Действительно ли так, что модули заканчиваются номером, а сгенерированная тестовая программа также должна заканчиваться тем же номером (Module1
-> test1
)? Или есть какие-то другие отношения? Похоже, что в файле test.mk
нет никакой переменной, содержащей имя теста, так как вычисляется имя теста? каждый test.mk
файл. В make нет «области видимости», которая позволит вам сказать «этот экземпляр CFLAGS
используется только для этого включенного make-файла». Каждый раз, когда вы добавляете другой файл test.mk
, он будет перезаписывать предыдущие настройки.
Это CAN будет выполнено: вам нужно будет использовать комбинацию define
переменных для хранения правила определения, затем eval
для оценки правил.
Предположим, что вы добавили в test.mk
новую переменную, которая определила имя теста, и вы также квалифицировали свои переменные с этим именем; тогда ваша жизнь станет намного проще:
Module1/test/test.mk
будет содержать:
TESTNAME = test1
test1_SRCTEST = module1/test/testRun.c \
module1/module1.c
test1_CFLAGS = -Imodule1
Теперь в вашем основном make-файле вы создадите переменную, содержащую правило, которое вы хотите определить:
define MAKETEST
include $T
$$(OUTDIR)/$$(TESTNAME): $$(OUTDIR)/% : $$($$(TESTNAME)_SRCTEST)
$$(CC) $$(CPPFLAGS) $$(CFLAGS) $$($$*_CFLAGS) -o $$@ $$^
endef
$(foreach T,$(DIRTEST),$(eval $(MAKETEST)))
Обратите внимание, это не проверено.