找回密码
 注册
关于网站域名变更的通知
查看: 338|回复: 1
打印 上一主题 下一主题

迅为4412开发板实验_Makefile编译(上)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-12-10 13:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本章导读
( [! O1 P. o- @, ~. A) s, \在前面入门视频第十期“搭建编译环境 uboot_linux_Android”中,只介绍了输入 Make命令就可以编译出内核,并没有介绍它是如何运行的。
( ^0 I. s: b* N* v7 Q在向内核中添加驱动的时候要完成 3 项工作,包括:
. e6 B9 V' R5 _& B1)在 Kconfig 中添加新代码对应项目的编译条件,这一部分在实验 3 已经介绍过;$ d4 s; @* w2 O8 Z
2)将驱动源码添加到对应的目录中,这一步比较好理解,在本章实验中将给大家演示一下;
9 T( p7 `$ Y: J2 I& S3 @" g3 t$ d3)在目录 Makefile 中文件中增加针对新代码的编译条目,这一部分将在本章节介绍到。0 s  p/ u& z) d5 T
4.1.1 工具7 I3 j( ?$ \4 {7 z; ?
4.1.1.1 硬件工具
4 U% |+ ^( q' E8 B! P# n% e1)PC 机
, C- n/ C' j' i! w2 q* Q' t4.1.1.2 软件工具8 Y8 J; l1 D% I, U# O/ O4 c( y
1)虚拟机 Vmware
/ A& [/ r7 ]$ t2 T! T0 {( j% H; q2)Ubuntu12.04.2
: m1 M" z4 p4 Y2 |5 [3)Ubuntu 系统下解压生成的 Linux 源码( W% k1 n9 S, M) x, q( _
4.1.2 预备课程  @5 g  a+ g# V9 C/ Y1 A* J. B5 x
入门视频“01-烧写、编译以及基础知识视频”: A  b! |5 G: m' }3 r
→“实验 10-搭建编译环境 uboot_linux_Android”或者使用手册“五 Android 开
3 b/ I# w) O; n' ^/ e" x2 y% A发环境搭建以及编译”;
) r1 @6 Z* ~! W3 t1 u; `实验三 Menuconfig_Kconfig
2 A) O: n% D6 h0 Z% F4.1.3 视频资源
2 H9 O7 j$ H+ T' c+ y+ d, S本节配套视频为“视频 04_Makefile 编译”
" V: x! M" O2 F* i" j4.2 学习目标
. G* H8 ^8 w) _! m8 d本章需要学习以下内容:5 C7 U/ _& z3 ~7 J/ O+ @
掌握 Linux 内核编译命令0 S8 o2 ^2 c1 K8 i( U7 Q$ T8 i  W
掌握编译器路径设置的方法
  I8 d2 O. ]' H9 t; `理解环境变量路径、编译器、源码 Makefile 文件中编译器路径三者之间的关系) s! o% h2 Y: a9 z9 q
理解 Makefile 文件结构# K0 m; W! l  R& O) `) R- ?
掌握向 Makefile 文件中添加脚本命令的方法,能够看懂 Makefile 脚本1 V* X% _5 U" z( f5 L6 v/ d* e
4.3 编译器路径的设置
% s* t' ?0 [' s* m) `% G# D在前面入门知识中,只介绍了在什么目录解压编译器,在环境变量文件中添加路径,就可以编译出内核,并没有介绍他们之间是如何对应的。
$ e/ i' W7 W- J# Y6 k如下图所示,按照前面提供的基础教程,配置好 Ubuntu 中的编译器和库文件,输入命令“#make”,就可以编译生成内核的二进制镜像。6 ?" @8 T) t5 O9 Y% U* H5 s3 H, e
* g9 x5 Y( ], Y8 l8 H2 R( W
如下图所示,使用命令“#cd”,使用命令“#vim .bashrc”打开环境变量文件“.bashrc”。
7 E7 F0 ^1 d' ]& Y
8 F) |! V4 @. h* B+ c+ x如下图所示,进入最底行,可以看到,在环境变量文件中编译器路径设置为“exportPATH=$PATH:/usr/local/ARM/arm-2009q3/bin”。$ H& Z+ y( _' i& V

6 e( T7 E5 w' m2 D/ v  [然后使用命令“#cd /usr/local/arm/”,进入解压编译器“arm-2009q3.tar.bz2”的文件目录。
$ n0 c8 @7 b; V! w, f3 J8 r: V3 f1 D5 }; V
可以明显的看到,环境变量中设置的路径和解压的路径是对应的。( @1 t+ p2 j# @! [1 n  B+ I+ _7 d
这里回到内核源码的目录,如下图所示。; B: N6 f# |8 ]0 r: p

, z. V0 [! m6 F8 @$ D2 w如下图所示,使用命令“#vim Makefile”打开内核目录下的 Makefile 文件。; o" p2 o6 E0 n! I* q! U; H, Y. a! o
  F/ B  ~! O5 ~; ?, Y& b; a6 H/ ^
这里通过 vim 编辑器查找参数“CROSS_COMPILE”,如下图所示。
# p0 l, K0 V) ?( @7 i7 H9 N3 G  E0 L# q# K0 I% T' k- K
可以查到参数“CROSS_COMPILE”,如下图所示。
, H+ v; x. V2 A7 C7 v! }- `
0 l$ n# j$ l3 |8 h/ F- h如上图所示,可以看到这个参数是“/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-”。
) T4 e* ~  b! k8 ^1 @6 B再看一下参数“CROSS_COMPILE”的下一行,可以看出这里有修改过的痕迹。很容易推断出,原来三星是用的“4.5.1”版本的编译器,不过这个没关系,只要能编译通过就可以了。6 U9 |3 Q( v% m. I
一般说来,拿到源码之后的第一步,是要先要先将源码编译通过。2 F" O# z) \  S4 {
设置上图中的变量“CROSS_COMPILE”以及环境变量还有编译器实际解压路径三者对应。这三者对应之后,就能确保执行 Make 命令之后,系统能够找到这个编译器。3 w5 M9 y4 j8 ^5 V8 Q. U4 p7 V
在编译命令执行的过程中,会提示一些错误,然后根据提示的错误,挨个去排查修改,去添加库文件或者修改库文件。这个过程有长有短,考验的只是耐心,并没有太多技巧。由于已经将缺少的库文件写成脚本,这样大家在编译器执行以下脚本就能够编译通过。! I: L+ T4 l5 [
针对内核目录下的 Makefile 文件,提醒大家一下,这个文件中内容很多,除了上面编译器路径变量以外的其它部分几乎不用关注。4 h8 l. }3 e; O4 q: U: |( r
另外还有一个地方需要了解一下,如下图所示,在该文件的第一行,可以看到内核的版本。
1 m# v6 k3 q. {- b. s8 ?# w" x; F  C, e7 K* l
4.4 Make 内核编译命令执行过程简介
' K$ U" y- j# v. j7 u1 ?如下图所示,编译内核需要执行 make 命令,在执行 make 命令之后,并没有介绍它是如何执行的。$ y* Q% N' G7 D$ b; x

  b- W6 i8 z. u2 m5 }在 make 命令执行之后,它会首先找到当前目录下的“Makefile”文件,如下图所示。) q0 F6 ^9 b, P' S
9 e1 a5 _7 Q, Q, T( n
运行 Makefile 文件之后,它会在 Makefile 文件中找到编译器的路径“/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-”如下图所示。
: l- Q! U2 L! L* Z: q6 t* _& f/ l& g9 {9 Y
然后系统根据环境变量找到“export PATH=$PATH:/usr/local/arm/arm-2009q3/bin”编译器的路径,如下图所示。4 s7 x, H+ ?: l' Y& n# r
# f% n/ w" Z; N1 p: |( A
如下图所示,使用命令“ls /usr/local/arm/arm-2009q3/bin/”可以查看到 arm2009q3解压之后有哪些具体编译器。
* s2 g8 Y0 _5 l% N; e
) w( W. j3 p) [9 O4 A如上图,系统找到编译器之后,同时基础的库文件也是和编译器在一起的,有时候编译一个新的内核,还有可能需要修改库文件。4 X- C+ k; {9 H9 _5 _2 ?# Z4 T
编译执行前还需要找到“.config”文件,默认是放在源码目录下的。使用命令“ls -a”就可以看到,如下图所示。: }6 R) N! R, I5 u, u4 N0 H$ ], q. |& }
( m8 g6 O' }" A: R6 q$ |) S& e
从本章‘实验 03’的 3.5 小节,学习到这个“.config”是通过 menuconfig 工具生成的,里面只是一些宏定义,如下图所示,打开这个文件。
7 B/ d  _* T2 C  A$ w, K6 Z
- V) E; X2 |* B. L% U9 C. p查找宏定义”LEDS,”是编译 led 驱动的宏定义“LEDS_CTL”,如下图所示。
% q; g4 V3 @' P4 T/ i! C8 \; |' O/ F& B% ?" G# N! f2 S
现在系统找到这个宏定义“LEDS_CTL”,在编译具体中间文件的时候会用到。
' D9 K) k% R* o/ v# {( X/ [具体是怎么实现的,继续看下一小节的内容就可以搞清楚这个宏定义有什么用处。
% ~3 C9 g, i7 L; }- j
% ~! z8 s0 T9 Z5 v6 t8 }
  • TA的每日心情
    慵懒
    2020-8-28 15:16
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    2#
    发表于 2020-12-14 09:45 | 只看该作者
    拿到源码之后的第一步,是要先要先将源码编译通过
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-24 20:53 , Processed in 0.171875 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表