转义Makefile中文件名中的冒号

zap*_*hod 16 unix makefile gnu-make

有没有办法让GNU make与包含冒号的文件名一起正常工作?

我遇到的具体问题恰好涉及模式规则.这是一个简化版本,不依赖于剪切和粘贴制表符:

% make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-redhat-linux-gnu
% cat Makefile
COLON := \:
all: ; true
%.bar: ; cp $< $@
x.bar: x.foo
%.foo: ; touch $@
a$(COLON)b.bar: a$(COLON)b.foo
all: x.bar a$(COLON)b.bar
clean: ; rm -f *.foo *.bar
% make clean
rm -f *.foo *.bar
% make
touch x.foo
cp x.foo x.bar
cp  a\:b.bar
cp: missing destination file operand after `a:b.bar'
Try `cp --help' for more information.
make: *** [a\:b.bar] Error 1
Run Code Online (Sandbox Code Playgroud)

用文字替换$(COLON):产生完全相同的结果.没有反斜杠,它会这样做:

Makefile:6: *** target pattern contains no `%'.  Stop.
Run Code Online (Sandbox Code Playgroud)

mar*_*ton 11

我怀疑这是可能的:在Makefile中看到关于冒号的讨论.总之,GNU make从未与包含空格或冒号的文件名一起使用.维护者Paul D. Smith说,增加对转义的支持往往会破坏现有的makefile.此外,添加此类支持需要对代码进行重大更改.

您可能能够处理某种令人讨厌的临时文件安排.

祝好运!

  • 哇!那没什么好玩的。Make 是我工作流程中不可或缺的一部分。我很遗憾这是不可能的 (2认同)

nav*_*otk 5

这里的答案似乎都太复杂而无济于事。我终于在这里找到了解决方案:

colon := :
$(colon) := :
Run Code Online (Sandbox Code Playgroud)

然后在文件名中使用宏:

filename$(:)
Run Code Online (Sandbox Code Playgroud)

在评估后成功转换为“文件名:”。

  • 这在目标或先决条件路径中不起作用。 (3认同)