有几篇关于尝试转义 Makefile 中的字符的文章。 我有兴趣转义反斜杠
\
。
我需要根据操作系统动态构建路径。所以,我为此写了一个条件:
OperatingSystem :=
ifeq ($(OS),Windows_NT)
Separator := \
else
Separator := /
endif
Path := c:$(Separator)
当操作系统为 Windows 时,此代码会失败,因为反斜杠未转义,并且预计下一行有更多数据。 有谁知道我该如何克服这个问题? 我考虑了一种解决方法,如果是 Windows,我将读取名为
ProgramFiles
的环境变量,并从中取出第三个字符。但我怎样才能从中获得特定的字符呢?
谢谢,
您的问题的元答案是您永远不应该在 makefile 中使用反斜杠; make 是一个基于 POSIX 的程序,它期望解析的路径使用正斜杠。
99% 的 Windows 程序都接受正斜杠和反斜杠作为目录分隔符。因此,对于 makefile 中 99% 的配方,正斜杠都可以使用。对于那些不起作用的少数(通常只有 cmd.exe 程序,如
rmdir
或 copy
等),您可以在配方本身中进行替换。
最简单的直接答案是使用一个空变量将换行符与反斜杠分开,这样 make 就不会对其执行任何特殊操作。例如:
EMPTY :=
BACKSLASH := \$(EMPTY)
要注意的第二件事是,在大多数情况下,make 不会单独处理反斜杠。线路的末端确实是唯一重要的地方。
因此,在需要反斜杠的食谱中,您可以这样做:
sometarget:
copy $(subst /,\,$<) $(subst /,\,$@)
无需做任何特殊的事情来“引用”反斜杠。