.SECONDEXPANSIONを使用してターゲット名を動的に「作成」する際に問題が発生しました。
問題を再現するための小さなMakefile :
CONFIGS = test1 test2 test3
.SECONDEXPANSION:
all: $(CONFIGS)
OBJECTS=$$(CFG_NAME)_OBJECTS
$(CONFIGS) : CFG_NAME=$@
$(CONFIGS) : $(OBJECTS)
@echo $(CFG_NAME) $@ from $^
$(OBJECTS):
@echo OBJECTS $@ from $^
@echo DO IT
「ターゲットを「test1_OBJECTS」にするルールはありません。どうすればこの問題を解決できますか?
編集:答えの変更
答えてくれてありがとう。それは私の仕事の単純な変種でした。
だから私は別の方法で答えようとします。
CONFIGS = test1 test2 test3
PLATFORMS = x86 ppc arm
#will be test1x86 test2x86 ... test1ppc ... test3arm,
#so it is long way to enumarate all variants
VARIANTS = $(foreach c, $(CONFIGS), $(foreach p, $(PLATFORMS), $(c)$(p)))
#C FILE LIST
CFILES:=$(shell /bin/find -name "*.c")
.SECONDEXPANSION:
all: $(VARIANTS)
#More Comlex Rule
#Want to corresponding objects be in bins/test1x86/
OBJECTS:=$(CFILES:%.c=bins/$$(CFGNAME)%.o)
$(CONFIGS) : CFG_NAME=$@
$(CONFIGS) : $(OBJECTS)
@echo $(CFG_NAME) $@ from $^
#More complex prerequisites
#I understand that $$(CFGNAME) will be resolve incorrect.
#For each *.c file in subdir I would have object in corresponding path.
#For example, '1/2/3/test.c' will use for generate
#object file 'bins/test1x86/1/2/3/test.o',
#when I call 'make testx86' or 'make all' (it will build all VARIANTS),
#in 'bins/test1x86/1/2/3/'.
#So what have I do?
$(OBJECTS): bins/$$(CFGNAME)_OBJECTS/%o : %.c
@echo OBJECTS $@ from $^
@echo DO IT
ですから、再帰的な呼び出しは避けたいと思います。手伝って頂けますか?ありがとうございました。