(转)autoconfig.mk文件的自动生成

autoconf.mk

uboot的顶层Makefile中有如下的一段代码

[plain] view plaincopy

  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 [email protected] ; \
  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 > [email protected]
  13. $(obj)include/autoconf.mk: $(obj)include/config.h
  14. @$(XECHO) Generating [email protected] ; \
  15. set -e ; \
  16. : Extract the config macros ; \
  17. $(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dM include/common.h | \
  18. sed -n -f tools/scripts/define2mk.sed > [email protected] && \
  19. mv [email protected] [email protected]

[plain] view plain copy

  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 [email protected] ; \
  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 > [email protected]
  13. $(obj)include/autoconf.mk: $(obj)include/config.h
  14. @$(XECHO) Generating [email protected] ; \
  15. set -e ; \
  16. : Extract the config macros ; \
  17. $(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dM include/common.h | \
  18. sed -n -f tools/scripts/define2mk.sed > [email protected] && \
  19. mv [email protected] [email protected]

先看第一个: $(obj)include/autoconf.mk.dep: $(obj)include/config.h include/common.h, 它表示autoconf.mk.dep依赖于config.h和common.h这两个文件.

  • @$(XECHO) Generating [email protected] ; \ 这句话会在编译阶段输出编译信息 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 > [email protected]
    • -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 [email protected] ; \ 这句话会在编译阶段输出编译信息Generating include/autoconf.mk
  • set -e; \ 同上
  • $(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dM include/common.h | sed -n -f tools/scripts/define2mk.sed > [email protected] && mv [email protected] [email protected]
    • -DDO_DEPS_ONLY: 同上
    • -dM : 作用是输出include/common.h中定义的所有宏
    • |      : shell中的管道, 表示将前面的结果传递给后面的命令
    • define2mk.sed : 查找和处理以“CONFIG_”开头的宏定义的功能, 将处理的结果输出到include/autoconf.mk.tmp
    • mv [email protected] [email protected] : 重命名为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

  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 plain copy

  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

  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 plain copy

  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

  1. # defines $(obj).depend target
  2. include $(SRCTREE)/rules.mk
  3. sinclude $(obj).depend

[plain] view plain copy

  1. # defines $(obj).depend target
  2. include $(SRCTREE)/rules.mk
  3. sinclude $(obj).depend

并没有看到_depend这个目标, 那make _depend在这个目录下如何执行呢? 来看看它include的rules.mk

[plain] view plaincopy

  1. _depend:    $(obj).depend
  2. # Split the source files into two camps: those in the current directory, and
  3. # those somewhere else. For the first camp we want to support CPPFLAGS_<fname>
  4. # and for the second we don‘t / can‘t.
  5. PWD_SRCS := $(filter $(notdir $(SRCS)),$(SRCS))
  6. OTHER_SRCS := $(filter-out $(notdir $(SRCS)),$(SRCS))
  7. # This is a list of dependency files to generate
  8. DEPS := $(basename $(patsubst %,$(obj).depend.%,$(PWD_SRCS)))
  9. # Join all the dependencies into a single file, in three parts
  10. #   1 .Concatenate all the generated depend files together
  11. #   2. Add in the deps from OTHER_SRCS which we couldn‘t process
  12. #   3. Add in the HOSTSRCS
  13. $(obj).depend:  $(src)Makefile $(TOPDIR)/config.mk $(DEPS) $(OTHER_SRCS) \
  14. $(HOSTSRCS)
  15. cat /dev/null $(DEPS) >[email protected]
  16. @for f in $(OTHER_SRCS); do \
  17. g=`basename $$f | sed -e ‘s/\(.*\)\.[[:alnum:]_]/\1.o/‘`; \
  18. $(CC) -M $(CPPFLAGS) -MQ $(obj) f >> [email protected] ; \
  19. done
  20. @for f in $(HOSTSRCS); do \
  21. g=`basename $$f | sed -e ‘s/\(.*\)\.[[:alnum:]_]/\1.o/‘`; \
  22. $(HOSTCC) -M $(HOSTCPPFLAGS) -MQ $(obj) f >> [email protected] ; \
  23. done
  24. MAKE_DEPEND = $(CC) -M $(CPPFLAGS) $(EXTRA_CPPFLAGS_DEP) \
  25. -MQ $(addsuffix .o,$(obj)$(basename $<)) $< >[email protected]
  26. $(obj).depend.%:    %.c
  27. $(MAKE_DEPEND)
  28. $(obj).depend.%:    %.S
  29. $(MAKE_DEPEND)
  30. $(HOSTOBJS): $(obj)%.o: %.c
  31. $(HOSTCC) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o [email protected] $< -c
  32. $(NOPEDOBJS): $(obj)%.o: %.c
  33. $(HOSTCC) $(HOSTCFLAGS_NOPED) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o [email protected] $< -c
  34. #########################################################################

[plain] view plain copy

  1. _depend:    $(obj).depend
  2. # Split the source files into two camps: those in the current directory, and
  3. # those somewhere else. For the first camp we want to support CPPFLAGS_<fname>
  4. # and for the second we don‘t / can‘t.
  5. PWD_SRCS := $(filter $(notdir $(SRCS)),$(SRCS))
  6. OTHER_SRCS := $(filter-out $(notdir $(SRCS)),$(SRCS))
  7. # This is a list of dependency files to generate
  8. DEPS := $(basename $(patsubst %,$(obj).depend.%,$(PWD_SRCS)))
  9. # Join all the dependencies into a single file, in three parts
  10. #   1 .Concatenate all the generated depend files together
  11. #   2. Add in the deps from OTHER_SRCS which we couldn‘t process
  12. #   3. Add in the HOSTSRCS
  13. $(obj).depend:  $(src)Makefile $(TOPDIR)/config.mk $(DEPS) $(OTHER_SRCS) \
  14. $(HOSTSRCS)
  15. cat /dev/null $(DEPS) >[email protected]
  16. @for f in $(OTHER_SRCS); do \
  17. g=`basename $$f | sed -e ‘s/\(.*\)\.[[:alnum:]_]/\1.o/‘`; \
  18. $(CC) -M $(CPPFLAGS) -MQ $(obj)

    f >> [email protected] ; \

  19. done
  20. @for f in $(HOSTSRCS); do \
  21. g=`basename $$f | sed -e ‘s/\(.*\)\.[[:alnum:]_]/\1.o/‘`; \
  22. $(HOSTCC) -M $(HOSTCPPFLAGS) -MQ $(obj)

    f >> [email protected] ; \

  23. done
  24. MAKE_DEPEND = $(CC) -M $(CPPFLAGS) $(EXTRA_CPPFLAGS_DEP) \
  25. -MQ $(addsuffix .o,$(obj)$(basename $<)) $< >[email protected]
  26. $(obj).depend.%:    %.c
  27. $(MAKE_DEPEND)
  28. $(obj).depend.%:    %.S
  29. $(MAKE_DEPEND)
  30. $(HOSTOBJS): $(obj)%.o: %.c
  31. $(HOSTCC) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o [email protected] $< -c
  32. $(NOPEDOBJS): $(obj)%.o: %.c
  33. $(HOSTCC) $(HOSTCFLAGS_NOPED) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o [email protected] $< -c
  34. #########################################################################

这里有_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

时间: 2024-10-17 09:27:06

(转)autoconfig.mk文件的自动生成的相关文章

上传文件时自动生成文件夹

#region 返回当前日期的文件夹 /// <summary>        ///上传文件时自动生成文件夹        /// </summary>        /// <param name="path">要保存的路径</param>        /// <returns>返回生成的文件夹</returns>        public static string CreateDis(string pa

sublime打开文件时自动生成并打开.dump文件

GBK Encoding Support 没有安装前打开ASNI格式编码文件会乱码,安装成功重启则可以打开正常 关于.dump文件生成的解释: 当打开一个非utf-8格式且包含汉字的文件时,sublime text 2会自动生成一个dump文件,文件修改过程中,不会修改原文件,只有按"保存"了才会将dump的数据更新到原文件里,关闭当前编辑的dump文件则会自动删除dump文件. 但是有时候 GBK Encoding Support 插件也会出些bug,就想这样,生成.dump文件后自

cocos2d-x 3.0 android mk文件 之 自动遍历*.cpp文件

还记得上一篇android mk 文件的写法吗?传送门, 我们需要手动去添加 cpp文件,如果cpp一多,那不是要累死? LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := cocos2dcpp_shared LOCAL_MODULE_FILENAME := libcocos2dcpp LOCAL_SRC_FILES := hellocpp/main.cpp ../../Classes/AppDelegate.cp

Eclipse中R文件不能自动生成

R文件不能自动生成主要是因为编译有错误,这时你想什么办法都是没有用的,clean, fix properties,都不是从根上解决问题. R文件主要是自动生成资源文件的id的,里边静态子类 主要都是对 res目录下的资源文件的引用 所以,只要是R文件不能自动生成或更新,主要是因为 编译的时候资源文件里有不合法的语法. 所以,遇到这种情况的话,不要去乱修改别的地方,一般会使问题变得更复杂. 解决方法: 1.如果console里有红色的编译不过的报错信息,直接定位到报错位置,修改错误OK! 2.首先

C++解析头文件-Qt自动生成信号声明

目录 一.瞎白话 二.背景 三.思路分析 四.代码讲解 1.类图 2.内存结构声明 3.QtHeaderDescription 4.私有函数讲解 五.分析结果 六.下载 一.瞎白话 时间过的ZTMK,距离上一篇文章已经小半年过去了.为了安家.装修和结婚,搞得自己焦头烂额,这不是也正好赶上过年,一直没有时间写篇文章,最近终于慢慢回归正轨,所以决定写下这一篇文章,记录工作中的一些经验和内容.对于写文章这件事,我是这么认为的:一个是回顾自己的工作内容:另一方面也是为了能让有同样需求的同学用于借鉴.同时

webstorm创建js文件时自动生成js注释

设置webstorm创建js文件时自动生成js注释 settings--Editor--File and Code Temlates 黑色框框里的内容自己填写上去,以下是参考的代码块: /** * @author ${USER} * @date ${DATE} ${TIME} */ 或者 /** * @author 张三 * @date ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE} */ 变量解释: ${USER}:当前系统登录的用户名 ${DATE}:当前

在WebStorm里配置watcher实现编辑less文件时自动生成.css文件

1.安装 nodejs     //查看nodejs版本  node -v //查看npm版本  npm -v //全局安装less  npm install -g less 2.配置webStrom 添加external Tools parameters是默认地址的话  直接点insert就行 (Progrem 自己的安装位置   F:\NODE\node.exe) (parameters:C:\Users\Administrator\AppData\Roaming\npm) 添加watche

Cocos2d-x中android.mk文件中cpp文件的自动生成

1.这段代码下载自子龙山人,虽然没看懂,应该是通用版的.https://gist.github.com/andyque/6060595 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := game_shared LOCAL_MODULE_FILENAME := libgame #traverse all the directory and subdirectory define walk $(wildcard $(

Android开发_*.R文件无法自动生成

问题描述:             今天是我决定专注Android开发的第一天,我在网上下载了一个数独游戏的源码,准备开始着手学习.在导入之后出现Java文件中import *.R文件报错,在gen目录下面没有找到R.java,于是自己创建了个,然后开始了寻找自动更新的方法. 问题解决:             在经过寻找后,最后发现是自己的项目中没有mainactivity.java.原因是项目的安装版本不同,我使用的是eclipse3.7.2加插件,因为版本比较低,不支持自定义自定义主界面,