autoconf.mk详析


uboot的顶层Makefile中有如下的一段代码
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #  
  2. # Auto-generate the autoconf.mk file (which is included by all makefiles)  
  3. #  
  4. # This target actually generates 2 files; autoconf.mk and autoconf.mk.dep.  
  5. # the dep file is only include in this top level makefile to determine when  
  6. # to regenerate the autoconf.mk file.  
  7. $(obj)include/autoconf.mk.dep: $(obj)include/config.h include/common.h  
  8.     @$(XECHO) Generating $@ ; \  
  9.     set -e ; \  
  10.     : Generate the dependancies ; \  
  11.     $(CC) -x c -DDO_DEPS_ONLY -M $(CFLAGS) $(CPPFLAGS) \  
  12.         -MQ $(obj)include/autoconf.mk include/common.h > $@  
  13.   
  14. $(obj)include/autoconf.mk: $(obj)include/config.h  
  15.     @$(XECHO) Generating $@ ; \  
  16.     set -e ; \  
  17.     : Extract the config macros ; \  
  18.     $(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dM include/common.h | \  
  19.         sed -n -f tools/scripts/define2mk.sed > $@.tmp && \  
  20.     mv $@.tmp $@  
[plain] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #  
  2. # Auto-generate the autoconf.mk file (which is included by all makefiles)  
  3. #  
  4. # This target actually generates 2 files; autoconf.mk and autoconf.mk.dep.  
  5. # the dep file is only include in this top level makefile to determine when  
  6. # to regenerate the autoconf.mk file.  
  7. $(obj)include/autoconf.mk.dep: $(obj)include/config.h include/common.h  
  8.     @$(XECHO) Generating $@ ; \  
  9.     set -e ; \  
  10.     : Generate the dependancies ; \  
  11.     $(CC) -x c -DDO_DEPS_ONLY -M $(CFLAGS) $(CPPFLAGS) \  
  12.         -MQ $(obj)include/autoconf.mk include/common.h > $@  
  13.   
  14. $(obj)include/autoconf.mk: $(obj)include/config.h  
  15.     @$(XECHO) Generating $@ ; \  
  16.     set -e ; \  
  17.     : Extract the config macros ; \  
  18.     $(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dM include/common.h | \  
  19.         sed -n -f tools/scripts/define2mk.sed > $@.tmp && \  
  20.     mv $@.tmp $@  

先看第一个: $(obj)include/autoconf.mk.dep: $(obj)include/config.h include/common.h, 它表示autoconf.mk.dep依赖于config.h和common.h这两个文件.
  • @$(XECHO) Generating $@ ; \ 这句话会在编译阶段输出编译信息 Generating include/autoconf.mk.dep
  • set -e ; \ 这句话表示, 当下面命令返回值不会0时, 整个脚本立即停止退出
  • : Generate the dependancies ; \  没有明白是啥意思~~
  • $(CC) -x c -DDO_DEPS_ONLY -M $(CFLAGS) $(CPPFLAGS) -MQ $(obj)include/autoconf.mk include/common.h > $@
    • -DDO_DEPS_ONLY: 设置flag, 具体来说, 我们可以在common.h里面看见#ifdef DO_DEPS_ONLY这样的语句, 这个-D就表示DO_DEPS_ONLY被定义了
    • -M : 表示生成依赖关系. 我还专门做了个实验, 如下
      • gcc -M main.c 输出结果为 main.o: main.c
    • -MQ: 表示指定依赖关系中target的名称, 看下面的实验
      • gcc -M -MQ newname.mk main.c 输出结果为 newname.mk: main.c
    • 这句话表示: 生成依赖关系 include/autoconf.mk: include/common.h, 结果最终输出到include/autoconf.mk.dep
  • 打开编译后生成的include/autoconf.mk.dep, 可以查阅里面的内容. 至于为什么需要生成这个文件, 我现在还不清楚.
再看第二个: $(obj)include/autoconf.mk: $(obj)include/config.h, 它表示autoconf.mk依赖于include/config.h这个文件
  • @$(XECHO) Generating $@ ; \ 这句话会在编译阶段输出编译信息Generating include/autoconf.mk
  • set -e; \ 同上
  • $(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dM include/common.h | sed -n -f tools/scripts/define2mk.sed > $@.tmp && mv $@.tmp $@
    • -DDO_DEPS_ONLY: 同上
    • -dM : 作用是输出include/common.h中定义的所有宏
    • |      : shell中的管道, 表示将前面的结果传递给后面的命令
    • define2mk.sed : 查找和处理以“CONFIG_”开头的宏定义的功能, 将处理的结果输出到include/autoconf.mk.tmp
    • mv $@.tmp $@ : 重命名为include/autoconf.mk. 
    • 最终就会生成include/autoconf.mk
  •  include/common.h文件包含了include/config.h文件,而include/config.h文件又包含了config_defaults.h等uboot下的通用头文件, 还会包含<configs/${CONFIG_NAME}.h>, 这个.h是我们自己创建的, 可以在里面添加自己的"CONFIG_"宏定义. 已决定开启哪些功能.
至此, 我们知道, 系统中所有的"CONFIG_"开头的宏开关, 都被放到了include/autoconf.mk中. 

depend

在uboot的顶层Makefile中, 我们经常会看到类似的代码片段
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. $(obj)spl/u-boot-spl.bin:   $(SUBDIR_TOOLS) <span style="color: rgb(255, 0, 0);">depend</span>  
  2.         $(MAKE) -C spl all  
[plain] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. $(obj)spl/u-boot-spl.bin:   $(SUBDIR_TOOLS) <span style="color:#ff00;">depend</span>  
  2.         $(MAKE) -C spl all  

这个depend是什么意思呢, Makefile中有如下一段代码
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. # Explicitly make _depend in subdirs containing multiple targets to prevent  
  2. # parallel sub-makes creating .depend files simultaneously.  
  3. depend dep: $(TIMESTAMP_FILE) $(VERSION_FILE) \  
  4.         $(obj)include/spl-autoconf.mk \  
  5.         $(obj)include/tpl-autoconf.mk \  
  6.         $(obj)include/autoconf.mk \  
  7.         $(obj)include/generated/generic-asm-offsets.h \  
  8.         $(obj)include/generated/asm-offsets.h  
  9.         for dir in $(SUBDIRS) $(CPUDIR) $(LDSCRIPT_MAKEFILE_DIR) ; do \  
  10.             $(MAKE) -C $$dir _depend ; done  
[plain] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. # Explicitly make _depend in subdirs containing multiple targets to prevent  
  2. # parallel sub-makes creating .depend files simultaneously.  
  3. depend dep: $(TIMESTAMP_FILE) $(VERSION_FILE) \  
  4.         $(obj)include/spl-autoconf.mk \  
  5.         $(obj)include/tpl-autoconf.mk \  
  6.         $(obj)include/autoconf.mk \  
  7.         $(obj)include/generated/generic-asm-offsets.h \  
  8.         $(obj)include/generated/asm-offsets.h  
  9.         for dir in $(SUBDIRS) $(CPUDIR) $(LDSCRIPT_MAKEFILE_DIR) ; do \  
  10.             $(MAKE) -C $$dir _depend ; done  

  • depend dep : 它表示这个规则有两个目标. 也就是你自己的目标依赖depend或者dep都会跑到这里来继续.
  • $(obj)include/spl-autoconf.mk \ : 表示depend依赖spl-autoconf.mk. 这个mk的生成规则也在Makefile中有定义. 细节方面参考上面的autoconf.mk
  • $(obj)include/tpl-autoconf.mk \ : 同上
  • $(obj)include/autoconf.mk \     : 同上
  • $(obj)include/generated/generic-asm-offsets.h \ : 暂不分析
  • $(obj)include/generated/asm-offsets.h : 暂不分析
  • for dir in $(SUBDIRS) $(CPUDIR) $(LDSCRIPT_MAKEFILE_DIR) ; do $(MAKE) -C $$dir _depend ; done
    • 这句话表示去上面各个目录下执行 make _depend命令.
那我们看看对应子目录下的Makefile, 例如$(CPUDIR) , 会看到如下的代码片段
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. # defines $(obj).depend target  
  2. include $(SRCTREE)/rules.mk  
  3.   
  4. sinclude $(obj).depend  
[plain] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. # defines $(obj).depend target  
  2. include $(SRCTREE)/rules.mk  
  3.   
  4. sinclude $(obj).depend  

并没有看到_depend这个目标, 那make _depend在这个目录下如何执行呢? 来看看它include的rules.mk
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. _depend:    $(obj).depend  
  2.   
  3. # Split the source files into two camps: those in the current directory, and  
  4. # those somewhere else. For the first camp we want to support CPPFLAGS_<fname>  
  5. # and for the second we don't / can't.  
  6. PWD_SRCS := $(filter $(notdir $(SRCS)),$(SRCS))  
  7. OTHER_SRCS := $(filter-out $(notdir $(SRCS)),$(SRCS))  
  8.   
  9. # This is a list of dependency files to generate  
  10. DEPS := $(basename $(patsubst %,$(obj).depend.%,$(PWD_SRCS)))  
  11.   
  12. # Join all the dependencies into a single file, in three parts  
  13. #   1 .Concatenate all the generated depend files together  
  14. #   2. Add in the deps from OTHER_SRCS which we couldn't process  
  15. #   3. Add in the HOSTSRCS  
  16. $(obj).depend:  $(src)Makefile $(TOPDIR)/config.mk $(DEPS) $(OTHER_SRCS) \  
  17.         $(HOSTSRCS)  
  18.     cat /dev/null $(DEPS) >$@  
  19.     @for f in $(OTHER_SRCS); do \  
  20.         g=`basename $$f | sed -e 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \  
  21.         $(CC) -M $(CPPFLAGS) -MQ $(obj) f >> $@ ; \  
  22.     done  
  23.     @for f in $(HOSTSRCS); do \  
  24.         g=`basename $$f | sed -e 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \  
  25.         $(HOSTCC) -M $(HOSTCPPFLAGS) -MQ $(obj) f >> $@ ; \  
  26.     done  
  27.   
  28. MAKE_DEPEND = $(CC) -M $(CPPFLAGS) $(EXTRA_CPPFLAGS_DEP) \  
  29.         -MQ $(addsuffix .o,$(obj)$(basename $<)) $< >$@  
  30.   
  31.   
  32. $(obj).depend.%:    %.c  
  33.     $(MAKE_DEPEND)  
  34.   
  35. $(obj).depend.%:    %.S  
  36.     $(MAKE_DEPEND)  
  37.   
  38. $(HOSTOBJS): $(obj)%.o: %.c  
  39.     $(HOSTCC) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o $@ $< -c  
  40. $(NOPEDOBJS): $(obj)%.o: %.c  
  41.     $(HOSTCC) $(HOSTCFLAGS_NOPED) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o $@ $< -c  
  42.   
  43. #########################################################################  
[plain] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. _depend:    $(obj).depend  
  2.   
  3. # Split the source files into two camps: those in the current directory, and  
  4. # those somewhere else. For the first camp we want to support CPPFLAGS_<fname>  
  5. # and for the second we don't / can't.  
  6. PWD_SRCS := $(filter $(notdir $(SRCS)),$(SRCS))  
  7. OTHER_SRCS := $(filter-out $(notdir $(SRCS)),$(SRCS))  
  8.   
  9. # This is a list of dependency files to generate  
  10. DEPS := $(basename $(patsubst %,$(obj).depend.%,$(PWD_SRCS)))  
  11.   
  12. # Join all the dependencies into a single file, in three parts  
  13. #   1 .Concatenate all the generated depend files together  
  14. #   2. Add in the deps from OTHER_SRCS which we couldn't process  
  15. #   3. Add in the HOSTSRCS  
  16. $(obj).depend:  $(src)Makefile $(TOPDIR)/config.mk $(DEPS) $(OTHER_SRCS) \  
  17.         $(HOSTSRCS)  
  18.     cat /dev/null $(DEPS) >$@  
  19.     @for f in $(OTHER_SRCS); do \  
  20.         g=`basename $$f | sed -e 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \  
  21.         $(CC) -M $(CPPFLAGS) -MQ $(obj)
    f >> $@ ; \  
  22.     done  
  23.     @for f in $(HOSTSRCS); do \  
  24.         g=`basename $$f | sed -e 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \  
  25.         $(HOSTCC) -M $(HOSTCPPFLAGS) -MQ $(obj)
    f >> $@ ; \  
  26.     done  
  27.   
  28. MAKE_DEPEND = $(CC) -M $(CPPFLAGS) $(EXTRA_CPPFLAGS_DEP) \  
  29.         -MQ $(addsuffix .o,$(obj)$(basename $<)) $< >$@  
  30.   
  31.   
  32. $(obj).depend.%:    %.c  
  33.     $(MAKE_DEPEND)  
  34.   
  35. $(obj).depend.%:    %.S  
  36.     $(MAKE_DEPEND)  
  37.   
  38. $(HOSTOBJS): $(obj)%.o: %.c  
  39.     $(HOSTCC) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o $@ $< -c  
  40. $(NOPEDOBJS): $(obj)%.o: %.c  
  41.     $(HOSTCC) $(HOSTCFLAGS_NOPED) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o $@ $< -c  
  42.   
  43. #########################################################################  

这里有_depend目标, make _depend的时候, 执行的其实就是这里的_depend. 这个里面的细节不分析了, 大体来说有几点
  • $(obj).depend: obj一般为空, 所以这里会在当前目录下生成一个.depend文件
  • .depend里面的内容就是类似于 : main.o : main.c main.h . 
    • 想深究的话可以参考这里 : http://blog.csdn.net/panfengsoftware/article/details/7877864
最后在Makefile里面引用了当前目录下的这个.depend

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

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

相关文章

都是大人物,看看你认识几个。

突然找到一张老图&#xff0c;但是一直没能认识全部的人&#xff0c;下面名单是填的&#xff0c;不一定都正确。 &#xff08;想要原图留下邮件&#xff0c;我偶尔上来&#xff0c;如果看到会发给你的&#xff09; 1Bill Gates 比尔盖茨2Audrey Hepburn奥黛丽赫本3Charlie Cha…

ant中的table行列不对齐问题,以及换行,隐藏等问题

注意&#xff1a;ant中的table表格&#xff0c;列的宽度如果设置了&#xff0c;那么该列就是设置的宽度&#xff1b;那些没设置宽度的列&#xff0c;列宽&#xff08;总宽度 - 设置的列宽总和&#xff09;/ 未设置的列的个数&#xff0c;即平均宽度&#xff1b; 1.如果表格只是…

MAC OS X10.9.5下成功驱动独立显卡影驰Nvidia GeForce GTX 760大将(4GB)--非公版

我的机器是台式机(自己组装的)&#xff0c;硬件参数如下&#xff1a; 操作系统 Windows 7 旗舰版 64位 SP1 ( DirectX 11 )处理器 英特尔 Core i7-4770K 3.50GHz 四核 主板 华硕 Z87-PRO (英特尔 Haswell) 内存 8 GB ( 金士顿 DDR3 1778MHz ) 主硬…

vue-cli3项目通过vue如何引入第三方js包完成登陆功能

注意&#xff1a;本次登陆&#xff0c;前后端分离&#xff1b;前端通过引入第三方的js包&#xff0c;调用js包里的初始化方法和提交方法完成登陆以及退出&#xff1b; 流程1.引入第三方包 1.1在index.html文件下引入 流程2.完成初始化 在组件的created下完成初始化 问题2.1因…

前端vscode插件合集

工欲善其事必先利其器 安装步骤 . . . . . . . . . 1.中文包Chinese (Simplified) Language Pack for Visual Studio Code 2.自动闭合标签Auto Close Tag 3.同步修改标签Auto Rename Tag 4.高亮代码的回调&#xff0c;括号的区域范围Bracket Pair Colorizer 4.支持多中…

Android卷一全文 第一章 阅读前的准备工作

本章主要内容本章简单介绍Android系统架构、编译环境的搭建以及一些工具的使用。1.1 系统架构 1.1.1 Android系统架构 Android是Google公司推出的一款手机开发平台。该平台本身是基于Linux内核的&#xff0c;图1-1展示了这个系统的架构&#xff1a;图1-1 Android系统架构 从…

web安全字体

webfont解剖 Unicode字体可以包含数以千计字形有四个字体格式&#xff1a; WOFF2, WOFF, EOT, TTF一些字体格式需要使用GZIP压缩 一个web字体是字形的集合&#xff0c;且每个字形是一个描述了一个字母亦或符号的矢量图。 所以&#xff0c;一个字体文件的大小由两个因素决定&…

设置Clover默认进入Windows,按快捷键F8可选择不同的引导

系统情况&#xff1a; Win7 Mac10.9.5 Clover 我要达到的目标是&#xff1a;默认进入Windows系统&#xff0c;如果有需要&#xff0c;可以选择进入其他系统&#xff0c;如Mac OS X 我原以为可以在clover中配置&#xff0c;达到这个目标&#xff0c;可是我经过多次实践&am…

js获取cookie获取不到问题 vue获取cookie以及获取不到问题

1.下载依赖包 npm i js-cookie -S2.在使用cookie的页面上进行引入 import Cookies from js-cookie3.使用 创建一个在整个网站上有效的CookieCookies.set(name, value);创建一个从现在起7天后过期的cookie&#xff0c;在整个站点上有效&#xff1a;Cookies.set(name, value, …

smarty二维foreach示例[顺代一维数组],再次加强版

2019独角兽企业重金招聘Python工程师标准>>> smarty二维foreach示例[顺代一维数组],再次加强版 WEB2.0 root 2009-4-9 10:46 评论(0) 阅读(682) 大 | 中 | 小 WEB2.0 | 评论(0) | 引用(0) | 阅读(682) view plain print ? {foreach itemrec from$result…

url的特殊字符编码 encodeURI编码

参考&#xff1a; 编码解码 前沿&#xff1a; 例如上传资源视频图片&#xff0c;针对一些特殊的字符&#xff01;#&#xffe5;%……&*&#xff08;&#xff09;&#xff1f;《{[,./’~ 不做转码的时候url识别会错&#xff0c;图片就不会显示出来&#xff0c;这时候就需要对…

Linux设备驱动之Kobject、Kset

LDD3中说&#xff0c;Kobject的作用为&#xff1a;1、sysfs 表述&#xff1a;在 sysfs 中出现的每个对象都对应一个 kobject, 它和内核交互来创建它的可见表述。2、热插拔事件处理 &#xff1a;kobject 子系统将产生的热插拔事件通知用户空间。 3、数据结构关联&#xff1a;…

图片不显示问题 图片url监测改变问题

问题&#xff1a;点击按钮换一换的时候&#xff0c;后台返回的三张小图片的地址还是原来的地址&#xff0c;但是三张小图确实是变了&#xff1b;这时候如果一开始头图是图3&#xff0c;点击换一换后&#xff0c;三张小图变了&#xff0c;此时还是想选择图3为头图&#xff1b;却…

限定虚拟机可用的CPU利用率

Windows Server 2012姗姗来迟&#xff0c;最新的Hyper-V 3给我们带来更多的惊喜&#xff0c;后续三篇博文和大家共同学习虚拟机CPU竞争机制。 第一部分&#xff1a;分配给虚拟机的CPU资源 第二部分&#xff1a;限定虚拟机可用的CPU利用率 第三部分&#xff1a;争夺CPU资源优先级…

Windows 7 文件夹共享

今天搞了下windows 7下的文件共享&#xff0c;总是搞不定&#xff0c;虽然以前也偶尔有成功过&#xff0c;但未作记录&#xff0c;现在要搞一时搞不定&#xff0c;所以决定好好记录一下。 win7的文件夹共享搞得实在是太麻烦了(对于一般用户而言)&#xff0c;为了权限控制&#…

1.the linux device model--kobject kset学习笔记

http://blog.chinaunix.net/uid-22547469-id-4590385.html?utm_sourcejiancool Linux设备模型就是一栋规模宏大的建筑&#xff0c;为了构建它&#xff0c;需要基本的建筑材料钢筋&#xff1a;kobject、若干钢筋组成的钢架结构&#xff1a;kset&#xff0c;还需要一种机制sysfs…

微信公众号开发笔记1-获取Access Token

获取你的Access Token a&#xff09;可以采用网址的形式&#xff1a; 用appid和appsecert获得access token&#xff0c;接口为https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&appid你的APPID&secret你的APPSECRET 替换中间的你的APPID和APPSEC…

ant更改主题色报错Inline JavaScript is not enabled. Is it set in your options? vue ant主题色更改 vue-cli3

问题&#xff1a;使用vue-cli3更改ant的主题色时候报错&#xff1a;Inline JavaScript is not enabled. Is it set in your options? 原因&#xff1a;我的问题是less-loader依赖包的版本为5.0.0&#xff0c;而官方要求必须是6.0.0&#xff1b; ERROR Failed to compile …

ant中table表格的多选框如何清空

项目需求&#xff1a;表格前加一列多选框&#xff0c;可以做多选和提交&#xff0c;还可以在提交后、重置或者翻页后对多选框清空 使用的组件是ant中下的可操作选择的table&#xff1b;这样我们就知道复选框选中的那些数据id&#xff0c;其实就是selectedRowKeys数组里的id&am…