自定义Make函数不能获取参数

时间:2014-11-05 14:56:01

标签: makefile gnu-make

我想将模块添加到我的构建系统。

为了在添加新模块时保持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,它按预期工作。

我错过了什么?

2 个答案:

答案 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))