【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,infodownzert@gmail.com)
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
mystery@mystery-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
mystery@mystery-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
mystery@mystery-dell:~/Desktop/autotools$ ./hello
!!!Hello World!!!

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

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

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

1
2
3
mystery@mystery-dell:~/Desktop/autotools$ make clean
test -z "hello" || rm -f hello
rm -f *.o

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

1
2
3
mystery@mystery-dell:~/Desktop/autotools$ make dist
mystery@mystery-dell:~/Desktop/autotools$ ls hello-1.0-tar.gz
hello-1.0-tar.gz

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

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

 

时间: 2024-09-29 15:47:44

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

基于Linux网关服务器squid配置过程详解_Linux

前言 在此,我们要配置一个只对内部网络提供代理服务的 Proxy Server.它具有如下功能它将用户分为高级用户和普通用户两种,对高级用户采用网卡物理地址识别的方法, 普通用户则需要输入用户名和口令才能正常使用. 高级用户没有 访问时间和文件类型的限制,而普通用户只在上班时可以访问以及一些其它的限制. 安装 从源中安装 源中自带稳定版本,执行下面的命令进行安装 sudo apt-get install squid squid-common 源码编译安装 当然你也可以到官方网站下载最新的版本进行

《嵌入式 Linux应用程序开发标准教程(第2版)》——2.2 Linux启动过程详解

2.2 Linux启动过程详解 嵌入式 Linux应用程序开发标准教程(第2版) 在了解了Linux的常见命令之后,下面详细讲解Linux的启动过程.Linux的启动过程包含了Linux工作原理的精髓,而且在嵌入式开发过程中非常需要这方面的知识. 2.2.1 概述 用户开机启动Linux过程如下: (1)当用户打开PC(intel CPU)的电源时,CPU将自动进入实模式,并从地址0xFFFF0000开始自动执行程序代码,这个地址通常是ROM-BIOS中的地址.这时BIOS进行开机自检,并按BI

linux中了minerd之后的完全清理过程(详解)_Linux

一不小心装了一个Redis服务,开了一个全网的默认端口,一开始以为这台服务器没有公网ip,结果发现之后悔之莫及啊 某天发现cpu load高的出奇,发现一个minerd进程 占了大量cpu,google了一下,发现自己中招了 下面就是清理过程 第一步 1.立即停止redis服务,修改端口权限,增加密码措施 2.按照网上的资料 删除 crontab 里的两个内容 sudo rm /var/spool/cron/root sudo rm /var/spool/cron/crontabs/root 3

DNS解析过程详解

DNS解析过程详解   目录(?)[+] 先说一下DNS的几个基本概念: 一. 根域 就是所谓的".",其实我们的网址www.baidu.com在配置当中应该是www.baidu.com.(最后有一点),一般我们在浏览器里输入时会省略后面的点,而这也已经成为了习惯. 根域服务器我们知道有13台,但是这是错误的观点. 根域服务器只是具有13个IP地址,但机器数量却不是13台,因为这些IP地址借助了任播的技术,所以我们可以在全球设立这些IP的镜像站点,你访问到的这个IP并不是唯一的那台主机

Android的init过程详解(一)init的初始化

本文使用的软件版本 Android:4.2.2 Linux内核:3.1.10 本文及后续几篇文章将对Android的初始化(init)过程进行详细地.剥丝抽茧式地分析,并且在其中穿插了大量的知识,希望对读者了解Android的启动过程又所帮助.本章主要介绍了与硬件相关初始化文件名的确定以及属性服务的原理和实现. Android本质上就是一个基于Linux内核的操作系统.与Ubuntu Linux.Fedora Linux类似.只是Android在应用层专门为移动设备添加了一些特有的支持.既然An

《数据修复技术与典型实例实战详解》——1.5 文件分配表的恢复

1.5 文件分配表的恢复 数据修复技术与典型实例实战详解1.5.1 文件分配表的基础知识 磁盘经过格式化后主要包括的区域有:主引导记录区(只有硬盘有).引导记录区.文件分配表(FAT).目录区和数据区. 文件分配表用于表示存储磁盘文件空间信息.此表包含所有未分配的.已分配的或标记为坏的盘簇的信息.盘簇是DOS进行磁盘空间分配的最小单位,一个簇可以是两个扇区,也可以是4个扇区或更多,视DOS版本及硬盘分区的大小而不同.虽然FAT记录文件所用的磁盘空间的信息,但引导区.两个FAT表.文件目录区等本身

《数据修复技术与典型实例实战详解》——1.3 主引导程序的修复

1.3 主引导程序的修复 数据修复技术与典型实例实战详解 硬盘主引导记录(即Master Boot Record,一般缩写为MBR)位于0磁头/0柱面/1扇区,由FDISK.EXE对硬盘分区时生成.MBR包括主引导程序.分区表和结束标志55 AAH三部分,共占一个扇区.主引导程序中含有检查硬盘分区表的程序代码和出错信息.出错处理,用于检测硬盘分区的正确性,并确定活动分区,负责把引导权移交给活动分区的DOS或其他操作系统.主引导程序的损坏会导致系统无法从硬盘引导,硬盘内容无法读取,操作不当会使整个

Android的init过程详解(一)(转)

  本文使用的软件版本 Android:4.2.2 Linux内核:3.1.10      本文及后续几篇文章将对Android的初始化(init)过程进行详细地.剥丝抽茧式地分析,并且在其中穿插了大量的知识,希望对读者了解Android的启动过程又所帮助.本章主要介绍了与硬件相关初始化文件名的确定以及属性服务的原理和实现.      Android本质上就是一个基于Linux内核的操作系统.与Ubuntu Linux.Fedora Linux类似.只是Android在应用层专门为移动设备添加了

Win 2000系统引导过程详解(2)

过程|详解 表一则列出了在系统引导的不同阶段所引用的文件. 表一 在这里,我们暂不讨论Windows 2000操作系统的内部工作机制,以下通过图文结合的方式,简要给大家说明在这五个阶段,操作系统都在干些什么,那些程序发挥了作用. 第一步,预引导阶段,过程如图二所示,首先包括了系统加电自检,这个过程完成硬件设备的枚举和配置.其次计算机BIOS确定引导设备的位置,加载并运行Master Boot Record(MBR)主引导区内容(如lilo等).然后扫描分区表,定位活动分区,并将活动分区上的引导扇