首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能禁用“默认”后缀-规则,在Gnu-Make中

不能禁用“默认”后缀-规则,在Gnu-Make中
EN

Stack Overflow用户
提问于 2015-09-13 04:16:47
回答 2查看 670关注 0票数 3

我的Makefile,如下所示:

代码语言:javascript
复制
.SUFFIXES:foo


# Disable "default" suffix-rules.
MAKEFLAGS=-r


# A rule without a recipe!
all.o::

# File 'all.c' is "ought to exist".
all.c:
    touch '$@'

正在执行,我得到:

代码语言:javascript
复制
# Gnu-make still applies the "default" suffix-rule '.c.o'. Wrong?
$ make
cc    -c -o all.o all.c

为什么我不能禁用后缀规则?

EN

回答 2

Stack Overflow用户

发布于 2015-09-13 13:26:10

问题是,添加-r标志只会删除默认后缀规则设置。使用.SUFFIXES: foo时,您将向现有设置添加一个新的后缀规则。完成此操作后,.SUFFIXES的值不再与默认值相同,因此添加-r标志不会更改它。如果您想将它提交到萨凡纳上,这可以被认为是一个有用的增强请求。

如果您想使用新的后缀规则,但不使用任何预定义的规则,则可以使用POSIX标准所要求的永久可用的方法;首先删除所有现有的规则,然后添加新的:

代码语言:javascript
复制
.SUFFIXES:
.SUFFIXES: foo
票数 3
EN

Stack Overflow用户

发布于 2015-09-13 05:09:30

定义.SUFFIXES的先决条件将添加到已知后缀列表中。它不移除已知的后缀。作为一种异常,如果您在没有先决条件的情况下为.SUFFIXES定义规则,则取消所有隐式规则:

代码语言:javascript
复制
$ cat Makefile
.SUFFIXES:
foo.c:
    touch $@
$ rm -f foo.* ; make foo.o
make: *** No rule to make target `foo.o'.  Stop.

注意:要取消使.o.c生成的隐式规则,还可以添加模式规则而不需要配方:

代码语言:javascript
复制
%.o: %.c

关于MAKEFLAGS,根据文档,它的主要用途似乎是将选项传递给子制造。然而,文件还指出:

还可以在makefile中设置MAKEFLAGS,以指定对该makefile也有效的附加标志

因此,从逻辑上讲,在makefile中定义MAKEFLAGS = -r应该具有与invoquing make -r相同的效果。这就是你所期望的行为。显然,情况并非如此( GNU make版本3.81和3.82):

代码语言:javascript
复制
$ cat Makefile
MAKEFLAGS += -r
foo.c:
    touch $@
$ rm -f foo.* ; make --version ; make foo.o
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i686-pc-linux-gnu
touch foo.c
cc    -c -o foo.o foo.c

以及:

代码语言:javascript
复制
$ rm -f foo.* ; make --version ; make foo.o
GNU Make 3.82
Built for i686-pc-linux-gnu
Copyright (C) 2010  Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
touch foo.c
cc    -c -o foo.o foo.c

但是它适用于GNU make4.0和4.1:

代码语言:javascript
复制
$ rm -f foo.* ; make --version ; make foo.o
GNU Make 4.0
Built for i686-pc-linux-gnu
Copyright (C) 1988-2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
make: *** No rule to make target 'foo.o'.  Stop.

以及:

代码语言:javascript
复制
$ rm -f foo.* ; make --version ; make foo.o
GNU Make 4.1
Built for i686-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
make: *** No rule to make target 'foo.o'.  Stop.

很明显,窃听器已经修好了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32546232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档