我见过各种使用.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。
如果这是一个愚蠢的问题,我道歉。
答案 0 :(得分:1)
我首先指出后缀规则为obsolete in GNU make
后缀规则是为
make
定义隐式规则的传统方式。后缀规则已过时,因为模式规则更通用,更清晰。它们在GNUmake
中受支持,以便与旧的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
的依赖关系。