我想将模块添加到我的构建系统。
为了在添加新模块时保持makefile清洁,它们都遵循相同的模式,所以我尝试用一个函数来概括它:
uc = $(shell echo $1 | tr '[a-z]' '[A-Z]')
define driver-mod
$(eval CFLAGS += -DUSE_$(call uc, $1));
$(eval include $(DRIVERS_SRC)/$1/Makefile.include);
endef
ifneq (,$(filter led,$(USEMODULE)))
$(call driver-mod, led)
endif
ifneq (,$(filter uart,$(USEMODULE)))
$(call driver-mod, uart)
endif
ifneq (,$(filter button,$(USEMODULE)))
$(call driver-mod, button)
endif
(ifneq
将替换为$(foreach x, $(USEMODULE), $(call driver-mod, $(x))
然而,似乎没有评估driver-mod中的$1
,我得
make: *** $(DRIVERS_SRC): Is a directory. Stop.
(实际上并没有输出$(DRIVERS_SRC)
但它的值,为清晰起见而编辑
当我用例如1美元替换1美元时led
,它按预期工作。
我错过了什么?
答案 0 :(得分:0)
原来我必须逃避$
的eval:
define driver-mod
$(eval CFLAGS += -DUSE_$(call uc, $1));
$(eval include $(DRIVERS_SRC)/\$1/Makefile.include);
endef
作品!
答案 1 :(得分:0)
可简化如下:
uc = $(shell echo $1 | tr '[a-z]' '[A-Z]')
define __driver-mod
CFLAGS += -DUSE_$(uc)
include $(DRIVERS_SRC)/$1/Makefile.include
endef
driver-mod = $(eval $(call __driver-mod,$(strip $1)))
$(foreach 1,$(USEMODULE),$(driver-mod))