%不匹配规则中的零个或多个字符?

时间:2015-03-15 19:51:13

标签: makefile gnu-make

根据Defining and Redefining Pattern Rules上的手册(如果我正确阅读):

  

'%'字符匹配零个或多个字符的任何序列...

但以下内容不匹配bench.cppbench2.cpp

bench%.o : bench%.cpp
    $(CXX) $(CXXFLAGS) -DCRYPTOPP_DATA_DIR='"$(PREFIX)/share/cryptopp"' -c $<

%.o : %.cpp 
    $(CXX) $(CXXFLAGS) -c $<

这是我在运行make时看到的内容:

$ rm bench*.o
$ make static dynamic cryptest.exe PREFIX=/usr/local
make: Nothing to be done for `static'.
make: Nothing to be done for `dynamic'.
g++ -DNDEBUG -g -O2 -fPIC -march=native -pipe -c bench.cpp
g++ -DNDEBUG -g -O2 -fPIC -march=native -pipe -DCRYPTOPP_DATA_DIR='"/usr/local/share/cryptopp"' -c bench2.cpp

以上,bench.cppbench2.cpp都应该有-DCRYPTOPP_DATA_DIR='"/usr/local/share/cryptopp"'。我也尝试过使用星号(*)而没有任何快乐。

如何制作与bench.cppbench2.cpp匹配的规则?

2 个答案:

答案 0 :(得分:1)

根据您提供的链接

  

模式规则包含字符'%'(恰好其中之一)   目标;否则,它看起来就像一个普通的规则。目标   是一种匹配文件名的模式; '%'匹配任何非空   substring,而其他字符只与自己匹配。

所以%与空字符串不匹配。

  

'%'字符匹配零个或多个字符的任何序列...

指的是vpath的定义,它完全不同。

我担心你必须使用bench1代替bench。或者,您可以使用宏来定义2个规则,但只写一次。

答案 1 :(得分:0)

好吧,我碰巧偶然发现了相关文档的相应部分。

根据4.4 Using Wildcard Characters in File Names,我应该在这种情况下使用星号。

根据Stallman和GNUMake手册,%不是用于指定文件名的通配符:

  

单个文件名可以使用通配符指定许多文件。   make中的通配符是'*','?'和'[...]'...