2010-01-02 95 views
3

我正在学习makefiles,我正试图弄清楚如何重用规则。现在,我有以下几点:重用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

递归make,并将您的调试标志追加到CPPFLAGS

debug: 
    $(MAKE) CPPFLAGS="$(CPPFLAGS) /D _DBEBUG" Exercise35.exe 
+0

我做到了这一点,并得到:NMAKE:致命错误U1073:不知道如何使'/ D _DEBUG'' – AlanT 2010-01-02 02:43:42

+0

您所做的更改工程。谢谢! – AlanT 2010-01-02 02:48:48

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和makefiles,那么我强烈推荐阅读“Managing Projects with GNU Make”的前几章。它可以帮助你解决make的一些非直观方面的问题,特别是。它是向后链式的行为。

如果你可以找到一个小的第一版,这是不是gmake特定的,甚至更好的副本。这是解释是更好的恕我直言。

编辑2:以下是本书第一版亚马逊网站的链接,简称为“Managing Projects with Make”。正如我上面所说的,很好的描述为什么表现如此。

HTH

欢呼声,

1

你应该看看化妆的下列属性,看看下面的示例:

  • $ @ - 表示当前目标文件的名称,在这种情况下它对应于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) [email protected] $(FILES) 

            
 
  
             
clobber : clean mrproper 

clean: 
    del $(FILES) 

mrproper: 
    del $(APP) 

            
  

我得到这个从我的旧的makefile模板中,注意化妆将出现“智能”和灵活的,你可以通过这样的

执行专门覆盖国旗的一种补充文件中的调试/释放
 
make EXTRAFLAGS="/D _DDEBUG" 

这将通过在额外定义到生成文件包括_DDEBUG宏,如果你想建立一个发布,离开了命令行EXTRAFLAGS。

编辑: 按Mike的点出来,我认为这将是有用的,包括额外的规则,这样就可以干净的exe和目标代码躺在身边的目录...这是我原来的模板生成文件来自AIX(我在Linux下也使用过......)感谢Mike的支持!

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

+0

不应该是'FILES = Exercise35.cpp'吗?另外,为什么'$(A​​PP)'规则后面的分号?你不需要'.PHONY:所有clobber clean mrproper'规则? – 2010-01-02 02:59:03

+0

@Mike:糟糕...那个分号......我会相应地编辑这个...... :( – t0mm13b 2010-01-02 03:02:57