自动创建Makefile的工具(附上实例讲解)
有时自己写些小程序,希望象常见的GNU程序一样,只要使用“./configure”,“make”,“make install”就可以把程序安装到Linux系统中去了。
一般情况下,大家都是手工写一个简单Makefile,关于这部分请先参考《Makefile使用入门》。但是要想写出一个符合自由软件惯例的Makefile就不那么容易的。
先哲们早想到这点,编写很多关于自动生成Makefile文件的方法。但是,有的只有原理却无操作案例,而有案例却没有详细介绍原理。在此,站在前辈们经验基础上,方法流程结合实例,介绍给大家“八步法”的操作流程,自动创建Makefile文件。
一、自动创建的操作流程
首先进入用户自定义项目目录(projec),在该目录下运行一系列命令,创建和修改几个文件,就可以生成符合该平台的Makefile文件。
创建Makefile的流程,如下图所示:
流程图中文件输入/输出关系,如下表:
流程图操作步骤详解:
1) 执行autoscan命令
2) 将configure.scan 文件重命名为configure.in,并修改configure.in文件
3) 执行aclocal命令
4) 执行autoconf命令
5) 在project目录下新建Makefile.am文件,(如果有各个模块组合,在其源代码子目录下也新建makefile.am文件)
6) 执行autoheader命令
7) 执行automake --add-missing命令
8) 执行./confiugre脚本生成Makefile文件
9)执行“make”命令来编译、生成可执行程序crm;运行程序./crm
10)安装软件crm:make install;打包发布软件:make dist
现在来介绍上述流程图中主要使用的工具,它们是autoconf和automake。
二、主要工具及相关配置文件的简单介绍
1、autoconf
autoconf是一个用于生成可以自动地配置软件源代码的shell脚本的工具,读取configure.in文件然后产生’configure’这个Shell脚本。
一般可先用autoscan这个工具扫描原始文件以产生一个configure.scan 文件,再对configure.scan 作些修改,从而生成 configure.in 文件。
configure.in 文件的内容是一系列GNU m4 的宏,这些宏经autoconf处理后会变成检查系统特性的Shell脚本。configure.in文件中宏的顺序并没有特别的规定,但是每一个configure.in 文件必须以宏AC_INIT开头,以宏AC_OUTPUT结束。
configure.in文件中有以下一些主要的宏:
①AM_INIT_AUTOMAKE(PACKAGE,VERSION):
这个是后面运行automake命令所必需的宏,PACKAGE指明要产生软件的名称,VERSION是其版本号。
②AC_PROG_CC:
检查系统可用的C编译器,若源代码是用C语言编写的就需要这个宏。
③AC_OUTPUT(FILE):
设置configure命令所要产生的文件。我们最终期望产生Makefile这个文件,因此一般将其设置为AC_OUTPUT(Makefile)。
④AC_PROG_RANLIB:
设置基于多库类型的程序,请参考本文的实际案例3.2(shallow目录结构)
⑤其它
AC_PROG_CXX :如果包含了任何C++源代码,就需要它。
AM_PROG_LIBTOOL :将启动为libtool所做的处理
2、automake
automake是一个从文件`Makefile.am'自动生成`Makefile.in' 的工具。每个`Makefile.am'基本上是一系列make的宏定义。这节我们主要了解常用的三方面:
◎Makefile.am文件的主要功能
◎automake设置默认的安装路径
◎automake支持三种目录层次结构
Makefile.am文件的主要功能:
是指要生成什么目标,它由什么源文件生成,要安装到什么目录等构成。其中,可执行文件、静态库、头文件和数据文件的一般格式如下表:
文件类型 | 格式 |
可执行文件 | bin_PROGRAMS=crm crm_SOURCES=main.c f1.c f2.c… crm_LDADD= crm_LDFLAGS= crm_DEPENDENCIES= |
静态库 | lib_LIBRARIES=liblog.a crm_a_SOURCES= crm_a_LDADD= crm_a_LIBADD= crm_a_LDFLAGS= |
头文件 | include_HEADERS=def1.h def2.h defuser.h |
数据文件 | data_DATA=data1 data2 |
INCLUDES:指链接时所需要的头文件
LDADD:指链接时所需要的库文件
LDFLAGS:值链接时所需要的库文件选项标志
EXTRA_DIST:源程序和一些默认的文件自动打入tar.gz包,配置文件、数据文件进入tar.gz包也可以用这种办法。
SUBDIRS:在处理本目录之前递归处理的子目录,如果定义了SUBDIRS,那么你的`configure.in'必须包含AC_PROG_MAKE_SET。
对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。
如果想在Makefile.am中指定库类型编译,示范如下:
lib_LTLIBRARIES=liblog.a
liblog_a_SOURCES=defuser.h admin.c user.c
在根目录下的configure.in中加AC_PROG_LIBTOOL
automake设置默认的安装路径:
1) 标准安装路径:默认安装路径为:$(prefix) = /usr/local,可以通过./configure --prefix=<new_path>的方法来覆盖。其它的预定义目录还包括:bindir= $(prefix)/bin, libdir = $(prefix)/lib, datadir = $(prefix)/share, sysconfdir= $(prefix)/etc等等。
2) 自定义的安装路径:比如test, 可定义builddir = $(prefix)/build, 然后test_LIBRARIES=mytest.h mytest.c,则mytest.h mytest.c 会作为静态库安装到$(prefix)/build目录下。
automake支持三种目录层次结构:
“flat”、“shallow”和“deep”,它们之间主要区别如下:
flat(平)层次结构:指的是所有文件都在一个目录中的;主要特征:`Makefile.am' 缺少宏SUBDIRS。
deep(深)层次结构:指的是所有的源代码都被储存在子目录中的;主要特征:顶层`Makefile.am'将包括宏SUBDIRS。
shallow(浅)层次结构:指的是主要的源代码储存在顶层目录中,而各个部分(典型的是库)则储存在子目录中。
3、使用Makefile文件
执行#./configure脚本,自动创建Makefile,预定几个可供使用的选项:
make all:产生设定的目标,即生成所有的可执行文件。
make clean:删除之前编译时生成的可执行文件及目标文件(形如*.o的中间文件)。
make distclean:除了删除可执行文件和目标文件以外,把configure所产生的 Makefile文件也清除掉。通常在发布软件前执行该命令。
make install:将使用make all或make命令产生的可执行文件以软件的形式安装到系统中。若使用bin_PROGRAMS宏,程序将会被安装到 /usr/local/bin下,否则安装到预定义的目录下。
make dist:将程序和相关的文档包装为一个压缩文档以供发布。执行完该命令,在当前目录下会产生一个名为PACKAGE-VERSION.tar.gz的文件。PACKAGE 和 VERSION 这两个参数是来自configure.in文件中的AM_INIT_AUTOMAKE(PACKAGE,VERSION)。如在下面具体几个例子中执行makedist命令,会产生名为“crm-x.0.tar.gz”的文件。
makedistcheck:与make dist类似,但是加入了检查包装以后的压缩文件是否正常。
三、案例具体实践
实战1:Flat目录结构
实战2:deep目录结构
实战3:shallow目录结构
三种结构是有区别的:
①flat目录结构:
flat目录结构,指的是所有文件都在一个目录中的包。为这类包提供的Makefile.am不需要SUBDIRS这个宏。一般小项目程序,就是把所有源文件及自己写的头文件都位于当前目录里面,且没有子目录。
② deep目录结构
deep目录结构,指的是所有的源代码都被储存在子目录中的包;顶层目录主要包含配置信息。比如日常模块化的项目,一般把所有源文件及自己写的头文件都位于当前目录的一个子目录里面,而当前目录里没有任何源文件。
③ shallow目录结构
shallow目录结构,指的是主要的源代码储存在顶层目录中,而各个部分(典型的是库)则储存在子目录中的包。此项目结构适合扩展功能,也是我们常用结构,就是主要源文件在当前目录里,而其它一些实现各部分功能的源文件各自位于不同目录。比如,GNU
make软件。
四、参考手册
autoconf手册.pdf
automake手册.pdf