【Linux技术】autotools制作makefile过程详解【转】

转自:http://www.cnblogs.com/lcw/p/3159461.htmlPreface

   Makefile固然可以帮助make完成它的使命,但要承认的是,编写Makefile确实不是一件轻松的事,尤其对于一个较大的项目而言更是如此。那么,有没有一种轻松的手段生成Makefile而同时又能让我们享受make的优越性呢?autotools系列工具正是为此而设的,它只需用户输入简单的目标文件、依赖文件、文件目录等就可以轻松地生成Makefile了,这无疑是广大用户的所希望的。另外,这些工具还可以完成系统配置信息的收集,从而可以方便地处理各种移植性的问题。

   也正是基于此,现在Linux上的软件开发一般都用autotools来制作Makefile。

   但是这个工具对像我们这样的初学者来说还是比较陌生,网上找到的使用方法又比较分散,所以这里我把整个流程完整的记录下来,利人利己!

autotools使用流程

   正如前面所言,autotools是系列工具,读者首先要确认系统是否装了以下工具(可以用which命令进行查看)。

     ·aclocal

     ·autoscan

     ·autoconf

     ·autoheader

     ·automake

   使用autotools主要就是利用各个工具的脚本文件以生成最后的Makefile。其总体流程是这样的:

     ·使用aclocal生成一个“aclocal.m4”文件,该文件主要处理本地的宏定义;

     ·改写“configure.scan”文件,并将其重命名为“configure.in”,并使用autoconf文件生成configure文件。

   接下来,将通过一个简单的hello.c例子来熟悉autotools生成makefile的过程.

先看效果

1.autoscan
   首先运行autoscan命令,它会在给定目录及其子目录树中检查源文件,若没有给出目录,就在当前目录及其子目录树中进行检查。它会搜索源文件以寻找一般的移植性问题并创建一个文件件“configure.scan”,该文件就是接下来autoconf要用到的“configure.in”原型。

2.autoconf

   configure.in是autoconf的脚本配置文件,它的原型文件即“configure.scan”

   (注意)这里要将configure.scan改名为configure.ac,并手动修改其中的内容。该文件主要用于定义程序的

基本信息(名字、版本号等)、在进行编译之前需要进行的测试、需要在哪些目录生成Makefile文件等等

   改后的configure.ac如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1 #                                               -*- Autoconf -*-
 2 # Process this file with autoconf to produce a configure script.
 3
 4 AC_PREREQ([2.68])
 5 #AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
 6 AC_CONFIG_SRCDIR([hello.c])
 7 AC_CONFIG_HEADERS([config.h])
 8
 9 #add-me-------------
10 AC_INIT(hello,1.0,[email protected])
11 AM_INIT_AUTOMAKE(hello,1.0)
12
13 # Checks for programs.
14 AC_PROG_CC
15
16 # Checks for libraries.
17
18 # Checks for header files.
19 AC_CHECK_HEADERS([stdlib.h])
20
21 # Checks for typedefs, structures, and compiler characteristics.
22
23 # Checks for library functions.
24
25 AC_CONFIG_FILES([Makefile])
26 AC_OUTPUT

   其中add-me----后面两句是加进去的,AC_INIT宏用来定义软件的名称和版本等信息;  

   AM_INIT_AUTOMAKE是automake所必备的宏,参数分别是所要产生软件套件的名称和版本编号。

   下面解释下其它代码

   ·以“#”号开始的行为注释。

   ·AC_PREREQ宏声明本文件要求的autoconf版本,如本例使用的版本2.59。

   ·AC_INIT宏用来定义软件的名称和版本等信息l。

   ·AM_INIT_AUTOMAKE是笔者另加的,它是automake所必备的宏,也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号。

   ·AC_CONFIG_SRCDIR宏用来侦测所指定的源码文件是否存在,来确定源码目录的有

效性。在此处为当前目录下的hello.c。

   ·AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用。

   ·AC_CONFIG_FILES宏用于生成相应的Makefile文件。

   ·中间的注释间可以添加分别用户测试程序、测试函数库、测试头文件等宏定义。

   接下来首先运行aclocal,生成一个“aclocal.m4”文件,该文件主要处理本地的宏定义。

   再接着运行autoconf,生成“configure”可执行文件。

3.autoheader

   接着使用autoheader命令,它负责生成config.h.in文件。该工具通常会从“acconfig.h”文件中复制用户附加的符号定义,因此此处没有附加符号定义,所以不需要创建“acconfig.h”文件。如下所示:

4.automake

   这一步是创建Makefile很重要的一步,automake要用的脚本配置文件是Makefile.am,用户需要自己创建这个文件。之后,automake工具将其转换成Makefile.in。
   在该例中,创建的文件为Makefile.am如下所示:

1
2
3
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS= hello
hellohello_SOURCES= hello.c

   下面对该脚本文件的对应项进行解释。

   ·其中的AUTOMAKE_OPTIONS为设置automake的选项。由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了三种软件等级:foreign、gnu和gnits,让用户选择采用,默认等级为gnu。在本例使用foreign等级,它只检测必须的文件。

   ·bin_PROGRAMS定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。

   ·hello_SOURCES定义“hello”这个执行程序所需要的原始文件。如果”hello”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。例如:若目标体“hello”需要“hello.c”、“sunq.c”、“hello.h”三个依赖文件,则定义hello_SOURCES=hello.c sunq.c。
   接下来可以使用automake对其生成“configure.in”文件,在这里使用选项“—adding-missing”可以让automake自动添加有一些必需的脚本文件。

   在automake之后就可以生成configure.in文件。

5.运行configure

   在这一步中,通过运行自动配置设置文件configure,把Makefile.in变成了最终的Makefile。如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[email protected]-dell:~/Desktop/autotools$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for stdlib.h... (cached) yes
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands

   可以看到,在运行configure时收集了系统的信息,用户可以在configure命令中对其进行方便地配置.

   在./configure的自定义参数有两种,一种是开关式(--enable-XXX或--disable-XXX),另一种是开放式,即后面要填入一串字符(--with-XXX=yyyy)参数。读者可以自行尝试其使用方法。另外,读者可以查看同一目录下的”config.log”文件,以方便调试之用。

   到此为止,makefile就可以自动生成了。回忆整个步骤,用户不再需要定制不同的规则,而只需要输入简单的文件及目录名即可,这样就大大方便了用户的使用。

autotools生成的Makefile除具有普通的编译功能外,还具有以下主要功能:

1.make

   键入make默认执行”make all”命令,即目标体为all,其执行情况如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
[email protected]-dell:~/Desktop/autotools$ make
cd . && /bin/bash ./config.status config.h
config.status: creating config.h
make  all-am
make[1]: Entering directory `/home/mystery/Desktop/autotools‘
gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT hello.o -MD -MP -MF .deps/hello.Tpo -c -o hello.o hello.c
mv -f .deps/hello.Tpo .deps/hello.Po
gcc  -g -O2   -o hello hello.o
cd . && /bin/bash ./config.status config.h
config.status: creating config.h
config.status: config.h is unchanged
make[1]: Leaving directory `/home/mystery/Desktop/autotools‘

   此时在本目录下就生成了可执行文件“hello”,运行“./hello”能出现正常结果,如下所示:

1
2
[email protected]-dell:~/Desktop/autotools$ ./hello
!!!Hello World!!!

2.make install
   此时,会把该程序安装到系统目录中去;

   若直接运行hello,也能出现正确结果。

3.make clean
   此时,make会清除之前所编译的可执行文件及目标文件(object file, *.o),如下所示:

1
2
3
[email protected]-dell:~/Desktop/autotools$ make clean
test -z "hello" || rm -f hello
rm -f *.o

4.make dist
   此时,make将程序和相关的文档打包为一个压缩文档以供发布,如下所示:

1
2
3
[email protected]-dell:~/Desktop/autotools$ make dist
[email protected]-dell:~/Desktop/autotools$ ls hello-1.0-tar.gz
hello-1.0-tar.gz

   可见该命令生成了一个hello-1.0-tar.gz的压缩文件。

   由上面的讲述不难看出,autotools确实是软件维护与发布的必备工具,也鉴于此,如今GUN的软件一般都是由automake来制作的。
时间: 2024-08-24 22:15:58

【Linux技术】autotools制作makefile过程详解【转】的相关文章

Linux LVM逻辑卷配置过程详解

Linux LVM逻辑卷配置过程详解 许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份.删除相关数据,甚至被迫重新规划分区并重装操作系统,以满足应用系统的需要. LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上.文件系统之下的一个逻辑层,可提高磁盘分区管理的灵活性.RHEL5默认安装的分区格式就是LVM逻辑卷的格式,需要注意的是/boot分区不能基于LVM创建,必须独立出

Linux(RHEL6)启动过程详解

Linux(红帽RHEL6)启动过程详解: RHEL的一个重要和强大的方面是它是开源的,并且系统的启动过程是用户可配置的.用户可以自由的配置启动过程的许多方面,包括可以指定启动时运行的程序.同样的,系统关机时所要终止的进程也是可以进行组织和配置的,即使这个过程的自定义很少被需要. 理解系统的启动和关机过程是如何实现的不仅可以允许自定义,而且也可以更容易的处理与系统的启动或者关机相关的故障.  1.启动过程  以下是启动过程的几个基本阶段:   ① 系统加载并允许boot loader.此过程的细

linux根文件系统的挂载过程详解

一:前言 前段时间在编译kernel的时候发现rootfs挂载不上.相同的root选项设置旧版的image却可以.为了彻底解决这个问题.研究了一下rootfs的挂载过程.特总结如下,希望能给这部份知识点比较迷茫的朋友一点帮助. 二:rootfs的种类 总的来说,rootfs分为两种:虚拟rootfs和真实rootfs.现在kernel的发展趋势是将更多的功能放到用户空间完成.以保持内核的精简.虚拟rootfs也是各linux发行厂商普遍采用的一种方式.可以将一部份的初始化工作放在虚拟的rootf

linux开启过程详解

解操作系统开机引导和启动过程对于配置操作系统和解决相关启动问题是至关重要的.该文章陈述了 GRUB2 引导装载程序开机引导装载内核的过程和 systemd 初始化系统执行开机启动操作系统的过程. ??事实上,操作系统的启动分为两个阶段:引导boot和启动startup.引导阶段开始于打开电源开关,结束于内核初始化完成和 systemd 进程成功运行.启动阶段接管了剩余工作,直到操作系统进入可操作状态. ??总体来说,Linux 的开机引导和启动过程是相当容易理解,下文将分节对于不同步骤进行详细说

技巧:Linux 动态库与静态库制作及使用详解

技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题: 2)在 Linux 静态库的制作过程中发现有别于 Windows 下静态库的制作方法:3)在 Linux 应用程序链接第三方库或者其他静态库的时候发现链接顺序的烦人问题.本文就这三个问题针对 Linux 下标准库链接和如何巧妙构建 achrive(*.a) 展开相关介

uboot主Makefile分析(t配置和编译过程详解)

1.编译uboot前需要三次make make distcleanmake x210_sd_configmake -j4 make distclean为清楚dist文件. make x210_sd_config  跳转执行mkconfig用来配置并生成config.mk(board/samsung/x210目录下为指定链接地址的与主uboot目录的config.mk不同) autuconfig.mk 2.框图 3.uboot主Makefile分析 3.1.uboot version确定(Make

Linux系统启动过程详解

 Linux系统启动过程详解 启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘信息.内存信息.时钟信息.PnP特性等等.在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了. 启动第二步--读取MBR众所周知,硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,别看地方不大,

Linux网络编程——进程池实现过程详解(1)

目录 进程池 父进程的实现流程 子进程的实现流程 进程池 父进程的实现流程 1.定义数据结构pChild,申请子进程数目的结构体空间 2.通过循环,socketpair创建全双工管道,创建子进程,将子进程pid,管道对端,是否忙碌等信息存储 3.socket,bind,listen,对应的端口处于监听状态 netstat 4.epoll_create创建epfd,监控socketFd和所有子进程的管道对端 5.while(1)循环 epoll_wait等待客户端的请求及子进程是否有通知 如果so

加密、解密原理和openssl自建CA过程详解

一.加密和解密相关知识简介 1.信息安全标准 NIST(National Institute of Standards and Technology)美国国家标准与技术研究院,制定了网络信息安全与保密的三个要素: 保密性(confidentiality):信息不泄露给非授权用户.实体或过程,或供其利用的特性.(一般包括数据保密性.隐私性.) 完整性(Integrity):数据未经授权不能进行改变的特性.即信息在存储或传输过程中保持不被修改.不被破坏和丢失的特性.(一般包括数据完整性.系统完整性.