Установить разные значения переменной для сгенерированных целей - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь создать 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))))

Пока мое решение работает, я согласен, что принятое решение лучше. Я оставляю свое решение как пример худшего способа делать вещи.

1 Ответ

2 голосов
/ 23 октября 2019

Вы не говорите, какую версию Make вы используете, но попробуйте:

define target_template =
 stuff := 
 -include $(1).txt
 stuff_$(1):= $$(stuff)
 $(1): ; @echo target $$@ stuffs $$(stuff_$(1))
endef
...