欢迎来到天天文库
浏览记录
ID:30436842
大小:83.91 KB
页数:9页
时间:2018-12-29
《深入理解linux软件配置、编译及安装》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、深入理解Linux软件配置、编译及安装从源代码安装过软件的朋友一定对./configure&&make&&makeinstall安装三步曲非常熟悉了。然而究竟这个过程中的每一步幕后都发生了些什么呢?本文将带领你一探究竟。深入理解这个过程将有助于你在LFS的基础上玩出自己的花样来。不过需要说明的是本文对Makefile和make的讲解是相当近视和粗浅的,但是对于理解安装过程来说足够了。用一句话来解释这个过程就是:根据源码包中Makefile.in文件的指示,configure脚本检查当前的系统环境和配置选项,在当前目录中生成Makefile
2、文件(还有其它本文无需关心的文件),然后make程序就按照当前目录中的Makefile文件的指示将源代码编译为二进制文件,最后将这些二进制文件移动(即安装)到指定的地方(仍然按照Makefile文件的指示)。由此可见Makefile文件是幕后的核心。要深入理解安装过程,必须首先对Makefile文件有充分的了解。本文将首先讲述Makefile与make,然后再讲述configure脚本。并且在讲述这两部分内容时,提供了尽可能详细的、可以运用于实践的参考资料。Makefile与make用一句话来概括Makefile与make的关系就是:Ma
3、kefile包含了所有的规则和目标,而make则是为了完成目标而去解释Makefile规则的工具。make语法首先看看make的命令行语法:make[options][targets][VAR=VALUE].[options]是命令行选项,可以用make--help命令查看全部,[VAR=VALUE]是在命令行上指定环境变量,这两个大家都很熟悉,将在稍后详细讲解。而[targets]是什么呢?字面的意思是"目标",也就是希望本次make命令所完成的任务。凭经验猜测,这个[targets]大概可以用"ckeck","install"之类(也
4、就是常见的测试和安装命令)。但是它到底是个啥玩意儿?没有任何参数的make命令是什么意思?为什么在安装LFS工具链中的Perl-5.8.8软件包时会出现"makeperlutilities"这样怪异的命令?要回答这些问题必须首先理解Makefile文件中的"规则"。Makefile规则Makefile规则包含了文件之间的依赖关系和更新此规则目标所需要的命令。一个简单的Makefile规则是这样写的:TARGET:PREREQUISITESCOMMANDTARGET规则的目标。也就是可以被make使用的"目标"。有些目标可以没有依赖而只有动
5、作(命令行),比如"clean",通常仅仅定义一系列删除中间文件的命令。同样,有些目标可以没有动作而只有依赖,比如"all",通常仅仅用作"终极目标"。PREREQUISITES规则的依赖。通常一个目标依赖于一个或者多个文件。COMMAND规则的命令行。一个规则可以有零个或多个命令行。OK!现在你明白[targets]是什么了,原来它们来自于Makefile文件中一条条规则的目标。另外,Makefile文件中第一条规则的目标被称为"终极目标",也就是你省略[targets]参数时的目标。当你查看一个实际的Makefile文件时,你会发现有
6、些规则非常复杂,但是它都符合规则的基本格式。此外,Makefile文件中通常还包含了除规则以外的其它很多东西,不过本文只关心其中的变量。Makefile变量Makefile中的"变量"更像是C语言中的宏,代表一个文本字符串(变量的值),可以用于规则的任何部分。变量的定义很简单:VAR=VALUE;变量的引用也很简单:$(VAR)或者${VAR}。变量引用的展开过程是严格的文本替换过程,就是说变量值的字符串被精确的展开在变量被引用的地方。比如,若定义:VAR=c,那么,"$(VAR)$(VAR)-$(VAR)VAR.$(VAR)"将被展开为
7、"cc-cVAR.c"。虽然在Makefile中可以直接使用系统的环境变量,但是也可以通过在Makefile中定义同名变量来"遮盖"系统的环境变量。另一方面,我们可以在调用make时使用-e参数强制使系统中的环境变量覆盖Makefile中的同名变量,除此之外,在调用make的命令行上使用VAR=VALUE格式指定的环境变量也可以覆盖Makefile中的同名变量。Makefile实例下面看一个简单的、实际的Makefile文件:CC=gccCPPFLAGS=CFLAGS=-O2-pipeLDFLAGS=-sPREFIX=/usrall:pr
8、og1prog2prog1:prog1.o$(CC)$(LDFLAGS)-oprog1prog1.oprog1.o:prog1.c$(CC)-c$(CFLAGS)prog1.cprog2:pr
此文档下载收益归作者所有