一、本文说明

  本文为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相关推荐

  1. 如何在Linux kernel Makefile中添加宏定义

    如何在Linux kernel Makefile中添加宏定义: CFLAGS_object.o += -DMACRO_NAME 在编译object.o时定义宏MACRO_NAME,在kernel中添加 ...

  2. linux kernel makefile analysis

    编译自:https://github.com/0xAX/linux-insides/blob/master/Misc/how_kernel_compiled.md 作者: 0xAX 原创:LCTT h ...

  3. linux内核makefile详解,linux kernel编译Makefile和Kconfig,make menuconfig详解

    Sam需要看看2.6 kernel中USB Mouse的代码.顺便谈谈Kernel中Makefile和Kconfig文件的关系以及配合使用. 背景知识: 背景知识一:Kconfig介绍: 在#make ...

  4. Linux内核学习(五):linux kernel源码结构以及makefile分析

    Linux内核学习(五):linux kernel源码结构以及makefile分析 前面我们知道了linux内核镜像的生成.加载以及加载工具uboot. 这里我们来看看linux内核的源码的宏观东西, ...

  5. linux 内核调试信息在哪里,Linux kernel debug技巧----开启DEBUG选项

    Linux kernel debug技巧----开启DEBUG选项 作者:wowo 发布于:2016-11-1 19:39 分类:Linux应用技巧 kernel的source code中有很多使用p ...

  6. linux kernel内存映射实例分析

    作者:JHJ(jianghuijun211@gmail.com) 日期:2012/08/24 欢迎转载,请注明出处 引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm cortex ...

  7. Linux kernel 编译问题记录【转】

    本文转载自:http://sunyongfeng.com/201701/programmer/linux/kernel_compile_fail.html 编译内核出现以下错误 Can't use ' ...

  8. Linux内核Makefile

    注:以下文字大部分来自韦东山<嵌入式Linux应用开发完全手册> Linux内核源码中含有很多个Makefile文件主要分为以下5类: Linux内核Makefile文件分类 顶层Make ...

  9. [内存管理] linux kernel内存映射实例分析

    作者:JHJ(jianghuijun211@gmail.com ) 日期:2012/08/24 欢迎转载,请注明出处 引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm corte ...

最新文章

  1. 图集内子图压缩及 ETC2 fallback选项的作用
  2. Android开发需要了解的 IM 知识
  3. linux nexus端口配置,Linux下安装Nexus-3.15私服
  4. Linq 中 Any与All
  5. 清华毕业生做保姆,那又如何呢
  6. python计算无穷级数求和常用公式_傅里叶变换(二) 从傅里叶级数到傅里叶变换...
  7. 【Navicat】查看1000行以后的内容
  8. 13 -3 jquery选择器和 jquery动画
  9. remote connect openshift mysql
  10. 基于TortoiseGit完成本地代码上传Git远程仓库中
  11. Android官方开发文档Training系列课程中文版:线程执行操作之定义线程执行代码...
  12. Java和jsp编程中应该注意的几个常见问题
  13. 高级API快速入门之多线程01【07】
  14. win7为什么安装不了python_【如何在win7下安装Python及配置】电脑无法安装python
  15. systemctl的常用命令和使用说明
  16. 图中的搜索——dij
  17. 《MongoDB》 数组操作
  18. CSS第一章:3.交集选择器、并集选择器
  19. 在SEO中必备的知识应该滚瓜烂熟,其余的就是实战落实
  20. java初级联系_Java基础练习1(数据类型转换)

热门文章

  1. Java多线程 - 线程组
  2. CCNA 02 OSI七层
  3. 快速启动栏的现实桌面快捷方式
  4. 大话西游之Office应用实例系列! 13
  5. JavaScript中Window.event详解
  6. Goldengate介绍
  7. QTP对象TO与RO
  8. 分表后需要注意的那些事儿
  9. c/c++ struct的大小以及sizeof用法
  10. Stack Pointer Tracker