triplethreat78 Asked: 2019-05-01 16:08:41 +0800 CST2019-05-01 16:08:41 +0800 CST 2019-05-01 16:08:41 +0800 CST 在 Makefile 中使用 Heredoc。可能吗? 772 我正在使用Makefile这样的默认步骤是打印出其他选项的帮助文档。如果我可以添加一个EOF部分而不是多个echos,那就太好了。是否可以像使用EOFbashMakefile脚本一样使用它? make documentation 2 个回答 Voted Best Answer mosvy 2019-05-01T16:45:39+08:002019-05-01T16:45:39+08:00 如果你使用 GNU make,你可以使用多行变量define的语法: define message = You can also include make macros like $$@ = $@ in a multi-line variable endef help:; @ $(info $(message)) : 通过使用value函数和指令,您还可以在 Makefile 中包含整个脚本,这将允许您使用多行命令而无需全局export打开:.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 $$ Philip Couling 2019-05-01T16:51:52+08:002019-05-01T16:51:52+08:00 简单的答案是“默认情况下不是”。但是您可以配置 GNU make 以允许它使用.ONESHELL: 通常,配方中的每一行都在其自己的 shell 中执行。更糟糕的是,有一种方法可以在 make 中创建多行命令,\在行尾使用 a 来继续它。 不幸的是,这\也被传递给了 shell,这对其他命令来说不是问题,但是对于 heredoc,它确实弄乱了语法。 但是,如果您启用.ONESHELL:,则此逻辑更改和命令将在单个 shell 中执行,从而使其工作: .ONESHELL: all: cat << EOF aaa bbb EOF 请注意,这将对 Make 函数的方式产生其他影响。最值得注意的是,如果一个构建线被其他构建线跟随失败,Make 可能不会注意到。通常会检查每一行的结果,但使用.ONESHELL:make 只能看到所有行的结果。
如果你使用 GNU make,你可以使用多行变量
define
的语法:通过使用
value
函数和指令,您还可以在 Makefile 中包含整个脚本,这将允许您使用多行命令而无需全局export
打开:.ONESHELL
会给
简单的答案是“默认情况下不是”。但是您可以配置 GNU make 以允许它使用
.ONESHELL:
通常,配方中的每一行都在其自己的 shell 中执行。更糟糕的是,有一种方法可以在 make 中创建多行命令,
\
在行尾使用 a 来继续它。 不幸的是,这\
也被传递给了 shell,这对其他命令来说不是问题,但是对于 heredoc,它确实弄乱了语法。但是,如果您启用
.ONESHELL:
,则此逻辑更改和命令将在单个 shell 中执行,从而使其工作:请注意,这将对 Make 函数的方式产生其他影响。最值得注意的是,如果一个构建线被其他构建线跟随失败,Make 可能不会注意到。通常会检查每一行的结果,但使用
.ONESHELL:
make 只能看到所有行的结果。