之前学习了mkconfig这个脚本,它主要是解析生成下面config.h、config.mk。mk文件主要是arch、cpu、soc等信息,config下面主要是包含了一些重要信息:
#define CONFIG_BOARDDIR board/$BOARDDIR
#include <config_cmd_defaults.h>
#include <config_defaults.h>
#include <configs/${CONFIG_NAME}.h>
#include <asm/config.h>
第一个是单板的位置信息,第二和第三都是系统默认信息 ,然后是configs下面的config信息,这个就是单板的配置信息,另外就是asm下config信息。这个asm是个软链接,链接到${SRCTREE}/arch/${arch}/include/asm 这个配置是跟处理器相关的配置信息。另外我们注意到这里:$(obj)include/autoconf.mk: $(obj)include/config.h
@$(XECHO) Generating $@ ; \
set -e ; \
: Extract the config macros ; \
$(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dM include/common.h | \
sed -n -f tools/scripts/define2mk.sed > $@.tmp && \
mv $@.tmp $@
昨天分析了下配置的生成是在这里面完成的,但是好像这里并没有直接使用之前mkconfig生成的那个config.h,而是包含了include/common.h。进去common.h里面发现已经包含了那个config.h。这样我们间接地包含了config.h。接下来就是这个宏是怎么产生的? 这里使用了一个gcc的技巧,也就是只做预处理并不完成整个编译动作。这里使用了-dM这个选项。但是我在实验的时候这个还不好用,需要再加一个-E选项。加了这些选项之后,编译的时候告诉编译器只做预处理,并且把相关的宏定义输出来,在这里把宏定义输出到了sed脚本中。这里有一点疑问,上面的动作是发生在源代码的include目录下的。如果输出obj目录没有指定的话这个是不会有问题的。但是如果obj目录跟源代码目录不一致,那么common.h在编译的时候怎么包含config.h这个文件?在obj的include目录下是没有configs以及config_defaults.h、conf_cmd_default.h,是不是就是说只能在源码的下面进行编译?
通过上述分析发现,配置相关的文件只有两个地方:一个是跟arch相关的,一般都不要管理,如果不是自己新增arch的话;另外一个就是源代码include下面configs的单板配置信息.h文件。单板的配置信息都在这个文件里面定义,平时改的基本上是这个文件。在uboot看来只有这几个文件了,实际上可能比这个还要复杂点,但不管怎么样,可以通过在单板配置文件里面通过include 别的配置文件来实现。具体例子实现例子可以参考amcc_common.h的做法,实现重复利用的目的。