根据Defining and Redefining Pattern Rules上的手册(如果我正确阅读):
'%'字符匹配零个或多个字符的任何序列...
但以下内容不匹配bench.cpp
和bench2.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.cpp
和bench2.cpp
都应该有-DCRYPTOPP_DATA_DIR='"/usr/local/share/cryptopp"'
。我也尝试过使用星号(*
)而没有任何快乐。
如何制作与bench.cpp
和bench2.cpp
匹配的规则?
答案 0 :(得分:1)
根据您提供的链接
模式规则包含字符'%'(恰好其中之一) 目标;否则,它看起来就像一个普通的规则。目标 是一种匹配文件名的模式; '%'匹配任何非空 substring,而其他字符只与自己匹配。
所以%
与空字符串不匹配。
'%'字符匹配零个或多个字符的任何序列...
指的是vpath
的定义,它完全不同。
我担心你必须使用bench1
代替bench
。或者,您可以使用宏来定义2个规则,但只写一次。
答案 1 :(得分:0)
好吧,我碰巧偶然发现了相关文档的相应部分。
根据4.4 Using Wildcard Characters in File Names,我应该在这种情况下使用星号。
根据Stallman和GNUMake手册,%
不是用于指定文件名的通配符:
单个文件名可以使用通配符指定许多文件。 make中的通配符是'*','?'和'[...]'...