分类: LINUX
2012-12-06 15:39:47
顶层目录下-分析--mkconfig.txt 顶层目录下分析--config - 副本.txt Makefile-分析.txt uboot 官方学习文档
=> help setenv setenv - set environment variables Usage: setenv name value ... - set environment variable 'name' to 'value ...' setenv name - delete environment variable 'name' =>
To modify the U-Boot environment you have to use the setenv command. When called with exactly one argument, it will delete any variable of that name from U-Boot's environment, if such a variable exists. Any storage occupied for such a variable will be automatically reclaimed:
=> setenv foo This is an example value. => printenv foo foo=This is an example value. => setenv foo => printenv foo ## Error: "foo" not defined =>U_BOOT_CMD_COMPLETE(
setenv, CONFIG_SYS_MAXARGS, 0, do_env_set,
"set environment variables",
"name value ...\n"
" - set environment variable 'name' to 'value ...'\n"
"setenv name\n"
" - delete environment variable 'name'",
var_complete
);do_env_set()
如果uboot代码里面实现了saveenv,那么在setenv后,可以用saveenv去将所有的变量都存储起来。具体存到哪里,要根据是uboot中的定义决定。比如
#define CONFIG_ENV_IS_IN_SPI_FLASH 就是定义成存储环境变量到SPI Flash里面。
#ifdef CONFIG_SPI_BOOT
#define CONFIG_ENV_OVERWRITE
#define CONFIG_ENV_IS_IN_SPI_FLASH
#define CONFIG_CMD_SAVEENV
#define CONFIG_ENV_SECT_SIZE 0x10000
#define CONFIG_ENV_OFFSET 0x1f0000
#elif defined CONFIG_NAND_BOOT
#define CONFIG_ENV_IS_IN_AML_NAND
#define CONFIG_CMD_SAVEENV
#define CONFIG_ENV_OVERWRITE
#define CONFIG_ENV_OFFSET 0x400000
#define CONFIG_ENV_BLOCK_NUM 2
#elif defined CONFIG_MMC_BOOT
#define CONFIG_ENV_IS_IN_MMC
#define CONFIG_CMD_SAVEENV
#define CONFIG_SYS_MMC_ENV_DEV 0
#define CONFIG_ENV_OFFSET 0x1000000
#else
#define CONFIG_ENV_IS_NOWHERE 1
#endif
common/Makefile
# environment
COBJS-y += env_common.o
COBJS-$(CONFIG_ENV_IS_IN_DATAFLASH) += env_dataflash.o
COBJS-$(CONFIG_ENV_IS_IN_EEPROM) += env_eeprom.o
XCOBJS-$(CONFIG_ENV_IS_EMBEDDED) += env_embedded.o
COBJS-$(CONFIG_ENV_IS_IN_EEPROM) += env_embedded.o
XCOBJS-$(CONFIG_ENV_IS_IN_FLASH) += env_embedded.o
COBJS-$(CONFIG_ENV_IS_IN_NVRAM) += env_embedded.o
COBJS-$(CONFIG_ENV_IS_IN_FLASH) += env_flash.o
COBJS-$(CONFIG_ENV_IS_IN_MG_DISK) += env_mgdisk.o
COBJS-$(CONFIG_ENV_IS_IN_MMC) += env_mmc.o
COBJS-$(CONFIG_ENV_IS_IN_NAND) += env_nand.o
COBJS-$(CONFIG_ENV_IS_IN_AML_NAND) += env_amlnand.o
COBJS-$(CONFIG_ENV_IS_IN_NVRAM) += env_nvram.o
COBJS-$(CONFIG_ENV_IS_IN_ONENAND) += env_onenand.o
COBJS-$(CONFIG_ENV_IS_IN_SPI_FLASH) += env_sf.o
COBJS-$(CONFIG_ENV_IS_NOWHERE) += env_nowhere.o
COBJS-$(CONFIG_ENV_IS_IN_EMMC) += env_emmc.o
# command
m6tv_ref_v1.h
里定义哪个CONFIG就编译哪个文件.
####################################################################################
Makefile:
$(obj)u-boot: depend $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds
$(GEN_UBOOT)
先看depend这个依赖对象。
# Explicitly make _depend in subdirs containing multiple targets to prevent
# parallel sub-makes creating .depend files simultaneously.
depend dep: $(TIMESTAMP_FILE) $(VERSION_FILE) $(obj)include/autoconf.mk
for dir in $(SUBDIRS) $(CPUDIR) $(dir $(LDSCRIPT)) ; do \
$(MAKE) -C $$dir _depend ; done
这里根据注释信息可以看出是循环进入子目录去make。但是我有一个知识点不清楚depend dep作为目标,应该是指2个等效的目标把,我要做一下实验 make depend 和make dep是否效果一致,并且验证一下distclean的作用。见下图1
至于进入了哪些目录,我可以用echo打印出来看看。见下图
另外还有一个知识点_depend最后生成的文件名称就变成了.depend吗?另外-C是什么意思,我要查一下,make后出来的文件内容是什么呢?我要进入目录去搜索一下生成的.depend文件。见下图
==========================================================
make的-C参数说明
-C dir
Change to directory dir before reading the makefiles or doing anything else. If multiple -C options are specified, each is interpreted relative to the previous one: -C / -C etc is equivalent to -C /etc. This is typically used with recursive invocations of make.
于是到make手册只去看查到如下内容。
make的递归执行
make的递归调用指的是:在Makefile中使用“make”作为一个命令来执行本身或者其它makefile文件。递归调用在一个村在有多级子目录的项目中非常有用。例如,当前目录下存在一个“subdir”子目录,这个子目录中有描述这个目录编译规则的makefile文件,在执行make时需要从上层目录(当前目录)开始并完成它所有子目录的编译。那么在当前目录下可以使用这样一个规则来实现对它的子目录的编译:
subsystem:
cd subdir && $(MAKE)
其等价于规则:
subsystem:
$(MAKE) -C subdir
第一个规则命令的意思是:进入子目录,然后在子目录下执行make。第二个规则时用了make的“-C”选项,同样是首先进入子目录而后再执行make。
=======================================================
那么我现在理解make -C 目录名 格式的出现就是进入子目录编译的意思。确实.depend中的内容就是一些子目录。实验证明,我的理解都是正确的。
$(OBJS): depend
$(MAKE) -C $(CPUDIR) $(if $(REMOTE_BUILD),$@,$(notdir $@))
$(LIBS): depend $(SUBDIRS)
$(MAKE) -C $(dir $(subst $(obj),,$@))
$(LIBBOARD): depend $(LIBS)
$(MAKE) -C $(dir $(subst $(obj),,$@))
$(SUBDIRS): depend
$(MAKE) -C $@ all
是编译上一层次的目录中的文件。
最后$(GEN_UBOOT)命令就可以连接所有的.o文件。生成目标文件u-boot.
其他的语言貌似可以忽略了。再接下来就是很多xx_config的列表
再后面就是clean,我就不仔细研究了,接着看到了一个clobber目标,它比clean目标删除的还要多。
我发现了这一条 @rm -f $(obj)include/asm/proc $(obj)include/asm/arch $(obj)include/asm,也就是把我之前研究的make smdk2410_config生成的软连接文件也删除掉了。但是删除的还是不全啊!我记得make unconfig还要删除其它生成的文件,于是再往下看
ifeq ($(OBJTREE),$(SRCTREE))
mrproper \
distclean: clobber unconfig
else
mrproper \
distclean: clobber unconfig
rm -rf $(obj)*
endif
原来还有一个命令make mrproper是最强大的删除或者用make disclean因为它同时等于执行了make unconfig及make clobber.呵呵!u-boot的Makefile地图文件算是分析及验证完成了。再接着就要开始研究u-boot的代码了,虽然代码之前研究过一点,这次的前提是结合makefile再进行一下代码的深入理解。为之后修改模块及添加模块,移植做准备