在 Makefile 中使用 Heredoc。是否可以?

tri*_*t78 13 make documentation here-document

我使用的Makefile默认步骤是打印其他选项的帮助文档。EOF如果我可以添加一个部分而不是多个,那就太好了echo。是否可以EOFMakefilebash 脚本一样使用它?

小智 14

如果您使用 GNU make,则可以使用多行变量的define语法:

define message =
You can also include make macros like
    $$@ = $@
in a multi-line variable
endef

help:; @ $(info $(message)) :
Run Code Online (Sandbox Code Playgroud)

通过使用value函数和export指令,您还可以在 Makefile 中包含整个脚本,这将允许您使用多行命令而无需.ONESHELL全局打开:

define _script
echo SHELL is $SHELL, PID is $$
cat <<'EOF'
literally $SHELL and $$
EOF
endef
export script = $(value _script)

run:; @ eval "$$script"
Run Code Online (Sandbox Code Playgroud)

会给

SHELL is /bin/sh, PID is 12434
literally $SHELL and $$
Run Code Online (Sandbox Code Playgroud)


Phi*_*ing 5

简单的答案是“不是默认的”。但是你可以配置 GNU make 来允许它使用.ONESHELL:

通常,配方中的每一行都在其自己的 shell 中执行。更糟糕的是,有一种方法可以在 make 中制作多行命令,\在行尾使用 a 来继续它。 不幸的是,这\也被传递到 shell,这对于其他命令来说不是什么问题,但对于 Heredoc 来说它确实弄乱了语法。

但是,如果您启用.ONESHELL:,此逻辑会发生变化,并且命令将在单个 shell 中执行,从而使其能够工作:

.ONESHELL:

all:
    cat << EOF
    aaa
    bbb
    EOF
Run Code Online (Sandbox Code Playgroud)

请注意,这将对 Make 的功能产生其他影响。最值得注意的是,如果一条构建线后面跟着其他构建线,那么 Make 可能不会注意到该构建线是否失败。通常会检查每一行的结果,但使用.ONESHELL:make 只能看到所有行的结果。