Я пытаюсь создать make-файл, который генерирует цель для каждого файла в каталоге. Каждый файл будет содержать список назначений переменных make-файла, которые затем будут использоваться сгенерированной целью.
У меня есть цель, генерирующая с использованием eval
. Я могу получить цели до @echo
. Когда я пытаюсь назначить переменную в файле для использования в цели, я не получаю то, что хочу. Я хочу, чтобы он имел значение из файла. Я могу только выяснить, как получить значение из последнего или предыдущего файла.
Это дает значение вещи из предыдущего файла:
myvar = $(sort $(basename $(wildcard *.txt)))
.PHONY: all $(myvar)
all: $(myvar)
define target_template =
stuff :=
-include $(1).txt
$(1): ; @echo target $$@ stuffs $(stuff)
endef
$(foreach v,$(myvar),$(eval $(call target_template,$(v))))
Это дает мне значениеиз последнего файла:
myvar = $(sort $(basename $(wildcard *.txt)))
.PHONY: all $(myvar)
all: $(myvar)
define target_template =
stuff :=
-include $(1).txt
$(1): ; @echo target $$@ stuffs $$(stuff)
endef
$(foreach v,$(myvar),$(eval $(call target_template,$(v))))
Каждый текстовый файл имеет следующее содержимое:
stuff += mytest<X>
Где <X>
является уникальным для каждого файла. Обратите внимание, что я использую +=
, потому что могут быть случаи, когда включенный текстовый файл включает в себя другой файл, который также добавляет вещи в переменную.
Есть ли способ получить его, чтобы сгенерированная цель использовала значениеstuff
из связанного текстового файла?
Я изменил код на этот, и он, кажется, работает. Это то, что я не должен делать?
myvar = $(sort $(basename $(wildcard *.txt)))
.PHONY: all $(myvar)
all: $(myvar)
define target_template =
$(1):
$(eval stuff = )
$(eval include $(1).txt)
@echo target1 $$@ stuffs $(stuff)
$(warning $(stuff))
endef
$(foreach v,$(myvar),$(eval $(call target_template,$(v))))
Пока мое решение работает, я согласен, что принятое решение лучше. Я оставляю свое решение как пример худшего способа делать вещи.