Linux Kernel Makefile Test
一、本文说明
本文为linux内核Makefile整体分析的续篇,是依据Linux内核Makefile体系的主要内容编写一个简要的测试工程。Linux内核Makefile体系就好像一只“大鸟”,而这篇测试算是“麻雀”,主要是为了通过动手实战进一步理解Linux内核Makefile体系的原理和特点。
二、源码结构
1、测试源码包括1个顶层目录以及5个子目录。
2、Makefile体系的构成是顶层1个Makefile文件、scripts目录中的4个脚本文件以及add、sub、main三个目录中的Makefile文件。
3、C程序源码是add/add.c、sub/sub.c、main/main.c
三、Makefile重要源码展示
1、顶层Makefile
PHONY := MAKE := makesrctree := $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR)) export srctree AS = $(CROSS_COMPILE)as LD = $(CROSS_COMPILE)ld CC = $(CROSS_COMPILE)gcc CPP = $(CC) -E AR = $(CROSS_COMPILE)ar NM = $(CROSS_COMPILE)nmexport AS LD CC CPP AR NM include $(srctree)/scripts/Kbuild.include //该文件中定义有build变量 all: targetsrcdir := add sub main PHONY += $(srcdir)objdir := $(srcdir) PHONY += $(objdir)target: $(srcdir) //总目标的依赖是srcdirgcc -o target add/built-in.o sub/built-in.o main/built-in.o //定义总目标的生成规则 $(srcdir): //通过srcdir依次生成各个子目录中的*/built-in.o$(MAKE) $(build)=$@ clean-dirs := $(addprefix _clean_,$(objdir)) //clean-dirs其实与objdir中的目录是一样的,只是为了执行不同的命令(clean-dirs要删除目标文件),所以要clean-dirs的前边要加上前缀以与srcdir=objdir的目标区别 PHONY += $(clean-dirs) clean$(clean-dirs):$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)clean: $(clean-dirs)rm -f targetclean := -f scripts/Makefile.clean obj.PHONY: $(PHONY)
2、srcdirs/Makefile.build
# ========================================================================== # Building # ==========================================================================src := $(obj)PHONY := __build __build: //Makefile.build中的总目标 include scripts/Kbuild.include# The filename Kbuild has precedence over Makefile kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) include $(kbuild-file) //包含子目录中的Makefile include scripts/Makefile.libifneq ($(strip $(obj-y)),) builtin-target := $(obj)/built-in.o endif__build: $(builtin-target)# If the list of objects to link is empty, just create an empty built-in.o cmd_link_o_target = $(if $(strip $(obj-y)),\$(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^))$(builtin-target): $(obj-y)$(call if_changed,link_o_target) //调用生成库built-in.o的函数 cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<define rule_cc_o_c$(cmd_cc_o_c) endef# Built-in and composite module parts $(obj)/%.o: $(src)/%.c $(call if_changed_rule,cc_o_c) //调用生成目标文件.o的函数 PHONY += FORCE FORCE:.PHONY: $(PHONY)
3、srcdirs/Kbuild.include
build := -f scripts/Makefile.build objif_changed = $(cmd_$(1))//定义函数if_changed # Usage: $(call if_changed_rule,foo) # Will check if $(cmd_foo) or any of the prerequisites changed, # and if so will execute $(rule_foo). if_changed_rule = $(rule_$(1)) //定义函数if_changed_rule
4、srcdirs/Makefile.lib
c_flags = //定义gcc编译器选项ld_flags = $(LDFLAGS) $(ldflags-y) //定义ld连接器选项
obj-y := $(patsubst %/, %/built-in.o, $(obj-y)) //对obj-y中的目录添加built-in.oobj-y := $(addprefix $(obj)/,$(obj-y))//再添加obj前缀
5、srcdirs/Makefile.clean
# ========================================================================== # Cleaning up # ==========================================================================src := $(obj)PHONY := __clean //此为Makefile.clean中的总目标
__clean: rm -f $(obj)/*.o //删除目标文件.o
6、add/Makefile
obj-y += add.o
四、当前源码缺陷
1、没有完成依赖的自动生成
2、没有完成生成目标的目录与源码不在同一目录的功能
附:LinuxKernelMakefileTest.zip
转载于:https://www.cnblogs.com/amanlikethis/p/3676857.html
Linux Kernel Makefile Test相关推荐
- 如何在Linux kernel Makefile中添加宏定义
如何在Linux kernel Makefile中添加宏定义: CFLAGS_object.o += -DMACRO_NAME 在编译object.o时定义宏MACRO_NAME,在kernel中添加 ...
- linux kernel makefile analysis
编译自:https://github.com/0xAX/linux-insides/blob/master/Misc/how_kernel_compiled.md 作者: 0xAX 原创:LCTT h ...
- linux内核makefile详解,linux kernel编译Makefile和Kconfig,make menuconfig详解
Sam需要看看2.6 kernel中USB Mouse的代码.顺便谈谈Kernel中Makefile和Kconfig文件的关系以及配合使用. 背景知识: 背景知识一:Kconfig介绍: 在#make ...
- Linux内核学习(五):linux kernel源码结构以及makefile分析
Linux内核学习(五):linux kernel源码结构以及makefile分析 前面我们知道了linux内核镜像的生成.加载以及加载工具uboot. 这里我们来看看linux内核的源码的宏观东西, ...
- linux 内核调试信息在哪里,Linux kernel debug技巧----开启DEBUG选项
Linux kernel debug技巧----开启DEBUG选项 作者:wowo 发布于:2016-11-1 19:39 分类:Linux应用技巧 kernel的source code中有很多使用p ...
- linux kernel内存映射实例分析
作者:JHJ(jianghuijun211@gmail.com) 日期:2012/08/24 欢迎转载,请注明出处 引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm cortex ...
- Linux kernel 编译问题记录【转】
本文转载自:http://sunyongfeng.com/201701/programmer/linux/kernel_compile_fail.html 编译内核出现以下错误 Can't use ' ...
- Linux内核Makefile
注:以下文字大部分来自韦东山<嵌入式Linux应用开发完全手册> Linux内核源码中含有很多个Makefile文件主要分为以下5类: Linux内核Makefile文件分类 顶层Make ...
- [内存管理] linux kernel内存映射实例分析
作者:JHJ(jianghuijun211@gmail.com ) 日期:2012/08/24 欢迎转载,请注明出处 引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm corte ...
最新文章
- 图集内子图压缩及 ETC2 fallback选项的作用
- Android开发需要了解的 IM 知识
- linux nexus端口配置,Linux下安装Nexus-3.15私服
- Linq 中 Any与All
- 清华毕业生做保姆,那又如何呢
- python计算无穷级数求和常用公式_傅里叶变换(二) 从傅里叶级数到傅里叶变换...
- 【Navicat】查看1000行以后的内容
- 13 -3 jquery选择器和 jquery动画
- remote connect openshift mysql
- 基于TortoiseGit完成本地代码上传Git远程仓库中
- Android官方开发文档Training系列课程中文版:线程执行操作之定义线程执行代码...
- Java和jsp编程中应该注意的几个常见问题
- 高级API快速入门之多线程01【07】
- win7为什么安装不了python_【如何在win7下安装Python及配置】电脑无法安装python
- systemctl的常用命令和使用说明
- 图中的搜索——dij
- 《MongoDB》 数组操作
- CSS第一章:3.交集选择器、并集选择器
- 在SEO中必备的知识应该滚瓜烂熟,其余的就是实战落实
- java初级联系_Java基础练习1(数据类型转换)