无法理解makefile ubuntu中.suffixes规则的使用

时间:2016-08-01 04:56:16

标签: makefile

我见过各种使用.SUFFIXES规则的makefile。根据我的理解,这意味着,举一个简单的例子

第1步:

.SUFFIXES: .o .c .cpp .cc .cxx .C

#where $< indicates the source file and $@ represents the target file.
.cpp.o:
        $(CXX) -c $(INCPATH) -o "$@" "$<"

它将使用带有.o编译器的源将目标文件编译为CXX文件。

但在此之后我还会看到其他一些命令,比如

第二步:

all: Makefile $(TARGET)

第3步:

someobjectfile.o: dependencies

因此,如果我们可以使用.SUFFIXES规则来编译我的目标,那么为什么要使用Step3。 如果这是一个愚蠢的问题,我道歉。

2 个答案:

答案 0 :(得分:1)

我首先指出后缀规则为obsolete in GNU make

  

后缀规则是为make定义隐式规则的传统方式。后缀规则已过时,因为模式规则更通用,更清晰。它们在GNU make中受支持,以便与旧的makefile兼容。

(尽管由于遗留原因.SUFFIXES仍然可以控制哪些内置规则可用。)

那就是说,仅仅因为你已经告诉make .o文件可以从具有某些后缀的来源编译,并不意味着除了单个源文件之外没有任何其他依赖项,以下是非常常见的例如

someobjectfile.o: someheader.h someotherheader.h

答案 1 :(得分:1)

.SUFFIXES控件suffix rules

  

后缀规则是为make定义隐式规则的老式方法。后缀规则已过时,因为模式规则更通用,更清晰。它们在GNU make中受支持,以便与旧的makefile兼容。

换句话说,您可以忽略.SUFFIXES并将模式规则写为:

%.o : %.cpp
someobjectfile.o: dependencies

无论someobjectfile.o如何制作,上述内容都会添加.o的依赖关系。