Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Makefile define指令中注释一行?_Makefile_Gnu Make - Fatal编程技术网

如何在Makefile define指令中注释一行?

如何在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 要具有与此相同的行

我想注释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 = 
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
是可行的,但我更喜欢操作系统不可知的解决方案。我将等待&看看是否有其他解决方案,如果没有解决方案