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 := make srctree := $(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)nm export AS LD CC CPP AR NM include $(srctree)/scripts/Kbuild.include //该文件中定义有build变量 all: target srcdir := add sub main
PHONY += $(srcdir) objdir := $(srcdir)
PHONY += $(objdir) target: $(srcdir) //总目标的依赖是srcdir
gcc -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 target clean := -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.lib ifneq ($(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 obj if_changed = $(cmd_$())//定义函数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_$()) //定义函数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.o
obj-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、没有完成生成目标的目录与源码不在同一目录的功能
Linux Kernel Makefile Test的更多相关文章
- Linux kernel Makefile for ctags
/********************************************************************** * Linux kernel Makefile for ...
- 编译android的linux kernel goldfish
https://source.android.com/source/building-kernels.html $ export PATH=/home/hzh/oldhome/learn/androi ...
- Linux Kernel的Makefile与Kconfig文件的语法
https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt Introduction ------------ The c ...
- Linux kernel config and makefile system
转载自:http://blog.csdn.net/dreamxu/article/details/6125545 http://www-900.ibm.com/developerWorks/cn/li ...
- kernel/Makefile
## Makefile for the linux kernel.## Note! Dependencies are done automagically by 'make dep', which a ...
- Linux kernel develop -- Hello World
hello.c: #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h&g ...
- Linux内核Makefile文件(翻译自内核手册)
--译自Linux3.9.5 Kernel Makefiles(内核目录documention/kbuild/makefiles.txt) kbuild(kernel build) 内核编译器 Thi ...
- Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux
目录 . sys_call_table:系统调用表 . 内核符号导出表:Kernel-Symbol-Table . Linux 32bit.64bit环境下系统调用入口的异同 . Linux 32bi ...
- Intel 80x86 Linux Kernel Interrupt(中断)、Interrupt Priority、Interrupt nesting、Prohibit Things Whthin CPU In The Interrupt Off State
目录 . 引言 . Linux 中断的概念 . 中断处理流程 . Linux 中断相关的源代码分析 . Linux 硬件中断 . Linux 软中断 . 中断优先级 . CPU在关中断状态下编程要注意 ...
随机推荐
- String类、 StringBuffer、基本数据类型对象包装类
一.概述 Sting s1 = "abc"; //s1是一个类类型变量,"abc"是一个对象. String s2 = new String(" ...
- vojis1523 NOI2002 贪吃的九头龙
描述 传说中的九头龙是一种特别贪吃的动物.虽然名字叫“九头龙”,但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头因衰老而自己脱落. 有一天, ...
- Oracle学习.Windows 命令行 启动ORACLE服务与实例
使用数据库前要先打开数据库的实例和监听器! --总结启动命令如下: lsnrctl [start|stop|status] --启动监听器,停止监听器,查看监听器的 ...
- iOS中二维码的生成与使用(入门篇)
这里简单总结一下关于二维码的扫描与生成,用的是原生的AVFoundation框架,其实这个框架目前功能还是够用的,不过这里推荐一个二维码扫描的第三方(face++),网址就不贴了,直接度娘就OK,里面 ...
- JDBC——事物管理
案例:银行转账问题,数据库如下 相关API setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态.设置事务是否自动提交如果设置为false,表示手 ...
- 编码实战Web端联系人的增删改查
首先画出分析图 实现效果如图 项目下的包如图: 实体包 package com.contactSystem.entiey; public class Contact { private String ...
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- 对MYSQL IFNULL函数的使用进行了具体的叙述
下文对MYSQL IFNULL函数的使用进行了具体的叙述.供您參考学习.假设您在MYSQL IFNULL函数使用方面遇到过类似的问题,最好还是一看. MYSQL IFNULL(expr1,expr2) ...
- extjs_02_grid(显示本地数据,显示跨域数据)
1.显示表格 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8 ...
- oracle学习----访问路径
什么是访问路径?表扫描数据的时候使用了什么方式,这个方式就是访问路径 1.全表扫描TABLE ACCESS FULL 全表扫描,多块读,等待事件:db file scattered read 如果是并 ...