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

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

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

答案1

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

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

help:; @ $(info $(message)) :

通过玩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"

会给

SHELL is /bin/sh, PID is 12434
literally $SHELL and $$

答案2

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

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

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

.ONESHELL:

all:
    cat << EOF
    aaa
    bbb
    EOF

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

相关内容