EDA365电子论坛网

标题: 迅为4412开发板实验_Makefile编译(上) [打印本页]

作者: 孤久厌闹    时间: 2020-12-10 13:28
标题: 迅为4412开发板实验_Makefile编译(上)
本章导读' F+ I( t2 @  C" ?4 ~% ^% o: P5 b6 n
在前面入门视频第十期“搭建编译环境 uboot_linux_Android”中,只介绍了输入 Make命令就可以编译出内核,并没有介绍它是如何运行的。# I8 H! D/ y( X6 M1 ]
在向内核中添加驱动的时候要完成 3 项工作,包括:
0 X2 {" E2 a  |$ q7 {' b- O( x1)在 Kconfig 中添加新代码对应项目的编译条件,这一部分在实验 3 已经介绍过;1 j- R* S( @" d' d% u5 @, s
2)将驱动源码添加到对应的目录中,这一步比较好理解,在本章实验中将给大家演示一下;
% c% y# M% |2 c" l0 d# N3)在目录 Makefile 中文件中增加针对新代码的编译条目,这一部分将在本章节介绍到。; ~, z) e+ ^% k2 a, S" x7 g, E( B2 M
4.1.1 工具
- N6 q2 r$ g9 U# U2 L9 F" {4.1.1.1 硬件工具: m  W+ p; f8 p6 p
1)PC 机3 ]5 T3 w& J5 }- x. u) i
4.1.1.2 软件工具
+ t4 y. H; `2 m) d) z- m& A+ Q5 q1)虚拟机 Vmware
; W$ b- o+ C; h2 r! V" N& c3 p2)Ubuntu12.04.2( v( L; v0 b. h
3)Ubuntu 系统下解压生成的 Linux 源码
! ?; ?6 h/ N- Z; g4.1.2 预备课程
: p& q0 x  I8 t! w5 l  w) T入门视频“01-烧写、编译以及基础知识视频”
: g' Q% k/ x7 {- F" M- X8 x→“实验 10-搭建编译环境 uboot_linux_Android”或者使用手册“五 Android 开
5 V- e1 |0 W9 C1 U发环境搭建以及编译”;0 n4 ~& ^2 y% @
实验三 Menuconfig_Kconfig
4 Z3 ^, Y1 m8 {) T4.1.3 视频资源) }* S: L7 [, w* k
本节配套视频为“视频 04_Makefile 编译”
. A& F# L3 P! A, M1 y4.2 学习目标' Y$ K& u& C- X! t6 {
本章需要学习以下内容:
- \8 F  }; {# z7 V2 C: a掌握 Linux 内核编译命令
  Y1 P  g  K8 B0 S掌握编译器路径设置的方法
( X1 w+ t5 M( x7 f, }理解环境变量路径、编译器、源码 Makefile 文件中编译器路径三者之间的关系
* q1 L& u, G3 S1 A% ^9 q理解 Makefile 文件结构( S; Q5 ?2 u5 A& ?  J) [
掌握向 Makefile 文件中添加脚本命令的方法,能够看懂 Makefile 脚本! w2 l/ s; E1 J8 C9 ^/ [
4.3 编译器路径的设置+ L5 ~! z& O7 y! }
在前面入门知识中,只介绍了在什么目录解压编译器,在环境变量文件中添加路径,就可以编译出内核,并没有介绍他们之间是如何对应的。0 P* k9 _  x- P; H
如下图所示,按照前面提供的基础教程,配置好 Ubuntu 中的编译器和库文件,输入命令“#make”,就可以编译生成内核的二进制镜像。. e5 {# t5 |: |# a9 e
$ L, Q* r. K7 S: W. F1 n) k2 r! j
如下图所示,使用命令“#cd”,使用命令“#vim .bashrc”打开环境变量文件“.bashrc”。' G: F4 P$ p! B" @6 t6 |' E
4 m, W& L/ |* \3 E/ u! `  n
如下图所示,进入最底行,可以看到,在环境变量文件中编译器路径设置为“exportPATH=$PATH:/usr/local/arm/arm-2009q3/bin”。
1 Q- ?: [; W# p2 X" h! l- r7 }6 [8 v7 v& u6 J$ O7 X9 m' j
然后使用命令“#cd /usr/local/arm/”,进入解压编译器“arm-2009q3.tar.bz2”的文件目录。0 L6 O" R8 Y& c) V
6 `* t* f- m: z3 L, b% o4 d7 Q
可以明显的看到,环境变量中设置的路径和解压的路径是对应的。2 P: D2 ]. ~+ x0 I; F( ^; H
这里回到内核源码的目录,如下图所示。
# ~& U- c# x* N$ E6 b$ U* F7 {0 n2 Z+ w, T
如下图所示,使用命令“#vim Makefile”打开内核目录下的 Makefile 文件。) K3 u8 r4 @  O( |. |3 h! O9 e1 e6 V
0 F) V; E+ ]) a" ?
这里通过 vim 编辑器查找参数“CROSS_COMPILE”,如下图所示。3 V( l7 B, _8 e

/ f" d: O. t: o- R可以查到参数“CROSS_COMPILE”,如下图所示。
! }0 c* _( I  e2 s% \/ L2 G4 T
8 M4 H8 l  p* A7 x如上图所示,可以看到这个参数是“/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-”。
7 O5 g) ^  z( ^( s再看一下参数“CROSS_COMPILE”的下一行,可以看出这里有修改过的痕迹。很容易推断出,原来三星是用的“4.5.1”版本的编译器,不过这个没关系,只要能编译通过就可以了。
6 w" O+ o: l/ b# t: K' i4 E一般说来,拿到源码之后的第一步,是要先要先将源码编译通过。5 J# v+ Q( e* Y
设置上图中的变量“CROSS_COMPILE”以及环境变量还有编译器实际解压路径三者对应。这三者对应之后,就能确保执行 Make 命令之后,系统能够找到这个编译器。
0 y! K5 g( U1 m: n0 h在编译命令执行的过程中,会提示一些错误,然后根据提示的错误,挨个去排查修改,去添加库文件或者修改库文件。这个过程有长有短,考验的只是耐心,并没有太多技巧。由于已经将缺少的库文件写成脚本,这样大家在编译器执行以下脚本就能够编译通过。
% b0 q9 L$ M2 @; _0 Z针对内核目录下的 Makefile 文件,提醒大家一下,这个文件中内容很多,除了上面编译器路径变量以外的其它部分几乎不用关注。
) W! ]  M; }8 E3 a  d+ [$ f另外还有一个地方需要了解一下,如下图所示,在该文件的第一行,可以看到内核的版本。: a2 {& t: `% b& e3 {% F% Z
/ s3 |- c1 b2 V( C$ X) A8 N# P- I
4.4 Make 内核编译命令执行过程简介1 R6 h& H1 w/ ]1 {1 Y& o4 o
如下图所示,编译内核需要执行 make 命令,在执行 make 命令之后,并没有介绍它是如何执行的。; K5 I& B! [2 Z4 @% C  |. N
! i% i) C# r0 R! O8 a8 z3 P
在 make 命令执行之后,它会首先找到当前目录下的“Makefile”文件,如下图所示。& L/ r% w2 B6 |# ]+ v) J9 q8 P& Y
% |6 X/ ]0 v% `# Y* F' @
运行 Makefile 文件之后,它会在 Makefile 文件中找到编译器的路径“/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-”如下图所示。
5 j2 i+ A4 b0 R6 z/ e2 Y- y, ]
) ^' A4 i3 |( L+ P+ y然后系统根据环境变量找到“export PATH=$PATH:/usr/local/arm/arm-2009q3/bin”编译器的路径,如下图所示。, u$ D' Y6 n8 f# l* c  @

' k3 A# G$ L2 _4 B  n& Z1 r如下图所示,使用命令“ls /usr/local/arm/arm-2009q3/bin/”可以查看到 arm2009q3解压之后有哪些具体编译器。
2 L# D3 ]  ?8 {* p3 q& `- Z! {+ X0 W' L# |% N
如上图,系统找到编译器之后,同时基础的库文件也是和编译器在一起的,有时候编译一个新的内核,还有可能需要修改库文件。- ?5 I0 {4 r9 F$ B# H/ `
编译执行前还需要找到“.config”文件,默认是放在源码目录下的。使用命令“ls -a”就可以看到,如下图所示。
' ?: g2 M. ^9 s; z  L
9 u- w0 q- J* u" ^从本章‘实验 03’的 3.5 小节,学习到这个“.config”是通过 menuconfig 工具生成的,里面只是一些宏定义,如下图所示,打开这个文件。
: O1 {5 t3 w' P) s$ e1 N# l
5 y' H2 \+ v  D; [5 D查找宏定义”LEDS,”是编译 led 驱动的宏定义“LEDS_CTL”,如下图所示。/ ?  N" e2 V/ M
  U* R$ ~9 Q' h4 A! F2 T
现在系统找到这个宏定义“LEDS_CTL”,在编译具体中间文件的时候会用到。
- h" x  y0 k9 y# A具体是怎么实现的,继续看下一小节的内容就可以搞清楚这个宏定义有什么用处。8 O3 j& q3 o8 ]' J" i0 I

" b7 D: V" Q% D2 i
作者: fordies1    时间: 2020-12-14 09:45
拿到源码之后的第一步,是要先要先将源码编译通过




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2