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.此外,添加此类支持需要对代码进行重大更改.
您可能能够处理某种令人讨厌的临时文件安排.
祝好运!
这里的答案似乎都太复杂而无济于事。我终于在这里找到了解决方案:
colon := :
$(colon) := :
Run Code Online (Sandbox Code Playgroud)
然后在文件名中使用宏:
filename$(:)
Run Code Online (Sandbox Code Playgroud)
在评估后成功转换为“文件名:”。