17 过于前卫的Makefile方式
这个”陷阱”的说法有点吹毛求疵,ACE提供了一种很前卫的Makefile方式,他定义了Makefile的基础变量,以及包括规则。如果使用他来辅助Makefile的书写,特别是在跨平台开发中,你可以大大节省Makefile开发时间。
BIN = hello_ace
BUILD = $(VBIN)
SRC = $(addsuffix .cpp,$(BIN))
LIBS = -lMyOtherLib
LDFLAGS = -L$(PROJ_ROOT)/lib
#---------------------------------------------------
#Include macros and targets
#---------------------------------------------------
include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU
include $(ACE_ROOT)/include/makeinclude/macros.GNU
include $(ACE_ROOT)/include/makeinclude/rules.common.GNU
include $(ACE_ROOT)/include/makeinclude/rules.nonested.GNU
include $(ACE_ROOT)/include/makeinclude/rules.bin.GNU
include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
但是麻烦就在于ACE的这些Makefile方法几乎没有一个文档帮助说明,我一直无法理解$VBIN到底是什么。这也许,另外,定义到规则这一层也大大限制了大家对Makefile的扩展能力。这就有一点点高不成低不就的味道了,Makefile的新手几乎不可能了解ACE的Makefile,老手又会因为特殊的需求得不到满足而踌躇。而我个人一般只使用ACE定义的Makefile变量。这些变量大部分在wrapper_macros.GNU,platform_macros.GNU
表2 ACE Mafile的变量定义
变量 | 描述 |
AR | ar 命令的名字 |
ARFLAGS | ar 的参数 |
CC | C编译器的命令的 |
CXX | C++编译器的命令 |
RC | 资源编译器命令的名字 |
COMPILE.c | 编译C文件的命令行, 一般为:$(CC) $(CFLAGS) $(CPPFLAGS) -c |
COMPILE.cc | 编译C++文件的命令行,一般为:$(CXX) $(CCFLAGS) $(CPPFLAGS) $(PTDIRS) –c |
COMPILEESO.cc
| $(CXX) $(CCFLAGS) $(CPPFLAGS) $(PTDIRS),没太搞明白,不知道为什么和SO有关,好像是为了修正错误增加的。不理也罢
|
CPPFLAGS
| C,C++语言编译的预标志,比如DEFINDE等. CPPFLAGS += $(DEFFLAGS) $(INCLDIRS) |
CFLAGS
| C语言编译选项 |
CCFLAGS
| C++语言编译选项 |
DCFLAGS | Debugging 程序的C语言编译选项,一般在有debug=1变量时有效 |
DCCFLAGS
| Debugging 程序的C++语言编译选项,一般在有debug=1变量时有效 |
DEFFLAGS | C++ 预处理的DEFINE部分 |
DLD | dynamic linker 动态库link命令的名字, |
LD | linker 命令的名字 |
IDL
| CORBA IDL compiler 命令的名字 |
INCLDIRS | INCLUDE的头文件 |
LDFLAGS
| ld linker flags |
LINK.c | 链接C文件的命令行 |
LINK.cc | 链接C++文件的命令行,一般为:$(PURELINK) $(PRELINK) $(LD) $(CCFLAGS) $(CPPFLAGS) $(PTDIRS) |
MAKEFLAGS | Flags that are passed into the compilation from the commandline |
OCFLAGS
| Optimizing 程序的C语言编译选项 |
OCCFLAGS
| Optimizing 程序的C++语言编译选项 |
PIC | PIC就是position independent code |
PCFLAGS | profiling 程序的C语言编译选项 profiling是什么不要问我。 |
PCCFLAGS | profiling 程序的C++语言编译选项 |
PRELINK | LINK之前执行的命令 |
PURELINK | purify 执行的命令,purify是什么不要问我。 |
PWD
| 得到当前目录的命令 |
PTDIRS
| 模板文件的路径定义 |
RM
| 删除工具的命令 |
ACE_MKDIR
| 递归创建的目录 |
SOFLAGS | 生成.so库时候的参数 |
SOLINK.cc | 生成.so库时候的命令行 |
VAR | Variant identifier suffix |
VDIR | Directory for object code .obj/ |
VSHDIR | Directory for shared object code .shobj/ |
看起来变量很多,其实要记住和使用的可以很少,你需要留意的主要是.cc结尾的变量就可以了。我们可以使用ACE MakreFile的变量,方便我们的Makefile开发。比如:
我的Makefile,就使用了$(LINK.cc), $(COMPILE.cc)两个宏。
#使用ACE的wrapper_macros.GNU的定义变量
include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU
#得到C,CPP文件的列表
SRC_FILE = $(wildcard ./*.cpp )
#通过.C,.CPP文件名称得到.O文件名称,.o 文件放在../../object/exampleexe/目录下
O_FILE = $(patsubst ./%.cpp, ../../object/exampleexe/%.o, $(CPP_FILE))
#输出文件exe_file
OUTFILE = ../../bin/exampleexe
# LIB_ALL为 –l文件和-L目录的定义
$(OUTFILE): $(O_FILE)
$(LINK.cc) -o$(OUTFILE) $(O_FILE) $(LIB_ALL)
#.o输出文件放在../../object/目录下
../../object/exampleexe/%.o : ./%.cpp
$(COMPILE.cc) $(INC_ALL) $< -o $@
clean:
$RM -f $(OUTFILE) $(O_FILE)
是不是也很酷,轻松实现Makefile的跨越平台移植。