scripts/Makefile.host 分析

文章目录

  • 1. 目标 $(obj)/fixdep
    • 1.1 cmd_host-csingle函数分析:

1  	# SPDX-License-Identifier: GPL-2.0
2  	# ==========================================================================
3  	# Building binaries on the host system
4  	# Binaries are used during the compilation of the kernel, for example
5  	# to preprocess a data file.
6  	#
7  	# Both C and C++ are supported, but preferred language is C for such utilities.
8  	#
9  	# Sample syntax (see Documentation/kbuild/makefiles.txt for reference)
10 	# hostprogs-y := bin2hex
11 	# Will compile bin2hex.c and create an executable named bin2hex
12 	#
13 	# hostprogs-y    := lxdialog
14 	# lxdialog-objs := checklist.o lxdialog.o
15 	# Will compile lxdialog.c and checklist.c, and then link the executable
16 	# lxdialog, based on checklist.o and lxdialog.o
17 	#
18 	# hostprogs-y      := qconf
19 	# qconf-cxxobjs   := qconf.o
20 	# qconf-objs      := menu.o
21 	# Will compile qconf as a C++ program, and menu as a C program.
22 	# They are linked as C++ code to the executable qconf
23 
24 	__hostprogs := $(sort $(hostprogs-y) $(hostprogs-m))
25 	host-cshlib := $(sort $(hostlibs-y) $(hostlibs-m))
26 	host-cxxshlib := $(sort $(hostcxxlibs-y) $(hostcxxlibs-m))
27 
28 	# C code
29 	# Executables compiled from a single .c file
30 	host-csingle	:= $(foreach m,$(__hostprogs), \
31 				$(if $($(m)-objs)$($(m)-cxxobjs)$($(m)-sharedobjs),,$(m)))
32 
33 	# C executables linked based on several .o files
34 	host-cmulti	:= $(foreach m,$(__hostprogs),\
35 			   $(if $($(m)-cxxobjs),,$(if $($(m)-objs),$(m))))
36 
37 	# Shared object libraries
38 	host-shared	:= $(foreach m,$(__hostprogs),\
39 			   $(if $($(m)-sharedobjs),$(m))))
40 
41 	# Object (.o) files compiled from .c files
42 	host-cobjs	:= $(sort $(foreach m,$(__hostprogs),$($(m)-objs)))
43 
44 	# C++ code
45 	# C++ executables compiled from at least one .cc file
46 	# and zero or more .c files
47 	host-cxxmulti	:= $(foreach m,$(__hostprogs),$(if $($(m)-cxxobjs),$(m)))
48 
49 	# C++ Object (.o) files compiled from .cc files
50 	host-cxxobjs	:= $(sort $(foreach m,$(host-cxxmulti),$($(m)-cxxobjs)))
51 
52 	# Object (.o) files used by the shared libaries
53 	host-cshobjs	:= $(sort $(foreach m,$(host-cshlib),$($(m:.so=-objs))))
54 	host-cxxshobjs	:= $(sort $(foreach m,$(host-cxxshlib),$($(m:.so=-objs))))
55 
56 	host-csingle	:= $(addprefix $(obj)/,$(host-csingle))
57 	host-cmulti	:= $(addprefix $(obj)/,$(host-cmulti))
58 	host-cobjs	:= $(addprefix $(obj)/,$(host-cobjs))
59 	host-cxxmulti	:= $(addprefix $(obj)/,$(host-cxxmulti))
60 	host-cxxobjs	:= $(addprefix $(obj)/,$(host-cxxobjs))
61 	host-cshlib	:= $(addprefix $(obj)/,$(host-cshlib))
62 	host-cxxshlib	:= $(addprefix $(obj)/,$(host-cxxshlib))
63 	host-cshobjs	:= $(addprefix $(obj)/,$(host-cshobjs))
64 	host-cxxshobjs	:= $(addprefix $(obj)/,$(host-cxxshobjs))
65 	host-shared	:= $(addprefix $(obj)/,$(host-shared))
66 
67 	#####
68 	# Handle options to gcc. Support building with separate output directory
69 
70 	_hostc_flags   = $(KBUILD_HOSTCFLAGS)   $(HOST_EXTRACFLAGS)   \
71 					 $(HOSTCFLAGS_$(basetarget).o)
72 	_hostcxx_flags = $(KBUILD_HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \
73 					 $(HOSTCXXFLAGS_$(basetarget).o)
74 
75 	ifeq ($(KBUILD_SRC),)
76 	__hostc_flags	= $(_hostc_flags)
77 	__hostcxx_flags	= $(_hostcxx_flags)
78 	else
79 	__hostc_flags	= -I$(obj) $(call flags,_hostc_flags)
80 	__hostcxx_flags	= -I$(obj) $(call flags,_hostcxx_flags)
81 	endif
82 
83 	hostc_flags    = -Wp,-MD,$(depfile) $(__hostc_flags)
84 	hostcxx_flags  = -Wp,-MD,$(depfile) $(__hostcxx_flags)
85 
86 	#####
87 	# Compile programs on the host
88 
89 	# Create executable from a single .c file
90 	# host-csingle -> Executable
91 	quiet_cmd_host-csingle 	= HOSTCC  $@
92 		  cmd_host-csingle	= $(HOSTCC) $(hostc_flags) -o $@ $< \
93 			$(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))
94 	$(host-csingle): $(obj)/%: $(src)/%.c FORCE
95 		$(call if_changed_dep,host-csingle)
96 
97 	# Link an executable based on list of .o files, all plain c
98 	# host-cmulti -> executable
99 	quiet_cmd_host-cmulti	= HOSTLD  $@
100		  cmd_host-cmulti	= $(HOSTCC) $(KBUILD_HOSTLDFLAGS) -o $@ \
101				  $(addprefix $(obj)/,$($(@F)-objs)) \
102				  $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))
103	$(host-cmulti): FORCE
104		$(call if_changed,host-cmulti)
105	$(call multi_depend, $(host-cmulti), , -objs)
106
107	# Create .o file from a single .c file
108	# host-cobjs -> .o
109	quiet_cmd_host-cobjs	= HOSTCC  $@
110		  cmd_host-cobjs	= $(HOSTCC) $(hostc_flags) -c -o $@ $<
111	$(host-cobjs): $(obj)/%.o: $(src)/%.c FORCE
112		$(call if_changed_dep,host-cobjs)
113
114	# Link an executable based on list of .o files, a mixture of .c and .cc
115	# host-cxxmulti -> executable
116	quiet_cmd_host-cxxmulti	= HOSTLD  $@
117		  cmd_host-cxxmulti	= $(HOSTCXX) $(KBUILD_HOSTLDFLAGS) -o $@ \
118				  $(foreach o,objs cxxobjs,\
119				  $(addprefix $(obj)/,$($(@F)-$(o)))) \
120				  $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))
121	$(host-cxxmulti): FORCE
122		$(call if_changed,host-cxxmulti)
123	$(call multi_depend, $(host-cxxmulti), , -objs -cxxobjs)
124
125	# Create .o file from a single .cc (C++) file
126	quiet_cmd_host-cxxobjs	= HOSTCXX $@
127		  cmd_host-cxxobjs	= $(HOSTCXX) $(hostcxx_flags) -c -o $@ $<
128	$(host-cxxobjs): $(obj)/%.o: $(src)/%.cc FORCE
129		$(call if_changed_dep,host-cxxobjs)
130
131	# Compile .c file, create position independent .o file
132	# host-cshobjs -> .o
133	quiet_cmd_host-cshobjs	= HOSTCC  -fPIC $@
134		  cmd_host-cshobjs	= $(HOSTCC) $(hostc_flags) -fPIC -c -o $@ $<
135	$(host-cshobjs): $(obj)/%.o: $(src)/%.c FORCE
136		$(call if_changed_dep,host-cshobjs)
137
138	# Compile .c file, create position independent .o file
139	# Note that plugin capable gcc versions can be either C or C++ based
140	# therefore plugin source files have to be compilable in both C and C++ mode.
141	# This is why a C++ compiler is invoked on a .c file.
142	# host-cxxshobjs -> .o
143	quiet_cmd_host-cxxshobjs	= HOSTCXX -fPIC $@
144		  cmd_host-cxxshobjs	= $(HOSTCXX) $(hostcxx_flags) -fPIC -c -o $@ $<
145	$(host-cxxshobjs): $(obj)/%.o: $(src)/%.c FORCE
146		$(call if_changed_dep,host-cxxshobjs)
147
148	# Link a shared library, based on position independent .o files
149	# *.o -> .so shared library (host-cshlib)
150	quiet_cmd_host-cshlib	= HOSTLLD -shared $@
151		  cmd_host-cshlib	= $(HOSTCC) $(HOSTLDFLAGS) -shared -o $@ \
152				  $(addprefix $(obj)/,$($(@F:.so=-objs))) \
153				  $(HOST_LOADLIBES) $(HOSTLDLIBS_$(@F))
154	$(host-cshlib): FORCE
155		$(call if_changed,host-cshlib)
156	$(call multi_depend, $(host-cshlib), .so, -objs)
157
158	# Link a shared library, based on position independent .o files
159	# *.o -> .so shared library (host-cxxshlib)
160	quiet_cmd_host-cxxshlib	= HOSTLLD -shared $@
161		  cmd_host-cxxshlib	= $(HOSTCXX) $(HOSTLDFLAGS) -shared -o $@ \
162				  $(addprefix $(obj)/,$($(@F:.so=-objs))) \
163				  $(HOST_LOADLIBES) $(HOSTLDLIBS_$(@F))
164	$(host-cxxshlib): FORCE
165		$(call if_changed,host-cxxshlib)
166	$(call multi_depend, $(host-cxxshlib), .so, -objs)
167
168	targets += $(host-csingle)  $(host-cmulti) $(host-cobjs)\
169		   $(host-cxxmulti) $(host-cxxobjs) $(host-shared) \
170		   $(host-cshlib) $(host-cshobjs) $(host-cxxshlib) $(host-cxxshobjs)
171

1. 目标 $(obj)/fixdep

由于目标是 $(obj)/fixdep,所以自动匹配第94-95行:

94 $(host-csingle): $(obj)/%: $(src)/%.c FORCE
95 	  $(call if_changed_dep,host-csingle)

1.第94行中的 $(host-csingle) 在第24-56行中定义:

24 __hostprogs  := $(sort $(hostprogs-y) $(hostprogs-m))
30 host-csingle	:= $(foreach m,$(__hostprogs), \
31                $(if $($(m)-objs)$($(m)-cxxobjs)$($(m)-sharedobjs),,$(m)))
56 host-csingle	:= $(addprefix $(obj)/,$(host-csingle))

  addprefix函数、sort函数、foreach函数
  第24行:由于顶层 Makefile 中执行make -f ./scripts/Makefile.build obj=scripts/basic,又在 Makefile.build 中第57行引用scripts/basic/Makefile,在 scripts/basic/Makefile 中定义hostprogs-y := fixdep,hostprogs-m 未定义,所以最终: __hostprogs = fixdep
  第30行:由于第24行的变量定义,所以最终: host-csingle = fixdep
  第56行:由第30行定义,所以最终: host-csingle = $(obj)/fixdep
2.第94行中的 $(obj) 和 $(src) 在 scripts/Makefile.build 的第7-15行中定义,所以最终: $(obj) = $(src)

7  prefix := tpl
8  src := $(patsubst $(prefix)/%,%,$(obj))
9  ifeq ($(obj),$(src))
10 prefix := spl
11 src := $(patsubst $(prefix)/%,%,$(obj))
12 ifeq ($(obj),$(src))
13 prefix := .
14 endif
15 endif

第94-95行最终展开为:

94 $(obj)/fixdep: $(obj)/%: $(obj)/%.c FORCE
95 	  $(call if_changed_dep,host-csingle)

这里目标$(obj)/fixdep的生成,依赖$(src)/%.c,其目录下存在此类文件【fixdep.c】,经过 if_changed_dep函数 分析,第95行实际是打印并执行cmd_host-csingle函数,并将相应内容输入到$(obj)/.fixdep.cmd文件中。

最终:打印并执行$(cmd_host-csingle)命令,并将cmd_$@ := $(cmd_host-csingle)的内容输入到$(obj)/.$@.cmd 文件中,完成最终目标的生成【即生成 scripts/basic/fixdep】

92 cmd_host-csingle = cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11     -o scripts/basic/fixdep scripts/basic/fixdep.c   
94 scripts/basic/fixdep: scripts/basic/fixdep: scripts/basic/fixdep.c FORCE
95 	  $(cmd_host-csingle)

1.1 cmd_host-csingle函数分析:

91 quiet_cmd_host-csingle 	= HOSTCC  $@
92       cmd_host-csingle	= $(HOSTCC) $(hostc_flags) -o $@ $< \
93 	  	$(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))

第92行:$(HOSTCC) 在顶层 Makefile 的282行定义 HOSTCC = cc
第92行:$(hostc_flags) 在83行定义:

70 _hostc_flags   = $(KBUILD_HOSTCFLAGS)   $(HOST_EXTRACFLAGS)   \
71                 $(HOSTCFLAGS_$(basetarget).o)
72 _hostcxx_flags = $(KBUILD_HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \
73                 $(HOSTCXXFLAGS_$(basetarget).o)
74
75 ifeq ($(KBUILD_SRC),)
76 __hostc_flags	= $(_hostc_flags)
77 __hostcxx_flags	= $(_hostcxx_flags)
78 else
79 __hostc_flags	= -I$(obj) $(call flags,_hostc_flags)
80 __hostcxx_flags	= -I$(obj) $(call flags,_hostcxx_flags)
81 endif
82
83 hostc_flags    = -Wp,-MD,$(depfile) $(__hostc_flags)
84 hostcxx_flags  = -Wp,-MD,$(depfile) $(__hostcxx_flags)
......
83 hostc_flags    = -Wp,-MD,$(depfile) $(__hostc_flags)

第83行:$(depfile) 在scripts/Kbuild.include 【在顶层Makefile的396行引用】的20行定义:
最终: depfile = $(obj)/.$(notdir $@).cmd
dir函数、notdir 函数、subst 函数

5  comma   := ,
15 dot-target = $(dir $@).$(notdir $@)
20 depfile = $(subst $(comma),_,$(dot-target).d)

第83行:$(__hostc_flags),当输入make O=dir时,KBUILD_SRC=dir,由于这里没有O=,所以第75行条件成立,执行第76行,第76行中的 $(_hostc_flags) 在第70行中定义,其中的 $(HOST_EXTRACFLAGS) $(HOSTCFLAGS_$(basetarget).o) 未定义为空,$(KBUILD_HOSTCFLAGS)在顶层 Makefile 中定义为:-Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11
最终: hostc_flags = -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11

第93行:@F介绍,$(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F) 未定义为空

最终:

cmd_host-csingle = cc -Wp,-MD,$(obj).$(notdir $@).cmd -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11     -o $@ $<

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/19464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【赠书第26期】AI绘画教程:Midjourney使用方法与技巧从入门到精通

文章目录 前言 1 Midjourney入门指南 1.1 注册与登录 1.2 界面熟悉 1.3 基础操作 2 Midjourney进阶技巧 2.1 描述词优化 2.2 参数调整 2.3 迭代生成 3 Midjourney高级应用 3.1 创意启发 3.2 团队协作 3.3 商业应用 4 总结与展望 5 推荐图书 6 粉丝福利 前言 在…

JS易错点

JavaScript 中的常见易错点包括语法错误、逻辑错误和一些常见的陷阱。以下是一些常见的错误和避免这些错误的建议&#xff1a; 变量声明错误 使用 var 声明变量可能导致变量提升和作用域问题&#xff0c;建议使用 let 和 const。错误示例&#xff1a;var x 10; if (true) {var…

Hibernate的优缺点

Hibernate的优缺点可以归纳如下&#xff1a; 优点&#xff1a; 对象关系映射&#xff08;ORM&#xff09;&#xff1a; Hibernate提供了强大的对象关系映射功能&#xff0c;允许开发人员以面向对象的方式操作数据库&#xff0c;从而简化了数据库操作&#xff0c;提高了开发效…

污水净化之旅:可视化技术揭秘城市“血液”的循环奥秘

在繁华的都市背后&#xff0c;有一个默默守护着我们的“肾脏”——污水处理厂。它悄无声息地处理着每天产生的污水&#xff0c;确保我们的生活环境洁净美好。但你知道这个“肾脏”是如何工作的吗&#xff1f;今天&#xff0c;就让我们一起走进污水处理的神秘世界&#xff0c;通…

Leetcode:寻找两个正序数组的中位数

题目链接&#xff1a;4. 寻找两个正序数组的中位数 - 力扣&#xff08;LeetCode&#xff09; 题目分析 1、当只有一个有序数组时&#xff0c;该数组的中位数会将该数组分为两份&#xff1a;左子数组 和 右子数组 2、当有两个有序数组时&#xff0c; 我们仍然可以通过一条分隔…

上岸极不保护一志愿院校经验。

这个系列会邀请上岸学长学姐进行经验分享~ 今天分享经验的同学上岸了哈尔滨工程大学。并不是对这所院校有什么歧视&#xff0c;只是按照往年择校数据来看&#xff0c;确实不太保护一志愿。大家自行斟酌&#xff0c;有利有弊。 经验分享 学长23年上岸哈尔滨工程大学水声工程学…

Sealos CLI快速部署部署K8s集群

1. Kubernetes基础环境部署 kubernetes有多种部署方式&#xff0c;目前主流的方式有kubeadm、minikube、二进制包 minikube&#xff1a;一个用于快速搭建单节点kubernetes的工具 kubeadm&#xff1a;一个用于快速搭建kubernetes集群的工具 二进制包 &#xff1a;从官网下载每…

社区供稿丨GPT-4o 对实时互动与 RTC 的影响

以下文章来源于共识粉碎机 &#xff0c;作者AI芋圆子 前面的话&#xff1a; GPT-4o 发布当周&#xff0c;我们的社区伙伴「共识粉碎机」就主办了一场主题为「GPT-4o 对实时互动与 RTC 的影响」讨论会。涉及的话题包括&#xff1a; GPT-4o 如何降低延迟&#xff08;VAD 模块可…

k8s集群搭建

k8s集群搭建 前期准备 1.关闭selinux 永久关闭selinux sed -i s/enforcing/disabled/g /etc/selinux/config更改后需重启系统 reboot2.关闭防火墙 systemctl stop firewalld && systemctl disable firewalld3.关闭swap内存分区 永久关闭swap分区 echo vm.swapp…

LabVIEW中进行步进电机的位置控制

在LabVIEW中进行步进电机的位置控制&#xff0c;通常涉及以下几个关键步骤&#xff1a;设置硬件、配置通信、编写控制算法和实施反馈控制。以下是一个详细的介绍。 硬件设置 步进电机&#xff1a;选择合适的步进电机&#xff0c;根据负载和应用需求选择适当的步数和转矩。 驱…

FL Studio21.2.8中文版让你的音乐创作如鱼得水

在音乐的世界里&#xff0c;我们都是探索者&#xff0c;追求着无尽的创新和可能性。而在这个过程中&#xff0c;我们往往会遇到各种挑战和困扰。如何快速高效地创作出满意的音乐作品&#xff1f;如何将我们的创意完美地呈现出来&#xff1f;这些问题可能一直困扰着你。今天&…

成都欣丰洪泰文化传媒有限公司助力品牌快速崛起

在当今数字化浪潮汹涌的时代&#xff0c;电商行业作为新经济的代表&#xff0c;正以其独特的魅力和无限的潜力&#xff0c;引领着商业模式的创新与变革。在这个充满机遇与挑战的领域里&#xff0c;成都欣丰洪泰文化传媒有限公司凭借其专业的电商服务能力和前瞻性的战略眼光&…

如何在.htaccess文件创建一个自定义404页面

本周有一个客户&#xff0c;购买Hostease的虚拟主机&#xff0c;询问我们的在线客服&#xff0c;如何在.htaccess文件创建一个自定义404页面&#xff1f;我们为用户提供相关教程&#xff0c;用户很快解决了遇到的问题。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可…

NIFT和BMP批量互相转换(matlab)

前言&#xff1a;最近在做数据集&#xff0c;需要进行NIFT和BMP的批量互相转换。之前都是一张一张转换的&#xff0c;用Image J就能完成&#xff0c;但是最近数据太多了&#xff0c;所以得研究一下如何批量转换。 NIFT和BMP互相转换 NIFT和BMP介绍NIFTBMP 为什么要转换Matlab进…

MVC和MVVM

MVC Model层&#xff1a;用于处理应用程序数据逻辑的部分&#xff0c;通常负责在数据库中存取数据 View&#xff08;视图&#xff09;处理数据显示的部分。通常视图是依据模型数据创建的 Controller&#xff08;控制器&#xff09;是处理用户交互的部分。通常控制器负责从视…

从零开始学Vue3--环境搭建

1.搭建环境 下载nodejs nodejs下载地址 更新npm npm install -g npm 设置npm源&#xff0c;加快下载速度 npm config set registry https://registry.npmmirror.com 使用脚手架创建项目 npm create vuelatest 根据你的需要选择对应选项 进入新建的项目下载依赖 npm in…

Tasker+SendSilentMail实现钉钉自动打卡

Tasker 允许用户根据自定义的“配置文件”(Profiles)&#xff0c;在特定的“背景”(Contexts)下&#xff0c;执行指定的“任务”(Tasks)。以下是关于Tasker的详细介绍&#xff1a; 强大的自定义能力&#xff1a;用户可以根据自己的需求&#xff0c;创建各种配置文件和任务&…

【BUG】流式响应requests得到: ping - 和时间戳

前情提要 运行Langchain-Chatchat项目&#xff0c;使用自定义请求访问API Server流式输出 报错展示 b: ping - 2024-05-22 00:46:04.83252000:00\r\n\r\n报错原因 这通常是由于 Server-Sent Events (SSE) 实现中使用的“心跳”机制&#xff0c;以确保连接保持活跃。一些 SSE…

Java 在Word文档中添加、删除页面

在排版或者编辑Word文档时&#xff0c;可能会需要增加新页面或删除某个已有页面&#xff0c;以便更好地呈现内容。下面将介绍如何使用国产Java控件来实现在Word文档中增删页面的功能。 目录 Java 在Word文档末尾新增一页 Java 在Word文档指定位置插入一页 Java 删除Word文档…

百度ERNIE系列预训练语言模型浅析(4)-总结篇

总结&#xff1a;ERNIE 3.0与ERNIE 2.0比较 &#xff08;1&#xff09;相同点&#xff1a; 采用连续学习 采用了多个语义层级的预训练任务 &#xff08;2&#xff09;不同点&#xff1a; ERNIE 3.0 Transformer-XL Encoder(自回归自编码), ERNIE 2.0 Transformer Encode…