8

在 GNU make 文档中,'%' 被记录为匹配“任何非空子字符串”。但是,它似乎实际上只匹配不包含空格的非空子字符串。例如,假设您这样做:

mkdir /tmp/foo
cd /tmp/foo
echo 'int main() { return 0; }' > "test.c"
echo 'int main() { return 0; }' > "test space.c"

现在,您应该能够使用 GNU Make 的内置模式规则来构建这些:

anthony@Zia:/tmp/foo$ make "test"
cc     test.c   -o test
anthony@Zia:/tmp/foo$ make "test space"
make: *** No rule to make target `test space'.  Stop.

当您编写 makefile 时也会发生同样的问题。

anthony@Zia:/tmp/foo$ rm test
anthony@Zia:/tmp/foo$ echo 'all: test test\ space' > Makefile 
anthony@Zia:/tmp/foo$ make
cc     test.c   -o test
make: *** No rule to make target `test space', needed by `all'.  Stop.

即使您显式添加%: %.c规则,结果也是一样的。但是,如果您向 Makefile 添加显式规则,就像这样,它可以工作:

test\ space: test\ space.c
    $(CC) -o "$@" "$<"     # first char is tab, of course.

有没有一个技巧可以让空间与隐式规则一起工作?

编辑

我已经发送了一个错误报告: http: //lists.gnu.org/archive/html/bug-make/2011-06/msg00002.html

4

2 回答 2

6

我不相信。将空格分隔的标记列表作为字符串传递的概念在 make 中根深蒂固。这些列表被解析和重新解析。在 UNIX 世界中,目录和文件名中的空格被认为是不好的做法是有原因的。

于 2011-06-04T00:58:41.313 回答
2

这是一个混乱,但截至今天,人们有时仍然会得到带有空格的路径。

无论如何,创建链接而不是直接访问 % 规则中的目录可以正常工作。

# GNU makefile
DIR_WITH_SPACE=/c/Users/me/My\ Code

# *** DOESN'T WORK ***
%.h : $(DIR_WITH_SPACE)/%.h
    cp -v "$<" "$@"

fix:
  ln -s $(DIR_WITH_SPACES) dir_fixed

# Does work :)
%.h : dir_fixed/%.h
    cp -v "$<" "$@"
于 2014-02-14T09:38:30.943 回答