《03嵌入式Linux系统项目工程管理ppt课件》由会员分享,可在线阅读,更多相关《03嵌入式Linux系统项目工程管理ppt课件(51页珍藏版)》请在金锄头文库上搜索。
1、嵌入式Linux系统项目工程管理课程安排nLinuxLinux项目工程管理的概念项目工程管理的概念n项目工程管理文件项目工程管理文件MakefileMakefilenAutotoolAutotool自动生成自动生成MakefileMakefilenLinuxLinux开源项目嵌入式移植开源项目嵌入式移植 软件工程件工程维护问题一个一个软件件项目通常包含多个源目通常包含多个源码文件,每个源代文件,每个源代码的的编译和和链接都要接都要书写写大量的命令。大量的命令。在一在一项目里,代目里,代码通常都有引用关系,因此需要指定通常都有引用关系,因此需要指定谁先先编译,谁后后编译,甚至是更复甚至是更复杂的
2、功能操作。的功能操作。重复重复编译时我我们希望只希望只对修改修改过的文件的文件执行行编译链接,加快接,加快编译速度。速度。通通过自自动换编译脚本脚本维护1 1、将每个源文件需要用到的、将每个源文件需要用到的编译编译、链链接命令写到接命令写到shellshell脚本脚本2 2、安装代、安装代码码的引用关系,仔的引用关系,仔细细安排安排编译编译、链链接命令的先后接命令的先后顺顺序序3 3、对对于任何源于任何源码码修改,重新修改,重新执执行行编译编译脚本,脚本,对对整个工程重新整个工程重新编译编译shellshell编译编译脚本脚本实实例例1 1、工程、工程结结构构: :2 2、引用关系:、引用关系
3、:myclass.cmyclass.c myclass.cmyclass.c引用引用student1.cstudent1.c、student2.cstudent2.c的接口函数的接口函数显显示班示班级级中每个学生中每个学生shellshell编译编译脚本脚本实实例例3 3、编译编译脚本脚本:build.sh:build.sh 4 4、执执行行过过程:程: 每每执执行一次行一次build.shbuild.sh,必,必须对须对整个工程的所有文件重新整个工程的所有文件重新编译编译、链链接一次。接一次。5 5、存在、存在问题问题:如果工程有成千上万个文件,只改了其中的某个或者几个文件就如果工程有成千上
4、万个文件,只改了其中的某个或者几个文件就让让所有文件所有文件重新重新编译编译的的时间时间开开销销是不可接受的,我是不可接受的,我们们只需要只需要对对改改动过动过的文件重新的文件重新编译编译、重新重新链链接成可接成可执执行文件即可行文件即可 课程安排nLinuxLinux项目工程管理的概念项目工程管理的概念n项目工程管理文件项目工程管理文件MakefileMakefilenAutotoolAutotool自动生成自动生成MakefileMakefilenLinuxLinux开源项目嵌入式移植开源项目嵌入式移植 MakefileMakefile应应运而生运而生Makefile Makefile 就
5、就为为解决上述一系解决上述一系统问题统问题而而创创造的,可以把造的,可以把Makefile Makefile 理解成是理解成是一种由一种由make make 程序程序进进行解行解释释的一种特殊脚本。的一种特殊脚本。makemake是一个自是一个自动编译动编译管理器,它能管理器,它能够够根据文件根据文件时间时间戳自戳自动发现动发现更新更新过过的文的文件而减少件而减少编译编译工作量,同工作量,同时时,它能,它能读读入入MakefileMakefile的内容来的内容来执执行大量的行大量的编译编译任任务务用用户户只需要一次性地将只需要一次性地将编译编译命令写命令写进进MakefileMakefile就
6、可以永久性地使用就可以永久性地使用makemake工工程管理器完成程管理器完成编译编译,大大提高,大大提高实际项实际项目的工作效率目的工作效率几乎所有几乎所有LinuxLinux下的下的项项目目编编程都会涉及程都会涉及makemake工程管理,工程管理,对对我我们们十分重要。十分重要。MakefileMakefile实实例例1 1、MakefileMakefile文件文件MakefileMakefile实实例例2 2、执执行行编译编译:make/make allmake/make all3 3、留意:、留意:MakefileMakefile文件本身不需要可文件本身不需要可执执行行权权限,它是被
7、限,它是被makemake命令命令执执行的行的4 4、MakefileMakefile可以增加一些有效的可以增加一些有效的维护维护目目标标 如:如:make clean:make clean:删删除除编译过编译过程文件程文件Makefile/ShellMakefile/Shell脚本比脚本比较较都是文本文件格式的脚本;都是文本文件格式的脚本;都可以执行都可以执行ShellShell命令;命令;都可以定义变量都可以定义变量, ,和条件控制语句。和条件控制语句。( (使用格式上有差别使用格式上有差别) )相同点相同点:解释器不同:解释器不同:ShellShell脚本是由对应脚本是由对应ShellS
8、hell程序解释;程序解释; 而而MakefileMakefile是由是由makemake程序解释程序解释格式不一样:格式不一样:ShellShell脚本以命令行为基本单位,而脚本以命令行为基本单位,而 Makefile Makefile以规则为基本单位以规则为基本单位ShellShell脚本只要有执行权限即可直接执行,脚本只要有执行权限即可直接执行,MakefileMakefile必须必须要用要用makemake来调用才行来调用才行, ,本身不需执行权限本身不需执行权限不同点不同点:Makefile的的优势优势在开在开发领域域,Makefile,Makefile还是有相当是有相当优势:1 1
9、、MakefileMakefile具有自具有自动推推导,判断源,判断源码依依赖关系的功能关系的功能2 2、MakefileMakefile有可以使用有可以使用隐含含规则来来简化化makefilemakefile的的编写写 3 3、当然,、当然,MakefileMakefile使得大工程使得大工程编译维护变得更快!得更快!MakefileMakefile基本基本结结构构需要由需要由makemake工具创建的项目,通常是目标文件和可执行文件工具创建的项目,通常是目标文件和可执行文件通常使用通常使用“目的目的targettarget)”一词来表示要创建的项目一词来表示要创建的项目 要创建的目标依赖于
10、哪些文件要创建的目标依赖于哪些文件 创建每个目标时需要运行的命令创建每个目标时需要运行的命令, ,每个命令之前必须有每个命令之前必须有tabtab打头打头 通常都包含一些固定的伪目标通常都包含一些固定的伪目标: : 如如allall、installinstall、cleanclean用作缺省编译用作缺省编译, ,安装和清除文件安装和清除文件# #打头表示注释行打头表示注释行makefile makefile 中一般包含如下内容:中一般包含如下内容:MakefileMakefile的的规则规则1 1、一个、一个Makefile Makefile 可以看作是一系列可以看作是一系列规则规则的的组组合
11、,合,规则规则是是makemake进进行行处处理的依据理的依据2 2、规则规则的的组组成:成:(1 1)、需要由)、需要由makemake工具工具创创建的目建的目标标体体(target)(target),通常是可,通常是可执执行文件或目行文件或目标标文文件;件;(2 2)、要)、要创创建的目建的目标标所依所依赖赖的文件的文件(dependency_files)(dependency_files),通常是源文件、,通常是源文件、头头文件或者其他目文件或者其他目标标文件;文件;(3 3)、)、创创建每个目建每个目标标体体时时需要运行的命令需要运行的命令(command)(command),可以是一
12、行或多行,可以是一行或多行ShellShell命令。命令。目目标名称名称 : : 依依赖对象象 命令命令1 1命令命令2 2MakeMake调调用方法用方法 make make 默默认执认执行当前目行当前目录录下下MakefileMakefile文件的第文件的第1 1个个规则规则 make make可以通用在命令行直接写可以通用在命令行直接写targettarget名称,用于一个或多个名称,用于一个或多个targettarget进进行行编译编译make target1 target2make target1 target2make allmake allmake cleanmake clean
13、make installmake installmake uninstallmake uninstallMakefileMakefile的的简简化化一个一个软件的构造件的构造过程中,很多步程中,很多步骤是固定的,因此很多是固定的,因此很多时候可以候可以简化化处理,理,这是是MakefileMakefile最大最大优势在复在复杂项目里,目里,为了了简化化MakefileMakefile的的书写,往往会采用写,往往会采用扩展写法,展写法,这些方些方法包括法包括变量量内置内置规则自定自定义变量量1 1、递归递归展开方式定展开方式定义义VAR = valueVAR = value递归递归展开方式定展开
14、方式定义义的的变变量是在量是在变变量引用量引用时进时进行替行替换换的。的。这这种方式在种方式在处处理形理形如如CFLAGS = $(CFLAGS) -gCFLAGS = $(CFLAGS) -g的的变变量量时时可能可能导导致无致无穷穷循循环环,最,最终导终导致溢出。致溢出。2 2、简单扩简单扩展方式定展方式定义义VAR := value VAR := value 简单扩简单扩展方式展方式变变量的量的值值在定在定义义展开,并且只展开一次消除了上面无展开,并且只展开一次消除了上面无穷穷循循环环的的问题问题。预定定义变量量1 1、MakeMake工程管理器工程管理器维护维护了一些了一些预预定定义变义
15、变量,可以在量,可以在MakefileMakefile中直接使用中直接使用(1 1 CC C CC C 编译编译器的名称,默器的名称,默认值为认值为cccc。(2 2 CFLAGS C CFLAGS C 编译编译器的器的选项选项,无默,无默认值认值。(3 3 LDFLAGS C LDFLAGS C 链链接器的接器的选项选项, ,无默无默认值认值。 如如: :使用数学函数使用数学函数库库LDFLAGS = -lmLDFLAGS = -lm(4 4 RM RM 文件文件删删除程序名称除程序名称, ,默默认值为认值为rm rm f f(5 5 AR AR 归归档档维护维护程序的名称,默程序的名称,默
16、认值为认值为 ar ar。(6 6 ARFLAGS ARFLAGS 归归档档维护维护程序的程序的选项选项,无默,无默认值认值。(7 7 CXX C+ CXX C+ 编译编译器的名称,默器的名称,默认值为认值为 g+ g+。(8 8 CXXFLAGS C+ CXXFLAGS C+ 编译编译器的器的选项选项。2 2、在、在MakefileMakefile内可以使用自定内可以使用自定义变义变量来覆盖量来覆盖预预定定义变义变量量如:如:ARFLAGS = crvs CC = gccARFLAGS = crvs CC = gcc自定自定义与与预定定义变量示例量示例自自动变量量 对每一条每一条Makefi
17、leMakefile规则,Make,Make维护了一些自了一些自动变量。量。$ $ 第一个依第一个依赖文件的名称。文件的名称。$ $ 目目标的完整名称。的完整名称。$ $ 所有的依所有的依赖文件,以空格分开,不包含重复的依文件,以空格分开,不包含重复的依赖文件。文件。$* $* 不包含不包含扩展名的目展名的目标文件名称。文件名称。$+ $+ 所有的依所有的依赖文件,以空格分开,并以出文件,以空格分开,并以出现的先后的先后为序,可能包含序,可能包含 重复的依重复的依赖文件。文件。$? $? 所有的依所有的依赖文件,以空格分开,文件,以空格分开,这些依些依赖文件的修改日期比目文件的修改日期比目标
18、的的创建日期晚。建日期晚。$% $% 如果目如果目标是是归档成档成员,则该变量表示目量表示目标的的归档成档成员名称名称自自动变量示例量示例 内置内置规则 用用GCCGCC编译一个程序的步骤都是固定的,编译一个程序的步骤都是固定的,GNU make GNU make 会内置有一些规则。来会内置有一些规则。来简化这一些固定步骤简化这一些固定步骤1 1、隐式规则、隐式规则(1 1隐式规则告诉隐式规则告诉makemake怎样使用传统技术完成任务,不必在怎样使用传统技术完成任务,不必在MakefileMakefile中指中指定编译的具体细节,而只需要把目标文件列出来即可定编译的具体细节,而只需要把目标文
19、件列出来即可(2 2makemake自动使用隐式规则来确定如何生成目标文件自动使用隐式规则来确定如何生成目标文件(3 3最重要的隐式规则:所有的最重要的隐式规则:所有的“file.ofile.o文件都可以自动由文件都可以自动由file.cfile.c文文件使用命令件使用命令$(CC) $(CFLAGS) -c file.c -o file.o$(CC) $(CFLAGS) -c file.c -o file.o生成生成. .隐式式规则示例示例内置内置规则 2 2、模式、模式规则规则(1 1 有有时时候多个文件具有相同的候多个文件具有相同的处处理理规则规则,这时这时候就要自定候就要自定义义模式模
20、式规则规则,即,即相同模式的目相同模式的目标标共用的共用的规则规则(2 2 所有的所有的.o.o文件依文件依赖赖于于对应对应的的.c.c文件的模式文件的模式规则规则%.o: %.c%.o: %.c$(CC) $(CFLAGS) -c $ -o $(CC) $(CFLAGS) -c $arm-linux-gccar - arm-linux-arstrip - arm-linux-strip大部分大部分项目的目的Makefile可以可以简单换掉掉变量量CC、AR、STRIP等就可等就可实现移植移植简单项目移植简单项目移植Makefile移植示例移植示例简单项目移植简单项目移植ConfigureCo
21、nfigure开源开源项项目移植目移植复复杂项目的移植主要是指目的移植主要是指autoconf工具生成工具生成configure配置脚本配置脚本的的项目,目,绝大部分开源大部分开源项目用目用这样形式形式发布布这些些项目的目的Makefile需要通需要通过执行行configure配置脚本生成,配置脚本生成,configure主要做二件事主要做二件事检测当前当前环境是否支持境是否支持编译这一一软件件生成生成Makefile在在进行嵌入式移植前先了解要行嵌入式移植前先了解要软件怎么运行的和运行原理件怎么运行的和运行原理绝大部分大部分软件在件在X86下用下用configure都会一次性通都会一次性通过
22、这样先在先在X86环境下境下编译运行,运行,测试通通过后再考后再考虑移植到目移植到目标板板ConfigureConfigure开源开源项项目移植目移植1、confgure是生成是生成Makefile工具,在使用,工具,在使用,,一定要用一定要用configure help查看其选项,查看是否支持查看其选项,查看是否支持CC、CFLAGS等等环境变量的支持环境变量的支持(1如果是直接在执行如果是直接在执行configure时加入工具链支持时加入工具链支持CC=arm-linux-gcc ./configure(2检查检查configure 是不是支持是不是支持 -host 选择选择如是则使用如是
23、则使用-host=arm-linux来让脚本来修改来让脚本来修改./configure -host=arm-linux如果不是则直接运行如果不是则直接运行configure,生成,生成makefile后手工修改后手工修改移植madplay到开发板1 1、要求:移植开源、要求:移植开源madplaymadplay项目到开发板,使它能在开发板上项目到开发板,使它能在开发板上播放播放mp3mp3歌曲歌曲2 2、移植前准备:、移植前准备: (1)(1)、需要如下文件:、需要如下文件:madplay-0.15.2b.tar.gzmadplay-0.15.2b.tar.gz、libmad-libmad-0
24、.15.1b.tar.gz0.15.1b.tar.gz、libid3tag-0.15.1v.tar.gzlibid3tag-0.15.1v.tar.gz、zlib-zlib-1.1.4.tar.gz1.1.4.tar.gz(2 2)、前三个文件下载地址:)、前三个文件下载地址: sourceforge/projects/mad/files/sourceforge/projects/mad/files/后一个文件下载地址后一个文件下载地址zlib/zlib/找到要求的版本进行下载找到要求的版本进行下载 移植madplay到开发板3 3、移植步骤:、移植步骤:(1 1解压所有软件包,放在解压所有软
25、件包,放在madplaymadplay目录下目录下 移植madplay到开发板3 3、移植步骤:、移植步骤:(2 2进入包目录配置并编译进入包目录配置并编译zlib-1.1.4zlib-1.1.4 配置:将配置:将build-zlib.shbuild-zlib.sh拷贝到加压目录并运行拷贝到加压目录并运行 编译:编译:makemake 安装:安装:make installmake install(3 3进入包目录配置并编译进入包目录配置并编译libid3tag-0.15.1blibid3tag-0.15.1b 配置:将配置:将build-libid3.shbuild-libid3.sh拷贝到加
26、压目录并运行拷贝到加压目录并运行 编译:编译:makemake 安装:安装:make installmake install 移植madplay到开发板3 3、移植步骤:、移植步骤:(4 4进入包目录配置并编译进入包目录配置并编译libmad-0.15.1blibmad-0.15.1b 配置:将配置:将build-libmad.shbuild-libmad.sh拷贝到加压目录并运行拷贝到加压目录并运行 编译:编译:makemake注意必须先去掉注意必须先去掉MakefileMakefile中中CLFAGSCLFAGS变量中的变量中的-fforce-mem-fforce-mem选项,因为选项,因
27、为4.5.14.5.1版本版本gccgcc不不在支持该选项!在支持该选项! 安装:安装:make installmake install(5 5进入包目录配置并编译进入包目录配置并编译madplay-0.15.2bmadplay-0.15.2b 配置:将配置:将build-madplay.shbuild-madplay.sh拷贝到加压目录并运行拷贝到加压目录并运行 编译:编译:makemake 在当前目录下生产在当前目录下生产madplaymadplay可执行文件可执行文件 移植madplay到开发板3 3、移植步骤:、移植步骤:(6 6)、确认)、确认madplaymadplay是是ARMARM架构可执行文件架构可执行文件 file madplay file madplay(7 7)、压缩去除)、压缩去除madplaymadplay符合链接符合链接 arm-linux-strip madplay arm-linux-strip madplay(8 8)、将)、将madplaymadplay通过通过NFSNFS共享拷贝到开发板,确认能正常播放共享拷贝到开发板,确认能正常播放 MP3 MP3歌曲歌曲