重复使用makefile规则

5

我正在学习Makefile,试图找出如何重用规则。目前我有以下内容:

CPP = cl

CPPFLAGS = /Od /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /c /ZI /TP /errorReport:prompt

.SUFFIXES: .exe .cpp

Exercise35.exe:
    $(CPP) Exercise35.cpp $(CPPFLAGS)

debug:
    $(CPP) Exercise35.cpp $(CPPFLAGS) /D "_DEBUG"

看起来debug规则基本上重复了Exercise35规则,只是多了一个命令行参数。有更好的方法吗?

3个回答

3
递归运行“make”,并将调试标志附加到“CPPFLAGS”中。
debug:
    $(MAKE) CPPFLAGS="$(CPPFLAGS) /D _DBEBUG" Exercise35.exe

我执行了这个操作并得到了以下错误信息:NMAKE: 致命错误 U1073: 不知道如何生成“'/D _DEBUG'”。 - AlanT

1

您应该查看make的以下属性,并查看下面的示例:

  • $@ - 表示当前目标文件的名称,在本例中对应于APP的值。
  • $< - 表示比目标更新的单个文件,目标依赖于该文件。
  • $? - 表示比当前目标更新的文件列表,目标依赖于这些文件。
.SUFFIXES: .cpp.exe
CPP = cl
EXTRAFLAGS = 
CPPFLAGS = /Od /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /ZI /TP /errorReport:prompt
FILES = Exercise35 APP = Exercise35.exe .cpp.exe: $(CPP) $(EXTRAFLAGS) $(CPPFLAGS) /c $<
all : $(APP) $(APP) : $(FILES) $(CPP) $(EXTRAFLAGS) $(CPPFLAGS) $@ $(FILES) clobber : clean mrproper clean: del $(FILES)
mrproper: del $(APP)

我从我的旧makefile模板中得到了这个,注意,通过像这样执行,make将会变得“智能”和灵活,因为您可以在一个make文件中覆盖特定于调试/发布的标志:

make EXTRAFLAGS="/D _DDEBUG"

这将传递额外的定义到makefile中,以包含_DDEBUG宏。如果您希望构建发布版本,请在命令行中省略EXTRAFLAGS。

编辑: 根据Mike的指出,我认为包括额外的规则是有用的,这样您就可以清理目录中散落的exe和对象代码...这是我最初从AIX(我也在Linux下使用过...)得到的模板makefile。感谢Mike的提醒!

希望这有所帮助, 最好的问候, 汤姆。


应该是FILES = Exercise35.cpp吧?此外,为什么在$(APP)规则后面要加分号?你不需要一个.PHONY: all clobber clean mrproper规则吗? - Mike DeSimone
@Mike:糟糕...那个分号...我会相应地进行编辑... :( - t0mm13b

0

你好,

我更倾向于将调试选项作为Makefile中的宏。

CPP = cl

CPPFLAGS = /Od /D "WIN32" /D "_CONSOLE" /D \
    "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 \
    /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 \
    /nologo /c /ZI /TP /errorReport:prompt

#DEBUG = /D "_DEBUG"
DEBUG =

.SUFFIXES: .exe .cpp

Exercise35.exe:
    ${CPP} Exercise35.cpp ${CPPFLAGS} ${DEBUG}

然后将您不想使用的DEBUG宏版本注释掉。

顺便说一句,最好使用${}而不是$()来引用Makefile宏,因为圆括号用于将对象替换为存档,而花括号则不会。

编辑:如果您正在学习make和makefile,我强烈推荐阅读《使用GNU Make管理项目》的前几章。这将帮助您了解一些make行为的非直观方面,尤其是它的反向链接行为。

如果您能找到一份不太依赖于gmake的第一版,则更好。在我看来,它的解释要好得多。

编辑2:这是一个指向亚马逊网站上一版名为《使用Make管理项目》的书籍的链接。正如我上面所说的,它很好地描述了make的行为原理。

希望对您有帮助。

祝好,


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接