如何在Makefile define指令中注释一行?
我想注释Makefile中define指令中的一行或多行,以便在展开指令时忽略该行。目标是将注释行作为提示放置在我的Makefile的用户处,以显示define指令中可能包含的内容的示例。指令被扩展为目标 换句话说,我想要那个Makefile如何在Makefile define指令中注释一行?,makefile,gnu-make,Makefile,Gnu Make,我想注释Makefile中define指令中的一行或多行,以便在展开指令时忽略该行。目标是将注释行作为提示放置在我的Makefile的用户处,以显示define指令中可能包含的内容的示例。指令被扩展为目标 换句话说,我想要那个Makefile define ECHO_FOO = # @echo foo endef all: @echo Before call $(ECHO_FOO) @echo After call .PHONY: all 要具有与此相同的行
define ECHO_FOO =
# @echo foo
endef
all:
@echo Before call
$(ECHO_FOO)
@echo After call
.PHONY: all
要具有与此相同的行为,请执行以下操作:
define ECHO_FOO =
endef
all:
@echo Before call
$(ECHO_FOO)
@echo After call
.PHONY: all
问题是第一个Makefile给了我以下错误:
进程_开始:CreateProcess(NULL,#@echo foo,…)失败。
make(e=2):系统找不到指定的文件。
Makefile:6:目标“全部”的配方失败
make:**[全部]错误2
该页指出:
在define指令中,注释在变量定义期间不会被忽略,而是在变量值中保持不变。展开变量时,它们将被视为“发表评论”或“配方文本”,具体取决于对变量求值的上下文
但这并不能解释在哪种特定情况下,#
符号被视为make comment或recipe text(这似乎是我遇到的问题)
有人能告诉我如何在define函数中将#
符号视为注释标记吗
我已经尝试了以下所有行,试图转义#
符号或更改缩进,但没有一行给出正确的输出:
#@echo foo
#@echo foo
##@echo foo
##@echo foo
\#@echo foo
\#@echo foo
/#@echo foo
/#@echo foo
我正在Windows上运行MinGW make 3.82,但我已经尝试了make 3.82.90和4.1的其他实现。在Windows上,您可以使用
:
作为注释字符。MS-DOS中传统的注释关键字是REM
(如“备注”)。在Windows上,您可以使用:
作为注释字符。MS-DOS中传统的注释关键字是REM
(如“备注”)。无法直接完成您的要求。变量的内容在配方上下文中展开,因此,无论变量展开到什么位置,它都将被视为配方的一部分,并且任何字符都将传递给shell
注意:您可以在UNIX shell和Windows command.com中使用:
,因为:
是shell no op操作符。您必须在其后面添加空格,否则它将尝试运行无效的命令:echo
。但是,请进一步注意,shell仍将扩展线!这意味着,如果你使用反引号等,那么这些仍然是扩大。还要注意的是,由于它是一个语句,分号将停止它。例如:
define ECHO_FOO
: echo hi `echo there 1>&2` ; echo bye
endef
all: ; @$(ECHO_FOO)
在这里,hi
不会被打印,因为echo命令没有运行,但是反勾号仍然被展开,因此那里的将被打印(到stderr),分号结束“no op”命令,因此bye
也将被打印
如果您的命令足够简单,那么:
就可以工作了,但是如果它们那么简单,人们就会想知道为什么要使用定义
另一种选择是覆盖变量,而不是注释掉它:
define ECHO_FOO =
@echo foo
endef
ECHO_FOO =
预计到达时间:
在注释中,您确认命令很简单。我不太明白你所说的最终用户可以扩展是什么意思,也不知道为什么会有不同
但我想说的是,如果你有一个简单的命令,你可以写:
ECHO_FOO = echo hi
不要使用定义define
仅适用于复杂的命令:实际上,它仅适用于包含未转义换行符的命令
如果你写:
ECHO_FOO =# echo hi
然后使用make comments而不是shell comments对变量的内容进行注释,因此它将在任何地方都有效。无法直接完成您的要求。变量的内容在配方上下文中展开,因此,无论变量展开到什么位置,它都将被视为配方的一部分,并且任何字符都将传递给shell
注意:您可以在UNIX shell和Windows command.com中使用:
,因为:
是shell no op操作符。您必须在其后面添加空格,否则它将尝试运行无效的命令:echo
。但是,请进一步注意,shell仍将扩展线!这意味着,如果你使用反引号等,那么这些仍然是扩大。还要注意的是,由于它是一个语句,分号将停止它。例如:
define ECHO_FOO
: echo hi `echo there 1>&2` ; echo bye
endef
all: ; @$(ECHO_FOO)
在这里,hi
不会被打印,因为echo命令没有运行,但是反勾号仍然被展开,因此那里的将被打印(到stderr),分号结束“no op”命令,因此bye
也将被打印
如果您的命令足够简单,那么:
就可以工作了,但是如果它们那么简单,人们就会想知道为什么要使用定义
另一种选择是覆盖变量,而不是注释掉它:
define ECHO_FOO =
@echo foo
endef
ECHO_FOO =
预计到达时间:
在注释中,您确认命令很简单。我不太明白你所说的最终用户可以扩展是什么意思,也不知道为什么会有不同
但我想说的是,如果你有一个简单的命令,你可以写:
ECHO_FOO = echo hi
不要使用定义define
仅适用于复杂的命令:实际上,它仅适用于包含未转义换行符的命令
如果你写:
ECHO_FOO =# echo hi
然后使用make comments而不是shell comments来注释变量的内容,因此它在任何地方都可以工作。谢谢,使用@rem
都可以,但我更喜欢操作系统无关的解决方案。我将拭目以待,看看是否有其他解决方案出现,如果没有解决方案出现,我将接受您的解决方案。谢谢,使用@rem
是可行的,但我更喜欢操作系统不可知的解决方案。我将等待&看看是否有其他解决方案,如果没有解决方案