我想在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的其他实现。
答案 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注释,所以它可以在任何地方使用。