设为首页 加入收藏

TOP

使用autotools自动生成Makefile并在此之上使用dh-make生成可发布的deb程序包(一)
2014-11-24 02:33:48 来源: 作者: 【 】 浏览:2
Tags:使用 autotools 自动生成 Makefile 之上 dh-make 生成 发布 deb 程序

使用autotools自动生成Makefile并在此之上使用dh-make生成可发布的deb程序包(详解)


本文将介绍如何使用autotools生成一个Makefile文件,并在此基础上使用dh-make和debuild生成一个可发布的deb程序包,这也是我们在Linux下开发应用程序以及想要发布应用程序需要做的。


无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或 make install。利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和 Makefile工具就可以轻而易举的理顺各个源文件之间纷繁复杂的相互关系。其中 Makefile 文件是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中纪录有文件的信息,在make时会决定在链接的时候需要重新编译哪些文件。


  Makefile的基本结构不是很复杂,但当一个程序开发人员开始写Makefile时,经常会怀疑自己写的是否符合惯例,而且自己写的Makefile经常和自己的开发环境相关联,当系统环境变量或路径发生了变化后,Makefile可能还要跟着修改。所以手动编写Makefile,对任何程序员都是一场挑战。幸而有GNU 提供的Autoconf及Automake这两套工具可以然我们自动生成Makefile。

  使用automake,程序开发人员只需要写一些简单的含有预定义宏的文件,由autoconf根据这个宏文件生成configure,由automake根据另一个宏文件生成Makefile.in,再使用configure依据Makefile.in来生成一个符合惯例的Makefile。本文将介绍如何利用 GNU Autotools工具来协助我们自动产生 Makefile文件,生成Makefile文件后,我们将接着介绍如何使用dh-make和debuild创建一个Debian的安装包文件(deb)。这个deb文件可以拷贝到别的电脑上使用dpkg安装使用(如果足够好,可以发布!)。


使用autotools自动生成Makefile并在此之上使用dh-make生成可发布的deb程序包



这是使用autotools生成Makefile文件的大体步骤。


在当前目录下创建一个名为hello的子目录。进入文件夹并新建一个标准的Hello World的C代码hello.c
#include
int main(int argc, char ** argv){
printf("hello,world\n");
return 0;
}
此时,文件夹下只有一个hello.c文件,



automake根据configure.in中的宏并在perl的帮助下把Makefile.am转成Makefile.in文件。Makefile.am 文件定义所要产生的目标。我们要填写的 Makefile.am 内容为以下两句:
bin_PROGRAMS=beep // bin_PROGRAMS:定义要产生的可执行程序的文件名
beep_SOURCES=hello.c // beep_SOURCES:定义“beep”这个可执行程序所需要的原始文件。如果“beep”这个程序是由多个原始文件产生的,必须把它所用到的所有原始文件都列出来,并以空白符隔开。假设“beep”还需要“hello.c”、“main.c”、“hello.h”3个文件,则定义beep_SOURCES= hello.c main.c hello.h。如果定义多个可执行文件,则对每个可执行程序都要定义相应的filename_SOURCES,其中filename为要生成的可执行程序的文件名。


所以,beep 可以替换为你想要生成的二进制可执行文件名(后面生成deb文件也是一样的名称),如果我最终我们生成的应用名为long.deb,上面两句就写成:
bin_PROGRAMS=long
long_SOURCES=hello.c
当前我们目录下只有:hello.c Makefile.am 两个文件
zhouyl@zhouyl:/tmp/hello$ vim Makefile.am
zhouyl@zhouyl:/tmp/hello$ ls
hello.c Makefile.am



执行autoscan命令,会生成一个configure.scan文件,将configure.scan改名为configure.in
zhouyl@zhouyl:/tmp/hello$ autoscan
zhouyl@zhouyl:/tmp/hello$ ls
autoscan.log configure.scan hello.c Makefile.am
zhouyl@zhouyl:/tmp/hello$ mv configure.scan configure.in
zhouyl@zhouyl:/tmp/hello$ ls


autoscan.log configure.in hello.c Makefile.am



configure.in 文件的内容是一系列GNU m4 的宏,这些宏经autoconf处理后会变成检查系统特性的Shell脚本。configure.in文件中宏的顺序并没有特别的规定,但是每一个configure.in 文件必须以宏AC_INIT开头,以宏AC_OUTPUT结束。



打开configure.in文件我们会看到自动生成的configure.in(scan)包括以下内容:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69]) // 此行是描述需要的工具兼容性,如我们使用的是autotools工具版本是2.69,这个自动生成不要修改
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) // 此行是描述我们要生成的应用的信息,包括:应用名,版本号以及维护人邮箱(直译为反馈bug地址)。比如我们需要将此行修改成 AC_INIT([beep], [0.1], [reaper888@yeah.net])
//下面两行形容的是软件包的地址和名称,以便autotools开始工作
AC_CONFIG_SRCDIR([hello.c])


AC_CONFIG_HEADERS([config.h])



// 在这我们需要加入一行“ AM_INIT_AUTOMAKE ”,如果没有此行,在部分系统生成Makefile时会报错而且生成不了Makefile文件。
# Checks for programs.
AC_PROG_CC//这句高速autotools使用默认的编译器和binutils,当然你也可以传入类似于“ AC_PROG_CC([gcc gcc-4.7]) ”的参数,我们不传参,使用默认即可

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.
// 下面不变
AC_CONFIG_FILES([Makefile])// 设置configure命令

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux的新式线程同步原语——Futex 下一篇《OpenGL超级宝典》学习笔记

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: