关闭

C++工程管理中autoconf使用

456人阅读 评论(0) 收藏 举报
分类:
build C++工程一般步骤?


     C++工程比Java工程需求较少,C++工程的build一般包括:生成配置boot、配置configure、编译make、安装install。编译一般输入是源文件,输出是可执行文件、静态或者动态库;安装一般是将可执行文件或者库拷贝到目标文件夹下。Java工程要求还包括:编译之前检查版本、依赖文件、获取依赖;编译后输出说明文档、输出依赖、进行单元测试;安装时候设置环境变量、获取其他库或者依赖、启动某些服务等。总结起来,工程构建几步如下,Java在其他地方说明。
<ul name = C++>
     <li>Boot:一般是使用autoreconf工具生成configure文件和Makefile。</li>
     <li>Configure:检查依赖及依赖的版本。</li>
     <li type = make stage>
          <p>make:编译库或者可执行文件。</p>
          <p>make test:生成单元测试。</p>
     </li>
     <li type = install stage>
          <p>install:安装可执行文件或者库,生成release信息等。</p>
          <p>unit test:C++工程一般需要shell脚本手动运行test。</p>
     </li>
</ul>




什么工具比较好?


     原始阶段,C++工程是手工或者shell脚本进行make和install,后来出现了GNU make,这样可以自动化make和install。后来出现了automake、autoconf,可以自动生成配置与Makefile。本文重点讲述autoconf如何使用。
<ul>
     <li>autoconf中文手册:http://www.cnblogs.com/fengwei/p/4394165.html</li>
     <li>automake</li>
     <li>libtool</li>
</ul>
     autoconf中Makefile.am组织方式有两种,一种是顶层一个Makefile.am或者顶层Makefile切分放到底层目录然后顶层目录再include;另一种是每一层都有一个Makefile。这两种最大的区别就是,第一种一个宏全局有效(后面都是使用+=方式追加,例如OVS工程管理),第二种是宏本层有效(例如openrouter)。




哪个工程这样使用?


     首先分析多层Makefile.am的工程,openrouter-1.6为例(http://www3.openrouter.org/livecd.html),使用autoconf+automake+libtool。一般这样的工程都会写好脚本,我们只要知道怎么增量开发就好。
     以openrouter-1.6中nsx-integration为例,其中xrl、CMD部分请看其他,这里假定源文件都OK了。首先创建nsx_integration文件夹,修改顶层(即nsx_integration上级目录Makefile.am) :
<ul>
     <li>SUBDIRS +=  lacp lldp mstp system snmp dhcp igmpsnooping shell dot1x nsx_integration</li>
     <li>IST_SUBDIRS    = ... nsx_integration</li>
<ul>
可见顶层目录负责指定src与dst。
     然后创建nsx_integration文件夹下的Makefile.am。
<p>
####################
# nsx_integration工程几部分:
#     nsx_integration程序源代码,在本目录
#     libvtepctl.la,在本目录
#     ovs库,在./ovs目录
#     系统库ssl,crypto,pthread,这个路径就使用环境变量吧
# 由于是每层单独使用Makefile.am这样的结构,所以每个
# Makefile.am都单独使用目标宏,所以看的都是重定义。
####################
# 1. 定义编译目录。
SUBDIR = ovs/lib . tools


# 2. 定义文档。
#     datadri、data_DATA,这个好像是检查这个data文件是否存在
datadir = $(prefix)/bin/$(subdir)
data_DATA = ./ovs/vtep/vtep.ovsschema


# 3. 定义目标。
#      注意这里的$(subdir)使用了上面SUBDIRS定义的所有subdir
bindir = $(prefix)/bin/$(subdir)     # 目标目录
bin_PROGRAM = openrouterlus_nsx       # 目标1,openrouterlus_nsx
#     特别注意noinst_XXX,是指下面这个可执行文件或者库
#     不想被安装到系统中(也就是使用make install命令对下面这个文件没用)
noinst_LTLIBERARIES = libvtepctl.la     # 目标2,libvtepctl.la库


# 4. 定义静态依赖。
#     在实际工程中一个目标生成最好使用静态库或者源代码,因为动态库涉及到升级、路径等较多问题。
#     但是Java就全部是动态的依赖,所以Java升级更方便。但是Java对工程的管理要求更高,
#     所以Java使用更高级的Maven来进行管理。
openrouterlus_nsx_LADD = ...


# 5. 定义源文件。
#     源文件很简单了,就是把本目录下文件加上就行,由于现在使用的是多层Makefile.am方式,
#     深层文件自会有人负责。
openrouterlus_nsx_SOURCES = ...


# 6. 定义libvtepctl.la的源文件与编译选项
libvtepctl_la_CFLAGS   = -Wno-sign-compare                                      
libvtepctl_la_SOURCES  = ...


# 7. 定义INCLUDE
INCLUDES = ...


# 要注意的是Makefile.am中顺序不重要。
</p>


     然后分析单层Makefile.am工程,例如OVS。首先先从底层分割的Makefile.am开始,顶层Makefile.am基本是CFLAG定义。以vtep中Makefile.am为例:
<p>
# 略过其他
# 1. 定义bin目标
#     由于使用单Makefile.am结构而不是层次结构,所以这里的目录结构是这样
bin_PROGRAMS += vtep/vtep-ctl


# 2. 定义源文件
#     再次注意目录结构
vtep_vtep_ctl_SOURCES = vtep/vtep-ctl.c


# 3. 库文件
vtep_vtep_ctl_LDADD = lib/libopenvswitch.la 
</p>
顶层Makefile.am只需要include底层目录的Makefile.am即可。除了上述的编译用途之外还有:生成man文件,生成其他文档。再以./vswitchd/中添加inventory功能为例:
<p>
# 1. 源文件中增加
# 2. EXTRA_DIST中增加
# 3. schema检查
# 4. CLEANFILES
</p>













































0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:55386次
    • 积分:1268
    • 等级:
    • 排名:千里之外
    • 原创:79篇
    • 转载:18篇
    • 译文:0篇
    • 评论:18条
    最新评论