一、首先分析三个在Makefile中定义的变量:
(1)OBJTREE:就是编译输出.o文件的根目录,在默认编译下就是当前的目录,就是主makefile存在的目录
如果是用O=xxx编译的 那么OBJTREE就是指定的输出目录xxx
(2)SRCTREE:源码目录,就是源代码的根目录,也就是当前目录。在默认情况下OBJTREE = SRCTREE,
在O=xxx指定输出目录的编译下就是各自为各自Makefile中定义这两个变量,其实就是为了记录编译后的.o文件往哪里放,
就是为了实现O=xxx的这种编译方式的。
(3)MKCONFIG:Makefile中定义的一个变量(在这里定义,在后面使用),它的值就是我们源码根目录下面的mkconfig。(如图)
这个mkconfig是一个脚本,这个脚本就是uboot配置阶段的配置脚本。
二、接下来我们来看Makefile导出的5个环境变量:ARCH,CPU,BOARD,VENDOR,SOC.的作用及config.mk
(1)先说说config.mk怎么来的?在哪里?
config.mk早uboot的源码是没有的是在执行make NAME_config或者make O=xxx NAME_config的时候产生的,执行完
make NAME_config或者make O=xxx NAME_config会在对应的目录下的include目录下生成。比如我使用的是默认的编译则会
在makefile根目录下include目录下产生,如图:
(2)我们说说ARCH,CPU,BOARD,VENDOR,SOC是怎么被定义赋值的?为什么不在makefile中直接赋值定义。
之所以不直接给出这5个环境变量的值,是因为我们希望这5个值是可以被人很容易的、集中的配置的。怎么被定义的呢:
你在命令行执行make NAME_config或者make O=xxx NAME_config的时候,makefile会索引到目标NAME_config上进行
对ARCH,CPU,BOARD,VENDOR,SOC赋值,并写入include/config.mk下,如图,makefile下的目标为:
所以输入 命令行下make x210_sd_config会在include/下生成config.mk文件,文件内容如下:
如果我们要更改这里的某个配置值要到目标NAME_config那里调用MKCONFIG脚本传参时的参数。
三、我们说说ARCH CROSS_COMPILE变量(使用哪种编译链来编译)
makefile里面支持很多类型的架构的交叉编译 ARM PPC MIPS NIOS等我们在上面的config.mk很明显的看出ARCH = arm
(1)CROSS_COMPILE是被ARCH所确定的,只要配置了ARCH=arm,那么我们就只能在ARM的那个分支去设置CROSS_COMPILE的值。
这个设置值只要能保证找到那个交叉编译工具链即可,不一定非得是全路径的,相对路径也可以。(如果已经将工具链导出到环境变量,
并且设置了符号链接,这样CROSS_COMPILE = arm-linux-就可以)如图:
(2)实际运用时,我们可以在Makefile中去更改设置CROSS_COMPILE的值,也可以在编译时用make CROSS_COMPILE=xxxx来设置,
而且编译时传参的方法可以覆盖Makefile里面的设置。直接在命令行下输入make CROSS_COMPILE=xxxx来赋值。如图: