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

时间:2016-07-11 11:39:50

标签: 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 = 
endef

all: 
    @echo Before call
    $(ECHO_FOO)
    @echo After call

.PHONY: all

问题是第一个Makefile给出了以下错误:

  

process_begin:CreateProcess(NULL,#@ echo foo,...)失败。   make(e = 2):系统找不到指定的文件。   Makefile:6:目标'all'的配方失败   make:*** [all]错误2

GNU make:Makefile contents页面指出:

  

在define指令中,在变量定义期间不会忽略注释,而是在变量的值中保持完整。扩展变量时,它们将被视为make注释或配方文本,具体取决于评估变量的上下文。

但这并不能解释在哪种特定情况下#符号被视为make注释或食谱文本(这似乎是我遇到的问题)。

有人可以告诉我如何将#符号视为定义函数中的注释标记吗?

我已经尝试了以下所有行,想要转义#符号或更改缩进,但没有一行给我正确的输出:

#@echo foo
    #@echo foo
##@echo foo
    ##@echo foo
\#@echo foo
    \#@echo foo 
/#@echo foo
    /#@echo foo 

我在Windows上运行MinGW make 3.82,但我已经尝试过make v3.82.90和4.1的其他实现。

2 个答案:

答案 0 :(得分:1)

在Windows上,您可以使用:作为注释字符。 MS-DOS中的传统注释关键字是REM(如"注释")。

答案 1 :(得分:1)

没有办法直接做你要求的事情。变量的内容在配方上下文中展开,因此无论变量扩展到什么,它都将被视为配方的一部分,并且任何字符都将被传递给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)

这里,由于没有运行echo命令,因此不会打印hi there,但仍然会扩展反引号,以便打印bye(到stderr),分号结束"无操作"这样命令:也将打印出来。

如果你的命令很简单,那么define就可以了,但是如果他们这么简单就会想知道你为什么要使用define ECHO_FOO = @echo foo endef ECHO_FOO = ......

另一个选择是覆盖变量,而不是将其注释掉:

ECHO_FOO = echo hi

ETA: 在评论中,您确认命令很简单。我不太清楚你的意思是可以被最终用户扩展或者为什么会有所作为。

但我所暗示的是,如果你有一个简单的命令,你可以写:

define

并且不使用define。只有复杂的命令才需要ECHO_FOO =# echo hi :实际上只有包含未转义换行符的命令才需要它。

而且,如果你写:

import math
import numpy as np[enter image description here][1]
import numpy.fft as fft
import matplotlib.pyplot as plt

t = np.linspace(0, 2*math.pi, 1600)
y = np.sin(t) + np.sin(2*t)

plt.plot(t, y)
plt.xlabel('time')
plt.ylabel('height')
plt.show()

fft_power = fft.fft(y)
rfft_power = fft.rfft(y)

sample_spacing = 3.92944672e-03

frequency = fft.fftfreq(len(fft_power), sample_spacing)
real_frequency = fft.rfftfreq(len(fft_power), sample_spacing)

plt.plot(real_frequency.real, rfft_power.real, 'ro')
plt.xlabel('frequency')
plt.ylabel('amplitude')
plt.show()

然后你用make注释来评论变量的内容,而不是shell注释,所以它可以在任何地方使用。