如何处理autoconf警告"'%' - 样式模式规则是一个GNU make扩展"

Kar*_*ter 4 autoconf makefile autotools

在一个Makefile

%.o: %.c
    @echo Compiling $< ...
Run Code Online (Sandbox Code Playgroud)

'%'-style pattern rules are a GNU make extension跑的时候会收到警告autoreconf --install(autoconf版本2.69).警告不是很清楚,但让我觉得有一些东西需要补充configure.ac.

我在google.com,duckduckgo.com和yahoo.com上进行了搜索,但是他们似乎都无法区分他们索引的大量构建日志(他们为什么要...)这会让搜索变得痛苦.我认为:

  • 我可以沉默通过添加警告AM_INIT_AUTOMAKE([-Wno-portability])configure.ac(在发现 了OpenAIS的邮件列表的帖子),因为只是沉默的警告是一般不会在一个技术环境是个好主意,这似乎不是很大-请告诉我,如果GNU自动是个例外.

Win*_*ute 6

更换

%.o: %.c
Run Code Online (Sandbox Code Playgroud)

.c.o:
Run Code Online (Sandbox Code Playgroud)

这是一个后缀规则做同样的事情,它更便携.如果您的规则涉及未知的后缀,请在特殊.SUFFIXES目标的先决条件中列出:

.SUFFIXES: .hack .win

.hack.win:
      # build a .win file from a .hack file.
Run Code Online (Sandbox Code Playgroud)

有关这方面的详细信息,请参阅此处.他们建议使用模式规则而不是后缀规则,因为它们更清晰,更通用,这是事实,但作为autoconf注释,它们确实不那么便携.所以,如果这是一个担心(如果你想建立在BSD/Mac OS上,而不是基本上安装GNU make),那就回到"老式的后缀规则".

如果您的模式规则不能被后缀规则替换,则automake不会抱怨的另一个可能的替换是静态模式规则.这与模式规则类似,但需要应用的目标列表.而不是说

%.o: %.c
Run Code Online (Sandbox Code Playgroud)

你不得不说

OBJS = foo.o bar.o baz.o # list all .o files here

$(OBJS): %.o: %.c
Run Code Online (Sandbox Code Playgroud)

或者更一般地说,

target-pattern: prerequisite-pattern
Run Code Online (Sandbox Code Playgroud)

被替换为

target-list: target-pattern: prerequisite-pattern
Run Code Online (Sandbox Code Playgroud)