`
jinghuainfo
  • 浏览: 1523969 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

系统程序员成长计划-工程管理(二)

 
阅读更多

转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>

系统程序员成长计划-工程管理(二)

HelloWorld

automake比起IDE要复杂很多,这里我们先写一个Hello World例子,明白其中的基本概念后,再用它来管理实际的工程。

o目录结构

最顶层目录名用模块名称,这里是helloworld。
源文件放在模块下的src子目录里,即helloworld/src。

这是惯例。有多个子模块时,各个子模块的源代码放在各自的目录里。

o 创建源文件

在src下创建源文件main.c,内容就是一个简单的Hello World程序。

o 创建Makefile模板

创建helloworld/Makefile.am,内容为:

SUBDIRS=src

这里只有简单的一行代码,表示其下有一个src的子目录,如果有多个子目录,用空格分开就行了。

创建helloworld/src/Makefile.am,内容为:

bin_PROGRAMS=helloworld
helloworld_SOURCES=main.c

这里表示有一个可执行文件helloworld,helloworld由源文件main.c编译而来。

PROGRAMS表示要产生的可执行文件,有多个可执行文件时,用空格分开,而bin表示可执行文件要安装的目录。 SOURCES表示生成可执行文件需要的源文件,有多个源文件时,也用空格分开。

.am扩展名是automake的简称,它是automake用来产生Makefile.in文件的模板。

o 创建autoconf的模板。

在helloworld下运行autoscan,生成文件configure.scan,把它改名为configure.in。这是autoconf的模板文件,它的内容大概为:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.61)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile
src/Makefile])
AC_OUTPUT

这个文件由一系列的宏组成,这些宏最终由命令m4展开,得到一个脚本文件configure。configure的主要功能是探测系统的配置,然后 根据这些配置来产生相应的Makefile文件。比如AC_PROG_CC 是用来检测编译器的,AC_CONFIG_FILES和AC_OUTPUT是用来产生Makefile和其它数据文件的。

不过这个模板文件还不能直接使用,需要做下列修改:

把:
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
改为:
AC_INIT(helloworld, 0.1, xianjimli@hotmail.com)

FULL-PACKAGE-NAME 是模块的名称。

VERSION 是模块的版本号,初始版本号都用0.1。对小模块来说用两级版本号就够了,小数点前的为主版本号,只有重大更新时才升级主版本号。小数点后的为次版本号,每次发布都应该升级它。一般升级到0.9后,可以继续升级到0.10、0.11等。

BUG-REPORT-ADDRESS 是作者或维护者的邮件地址。

再加上一行automake的初始化脚本:

AM_INIT_AUTOMAKE(helloworld, 0.1)

helloworld是模块的名称。

0.1是模块的版本号。

这里和前面的参数是重复的,AC_INIT是初始化autoconf的,AM_INIT_AUTOMAKE是初始automake的。在有的情况下,只是产生数据文件,而不需要编译文件时,那就不需要AM_INIT_AUTOMAKE了。

最后得到下面的文件:

#                                               -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.61)

AC_INIT(helloworld, 0.1, xianjimli@hotmail.com)

AC_CONFIG_SRCDIR([src/main.c])

AC_CONFIG_HEADER([config.h])

AM_INIT_AUTOMAKE(helloworld, 0.1)

# Checks for programs.

AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile

src/Makefile])

AC_OUTPUT

o 拷贝所用到宏。
运行:aclocal

前面说了,configure.in里是一系列的宏,这些宏由命令m4负责展开。m4 实际上就是macro的简称,4代表m后面省略了4个字母。类似的还有I18n (Internationalization )和 L10n(Localization),其中的数字都是代表所省略的字母个数。

AC_PROG_CC 之类的宏是标准的宏(或说是内置的宏),不需要我们自己去写它,但我们需要运行命令aclocal,aclocal把configure.in中所用到的 宏全部拷贝到我们的工程里来。在helloworld目录下运行aclocal之后,当前目录下出现了:

autom4te.cache 这是一个临时目录,只是用来加快宏展开的。
aclocal.m4 是configure.in中用到的宏的定义,有兴趣的读者可以看看。

o 产生配置头文件的模板。
运行:autoheader

配置头文件(config.h)是用来定义在C/C++程序中可以引用的宏,像模块的名称和版本号等等。这些宏由configure脚本产生,但我 们要提供一个模板文件。这个模板文件可以用命令autoheader产生出来。在helloworld目录下运行autoheader之后,当前目录下产 生config.h.in,一般情况不用修改它。

o 创建几个必要的文件。

README:描述模块的功能、用法和注意事项等。
NEWS:描述模块最新的动态。
AUTHORS:模块的作者及联系方式。
ChangeLog:记录模块的修改历史,它有固定的格式:
1.最新修改放在最上面。
2.对于每条记录,第一行写日期,修改者和联系方式。第二行开始以tab开头,再加一个星号,后面再写修改的原因和位置等。如:

2009-03-29 Li XianJing 
* Created

o 生成Makefile.in和所需要的脚本。
运行:automake -a

这个命令会建立COPYING depcomp INSTALL install-sh missing几个文件的链接,这些文件指向系统中的文件。automake最重要的功能是以Makefile.am为模板产生Makefile.in文 件,Makefile.in相对于Makefile.am要复杂很多倍了,所幸的是我们不需要了解它。

o 产生configure脚本。
运行:autoconf

autoconf的功能是调用m4展开configure.in中的宏,生成configure脚本,这个脚本是最终运行的脚本。

o 产生最终的Makefile。
运行:./configure

configure有两个常用的参数:
–prefix 用来指定安装目录,Linux下默认的安装目录是/usr/local。
–host 用于交叉编译,比如x86的PC机上编译在ARM板上运行的程序。

如:./configure –prefix=/home/lixianjing/work/arm-root/usr –host=arm-linux

o 编译
运行:make

o 安装
运行:make install

o 发布软件包
运行:make dist或者make distcheck

make dist用来生成一个发布软件包,这里会产生一个名为helloworld-0.1.tar.gz的文件。通常,源代码管理系统(cvs/svn/git)中的源代码是处于开发中的,是不稳定的,而发布的软件包则是稳定的,可供用户使用的。

怎样,是不是有点晕了?这里主要是想读者了解其中的原理,在实际操作中,我们可以把make之前的部分动作放到一个脚本文件中,这个脚本文件通常取名为autogen.sh或者bootstrap。

分享到:
评论

相关推荐

    一个开源通用的应用程序框架2版 (待参与)

     工程文件位于“Instance”目录,User.dat是用户数据文件,所有的用户组、用户都保存在这个文件里(密码也用的明文保存)。“日志”目录保存所有的目录,每一位用户每次的使用都会有日志记录如果想要下载演示,可以...

    积分管理系统java源码-DocCollection:文档集

    积分管理系统java源码 ...汇总java生态圈常用技术框架、开源中间件,系统架构、数据库、大公司架构案例、常用三方类库、项目管理、线上问题排查、个人成长、思考等知识 TheAlgorithms Github地址: 算法与数据结构

    自己动手写操作系统(含源代码).part2

    经过四年的磨练成长,于渊又拿出第二版的书稿《Orange'S:一个操作系统的实现》,这本书是属于真正 Hacker的。我虽然已经有多年不写代码了,但看这本书的时候,让我又重新感受到做程序员的乐趣:用代码建设属于自己...

    自己动手写操作系统(含源代码).part1

    经过四年的磨练成长,于渊又拿出第二版的书稿《Orange'S:一个操作系统的实现》,这本书是属于真正 Hacker的。我虽然已经有多年不写代码了,但看这本书的时候,让我又重新感受到做程序员的乐趣:用代码建设属于自己...

    软件开发人员薪酬设计方案(1).doc

    初级应用工程师、应用工程师、系统分析员和开发经理等技术职称分别对应不同的 工资等级范围,员工的工资水平既可随技术职称的提升而升至更高等级,也可以随业绩 的提升在同一工资等级范围内向上浮动。令每位软件...

    java版商城源码下载-awesome-jp:百宝箱

    生态圈常用技术框架、开源中间件,系统架构、数据库、大公司架构案例、常用三方类库、项目管理、线上问题排查、个人成长、思考等知识 :该项目是一系列小而专注的教程 - 每个教程都涵盖 Java 生态系统中单一且定义...

    敏捷软件开发.pdf

     5A.3.4规划管控、Burn图和系统工程  5A.3.5用例和用户故事  5A.4经久不绝的问题  5A.4.1最佳击球点和下降  5A.4.2固定价格、固定范围的合同  5A.4.3敏捷、CMMI和ISO9001  5A.4.4何时停止建模  5A.4.5高科技...

    深入理解Android:卷I--详细书签版

     第9章分析了Vold和Rild,其中Vold负责Android平台中外部存储设备的管理,而Rild负责与射频通信有关的工作。本章的拓展思考部分介绍了嵌入式系统中与存储有关的知识,还探讨了 Rild和Phone设计优化方面的问题。 ...

    SVN培训资料.pptx

    TortoiseSVN:是SVN客户端程序,为windows外壳程序集成到windows资源管理器和文件管理系统的Subversion客户端。SVNService.exe:是专为 SubVersion 开发的一个用来作为 Win32 服务挂接的入口程序。 SVN培训资料全文...

    编程高手箴言(推荐)

    1.2.1 高手成长的六个阶段 5 1.2.2 初级程序员和高级程序员的区别 7 1.2.3 程序员是吃青春饭的吗 9 1.3 正确的入门方法 11 1.3.1 规范的格式是入门的基础 13 1.3.2 调试的重要性 17 1.4 开放性思维 18 1.4.1 动态库...

    编程高手箴言(中文完整版)(13M)

    1.2.1 高手成长的六个阶段 5 1.2.2 初级程序员和高级程序员的区别 7 1.2.3 程序员是吃青春饭的吗 9 1.3 正确的入门方法 11 1.3.1 规范的格式是入门的基础 13 1.3.2 调试的重要性 17 1.4 开放性思维 18 1.4.1 动态库...

    代码大全中文版

    由于本书的中心内容是广大程序员们所熟知的实现过程,因此,无论是受过正规训练而已经验丰富的程序员,还是完全靠自学成长起来的程序员,都能容易读懂本书所论述的先进技术和方法。 自学成才的程序员  ...

    皮肤控件研究文档,破解后的库文件,皮肤设计工具使用教程

    界面与逻辑分开,让程序员有更多的时间去进行软件内部的逻辑处理。SkinSE没有采用传统的HOOK修改窗口过程函数的方式 ,而是只是针对具体窗口进行界面处理。SkinSE只用到了windows几个底层的核心库,没有用到(MFC/ATL...

Global site tag (gtag.js) - Google Analytics