C++工程管理中autoconf使用

原创 2015年07月10日 15:32:55
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>













































automake/autoconf工程管理

目录结构 最顶层目录名用模块名称,这里是test 源文件放在模块下的src子目录里,这里是test/src   创建源文件 在src下创建test.c   #include int main(int...
  • KEYTOME
  • KEYTOME
  • 2010年12月28日 19:03
  • 755

C++coder必读---最详细Autoconf和automake说明(中英文翻译参考文档)

原文链接http://www.cnblogs.com/konyel/articles/1272101.html 一,内容简介  *Autoconf和automake用于何处和他们所担任的角色。...
  • wang_xya
  • wang_xya
  • 2014年12月01日 15:13
  • 786

Autoconf/Automake/libtool的使用例子

 Autoconf/Automake/libtool的使用例子 现在有环境 t/,下面有4个源码目录分别是client/ lib/ daemon/ module/,要达到的目标是1、将lib/ mod...
  • rufeng18
  • rufeng18
  • 2009年12月01日 09:33
  • 2297

Autoconf学习笔记

Autoconf介绍 Autoconf是一个用于产生shell脚本来自动配置软件源码包的M4宏扩展包。这些脚本可以适应众多的类UNIX系统源码包而不需要用户手动干预。Autoconf通过模板文件以M...
  • Kai_gai
  • Kai_gai
  • 2015年05月06日 17:27
  • 1411

autoconf / automake工具使用介绍

一、简介 作为Linux下的程序开发人员,一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便。一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由...
  • gulansheng
  • gulansheng
  • 2015年01月13日 21:08
  • 1559

Linux C工程管理 之autoconf与automake

一、autoconf      autoconf是一个用于生成可以自动的配置软件源代码包以适应多种UNIX系统的shell脚本的工具。由autoconf生成的配置脚本在运行时与autoconf是无关...
  • Bruce_0712
  • Bruce_0712
  • 2016年12月11日 12:26
  • 346

GUN automake,autoconf写Makefile(一)

摘要  网上这方面的文章不少,也有很多错误的,如何去伪存真也不容易,英文好的同学最好还是看官方的介绍,毕竟是原版专业的,最近刚好用到这个工具,写下我自己的认识,抛砖引玉希望能给大家一点参考。 首先还是...
  • lyc417356935
  • lyc417356935
  • 2014年04月03日 21:22
  • 645

AUTOCONF 和AUTOmake使用详解

http://blog.csdn.net/yunhua_lee/article/details/6172617
  • zhang_shuai_2011
  • zhang_shuai_2011
  • 2013年12月02日 15:47
  • 684

Linux命令-查看autoconf包是否安装

1.查看autoconf包是否安装:rpm -qa|grep autoconf
  • jiao_zg
  • jiao_zg
  • 2017年05月26日 17:34
  • 691

linux 系统中Autoconf/Automake的使用

作为Linux下的程序开发人员,一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便。一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Mak...
  • longshengguoji
  • longshengguoji
  • 2012年11月20日 15:57
  • 953
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++工程管理中autoconf使用
举报原因:
原因补充:

(最多只允许输入30个字)