定义自定义GNU make函数

g.b*_*.b. 16 makefile gnu-make

下面的示例代码中的dep2函数有什么问题?

dep1 = $(eval makefile_list_$1 := $(MAKEFILE_LIST))$(eval -include $1.mk)$(eval MAKEFILE_LIST := $(makefile_list_$1))

define dep2
$(eval makefile_list_$1 := $(MAKEFILE_LIST))
$(eval -include $1.mk)
$(eval MAKEFILE_LIST := $(makefile_list_$1))
endef

$(call dep1,test)
$(call dep2,test)

.DEFAULT_TARGET: all
.PHONY: all
all:
    @echo $@
Run Code Online (Sandbox Code Playgroud)

GNU make 3.81和3.82产生Makefile:10: *** missing separator. Stop.指向dep2调用,dep1运行没有错误.两个变体之间的唯一区别是dep2中的换行符(以及我想使用define的全部要点).

Bet*_*eta 8

你忘记了=:
define dep2 =

编辑:
在每行的末尾加一个分号.我已经测试了这个并且它有效(在GNUMake 3.81中).

define dep2
$(eval makefile_list_$1 := $(MAKEFILE_LIST));
$(eval -include $1.mk);
$(eval MAKEFILE_LIST := $(makefile_list_$1));
endef
Run Code Online (Sandbox Code Playgroud)

为什么这些分号是必要的我不知道,但是在文档中define似乎只在定义用于配方的shell命令序列时才用于多行"变量",而不是Make命令,所以规则可能有点不同.

  • @eriktous:是的,我试过3.82.旧版本只会完全忽略define语句,如果后跟一个`=`,这就是你没有得到错误信息的原因. (5认同)
  • @eriktous:太好了,今晚我今晚不会睡觉,非常感谢你. (2认同)