使用 Guile 生成完整的 GNU Make 配方

Generating a complete GNU Make recipe with Guile

我正在使用 GNU Make 中的 $(guile ...) 支持,但我无法从 Guile 中生成完整的配方。

这种传统方法按预期工作:

brazil:
<--tab-->@echo Ere I am J.H.

(其中 <--tab--> 是 ASCII 制表符,根据需要)

但是当我尝试这个假定的等价物时:

$(guile (format #f "brazil:~%~/@echo Ere I am J.H."))

当我 运行 make brazil:

时,我收到以下错误消息
make: *** No rule to make target '@echo', needed by 'brazil'.  Stop.

我的印象是 format~% 编码换行符,~/ 编码制表符。但是根据上面的错误消息,生成的配方中似乎至少缺少换行符。

你不能这样做,就像让 $(shell ...) 调用用多行定义规则一样不起作用,就像你不能使用 define / endef 创建一个完整的多行规则,然后用 $(MY_VAR).

简单地扩展它

单行的扩展(如$(guile ...)操作)不能扩展到多行输出:make使用面向行的解析器并且它已经解析了这一行:任何后续换行将被视为普通空格(不是换行符)。

您需要使用 $(eval ...) 告诉 make 将输出视为实际的多行 makefile 片段。所以你想要:

$(eval $(guile (format #f "brazil:~%~/@echo Ere I am J.H.")))

如果你可以将食谱放在一行中,你也可以使用它来代替:

$(guile (format #f "brazil: ; @echo Ere I am J.H."))

如果食谱必须是多行的,您也可以将其放入变量中并使用:

$(guile (format #f "brazil: ; $(MY_RECIPE)"))