在Makefile
中
%.o: %.c
@echo Compiling $< ...
当我运行'%'-style pattern rules are a GNU make extension
(autoreconf --install
版本2.69)时,我收到警告autoconf
。警告不是很清楚,但让我觉得有些东西要添加到configure.ac
。
我在google.com,duckduckgo.com和yahoo.com上进行了搜索,但他们似乎都无法区分他们编制索引的大量构建日志(他们为什么要......)这让搜索变得痛苦。我认为:
AM_INIT_AUTOMAKE([-Wno-portability])
添加到configure.ac
(在post of the openais mailing list中找到)来保持警告,这似乎不太好,因为在技术环境中简单地静音警告通常不是一个好主意 - 请告诉我GNU autotools是否例外。答案 0 :(得分:6)
替换
%.o: %.c
与
.c.o:
这是一个后缀规则做同样的事情,而且它更便携。如果您的规则涉及未知的后缀,请将其列在特殊.SUFFIXES
目标的先决条件中:
.SUFFIXES: .hack .win
.hack.win:
# build a .win file from a .hack file.
详细了解其工作原理here。他们建议使用模式规则而不是后缀规则,因为它们更清晰,更通用,这是事实,但作为autoconf说明,它们确实不那么便携。所以,如果这是一个担心(如果你想建立在BSD / Mac OS上,而不是基本上安装GNU make),那么请回到过去的老式后缀规则。&#34;
如果你的模式规则不能被后缀规则替换,那么automake不会抱怨的另一个可能的替换是static pattern rule。这与模式规则类似,但需要应用的目标列表。而不是说
%.o: %.c
你必须说
OBJS = foo.o bar.o baz.o # list all .o files here
$(OBJS): %.o: %.c
或更一般地说,
target-pattern: prerequisite-pattern
替换为
target-list: target-pattern: prerequisite-pattern
答案 1 :(得分:1)
Winteermute几乎涵盖了该问题的所有方面。我将在这里添加一个我自己的挫折。在我的make文件中,我一直使用模式规则来安装没有.sh后缀的shell脚本。 Automake不喜欢模式规则并给你警告。您现在可以忽略警告。我的configure.ac文件:
AM_INIT_AUTOMAKE([-Wall -Wportability])
在我的Makefile.am
中dist_bin_SCRIPTS = foobar
# pattern rule
% : %.sh
cp $< $@
chmod +x $@
在我的脚本目录中,我有foobar.sh文件。
我还没有找到更好的方法来指定后缀规则来涵盖目标没有扩展名的情况,尽管我真的很努力在互联网上搜索并向后阅读手册几次。
我分发* .sh文件的原因是用户不必知道实现细节。他们只需要记住可执行文件的名称。此外,要求用户输入额外的.sh实际上是浪费生命。