嵌入式学习小组
直播中

王凯

7年用户 1326经验值
私信 关注

Makefile脚本语法简介

宏定义LEDS_CTL 的使用
Makefile脚本语法简介Makefile测试

回帖(4)

肖锋

2020-12-22 15:24:14
  宏定义 LEDS_CTL 的使用
  如下图所示,led 驱动属于字符驱动,字符驱动一般是在源码目录“drivers/char/”下。
  
  如上图所示,这里要关注的文件只有框框中的三个“itop4412_leds.c”,
  “itop4412_leds.o”,“Makefile”。
  itop4412_leds.c :比较好理解,就是 led 驱动的源码
  itop4412_leds.o :这个是生成最终 zImage 二进制的中间文件
  Makefile :就是 Make 命令所需要的文件
  这里不关心 itop4412_leds.c 中的代码,只需先知道 itop4412_leds.c 的文件名即可。在源码目录中使用命令“vim drivers/char/Makefile”,如下图所示。
  
  打开“vim drivers/char/Makefile”文件之后,找到和 itop4412_leds.c 相关的文件,搜索“itop4412_leds”,如下图所示。
  
  如上图方框所示,就是编译 itop4412_leds.c 的脚本。这个脚本大家也只需要仿照写即可,严格的按照已有的例子来写即可。
  
  如果想添加类似的字符驱动,就可以在这个目录下添加。
  Kconfig、Makefile、menuconfig、“.config”文件大家就可以联系起来了。
举报

卞轮辉

2020-12-22 15:24:31
  Makefile 脚本语法简介
  本小节介绍的语法是对内核源码子目录中 Makefile 进行简单的介绍,这部分是经常会用到的,也是需要掌握的。
  常用的强制编译写法,还是在“drivers/char/Makefile”中,在 Top 行,如下图所示。
  
  上图中的这一行“obj-y += misc.o”,注意这里需要和内核自带的代码对齐。
  “加等号”右边的“misc.o”表示要编译 Makefile 目录下的“misc.c”文件,
  “加等号”左边的“obj-y ”表示要编译,并链接进内核(链接进内核是 linux 源码中自带的工具处理的,驱动工程师完全不用关心具体是怎么实现的)
  如下图所示,就是 LEDS_CTL 的条件编译,也就是需要在 Kconfig 中定义,在menuconfig 中配置之后,编译器运行的时候找到对应的宏变量 LEDS_CTL 之后才会编译。
  
  上图比较好理解,因为一直是以这个 LEDS_CTL 为例来讲解的。这种方式在写驱动的时候会经常使用到。
  最后介绍一下目录层次的迭代,如下图所示,使用命令“vim drivers/Makefile”打开“drivers/char”上一层目录的 Makefile 文件。
  
  搜索关键词“char”,因为前面介绍到的字符变量在“char”目录下,如下图所示。
  
  上图中的语法也是很简单,只不过“加等号”右边有文件变为了文件夹。这里表示强制编译当前目录“/drivers”的下一级目录“/char”。在执行编译命令执行到这句的时候,就会先跳转到“/char”目录下的“Makefile”文件。
举报

萧持毅

2020-12-22 15:25:10
  Makefile 测试
  本小节给大家做个简单的小实验,通过配置 menuconfig 中的 LEDS,来将内核编译进内核或者不编译进内核。
  1 将 LEDS 驱动不编译
  进内核如下图所示,在给大家提供的源码中,解压之后默认状态就有将“itop4412_leds.c”编译进内核的中间文件“itop4412_leds.o”,如下图所示。
  
  如下图所示,使用命令“rm -rf drivers/char/itop4412_leds.o”删除掉 LEDS 驱动的中间文件“itop4412_leds.o”。
  
  如下图所示,使用命令“ls drivers/char/”查看一下,发现已经没有了“itop4412_leds.o”文件。
  
  然后使用命令“make menuconfig”,打开配置工具,如下图所示。
  
  打开之后,如下图所示。找到“Device Drivers ---》 ”选项。
  
  如下图所示,进入到“Device Drivers ---》 ”选项,找到选项“Character devices---》”。
  
  如下图所示,找到选项“Enable LEDS config”,将 LEDS 的配置关闭
  
  退出,保存,生成新的“.config”文件。
  
  保存退出后,打开“.config”文件,可以发现“CONFIG_LEDS_CTL”没有配置。
  
  关闭“.config”文件,然后执行编译内核的命令“make”,如下图所示。
  
  如下图所示,编译完成。
  
  如下图所示,使用命令“ls drivers/char”查看 LEDS 驱动所在目录,发现并没有产生了中间文件。
  
  最后也可以将生成的文件“zImage”文件下载到开发板,会发现“/dev”目录中没有产生 LEDS 驱动的设备节点“leds”。
  2 将 LEDS 驱动编译进内核
  接上一小节,如下图所示,使用命令“make menuconfig”,打开 menuconfig 配置工具。
  
  进入“ Device Drivers ---》”选项,然后进入“Character devices ---》”选项,然后如下图所示,配置上“Enable LEDS config”。
  
  保存退出。打开“.config”文件,可以发现“CONFIG_LEDS_CTL=y”已经配置。
  
  执行编译命令“make”,如下图所示,编译完成之后,使用命令“ls drivers/char/”可以看到“itop4412_leds.o”已经生成。
  
  最后也可以将生成的文件“zImage”文件下载到开发板,会发现“/dev”目录中产生LEDS 驱动的设备节点“leds”,LED 灯的控制又恢复正常了。
举报

孙财秀

2020-12-22 15:25:31
  编译流程图解
  现在内核编译相关的知识已经全部介绍完,本节做一个小节。
  下图已经将内核编译的全部过程包含。
  
  如上图所示。
  红色的线条表示配置文件 Kconfig 这一部分,在 Kconfig 中要定义针对具体驱动文件的宏变量。然后使用 menuconfig 工具生成新的”,config“文件。
  黑色的线条表示编译文件 Makefile 这一部分,在 Makefile 中针对宏变量编译驱动文件。
  执行 make 命令之后,调用“.config”文件,配合各级目录中的 Makefile 文件编译具体的驱动源代码,将源代码编译成“.o”中间文件。
  当中间文件全部编译完成之后,编译工具会生成一个非常精炼的“zImage”二进制文件。
  112013kugbz1bwkbygabul.jpg
举报

更多回帖

发帖
×
20
完善资料,
赚取积分