makefile简要分析
所有这些目录的编译连接都是由顶层目录的makefile来确定的。
1.在makefile中有:
unconfig:
@rm -f $(obj)include/config.h $(obj)include/config.mk \
$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp
%是个通配符,make xxx_config都是这个目标.目标的依赖是unconfig,
unconfig的命令是删除一些文件,而这些文正是从make xxx_config过程中产生的.unconfig就是清理配置的.
MKCONFIG := $(SRCTREE)/mkconfig
100ask24x0_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
等同为 ./mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
[email protected]就是指目标
$(@:_config=)是变量的替换引用
格式为“$(VAR:A=B)”(或者“${VAR:A=B}”),意思是:替换变量“VAR”中所有“A”字符结尾的字为“B”结尾的字。
2.下面就是执行mkconfig脚本了
mkconfig文件:
./mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
$1 $2 $3 $4 $5 $6
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE := $(CURDIR)
CURDIR是Makefile中的一个特殊参数,表示当前目录。所以,此句含义是决定使用BUILD_DIR还是CURDIR.
[ "${BOARD_NAME}" ] || BOARD_NAME="$1" #BOARD_NAME=100ask24x0
$n 在linux脚本下为传入的参数第n个
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1 #目标参数小于4大于6退出
$# 参数的个数 -lt 小于 -gt 大于
echo "Configuring for ${BOARD_NAME} board..."
echo 打印
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
如果定义 BUILD_DIR 等于 BUILD_DIR 否者为CURDIR
cd ./include
rm -f asm
ln -s asm-$2 asm #ln -s asm-arm asm
删除原有asm建立一个链接文件 asm指向 asm-arm
rm -f asm-$2/arch # rm -f asm-arm/arch
if [ -z "$6" -o "$6" = "NULL" ] ;
如果$6为空或者等于null
ln -s ${LNPREFIX}arch-$6 asm-$2/arch # ln -s arch-s3c24x0 asm-100ask24x0/arch
删除原有arch建立一个链接文件 arch指向 arch-s3c24x0
rm -f asm-$2/proc # rm -f asm-arm/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc # ln -s proc-armv asm-arm/proc
删除原有proc建立一个链接文件 proc指向 proc-armv
#
# Create include file for Make
#
echo "ARCH = $2" > config.mk
echo "CPU = $3" >> config.mk
echo "BOARD = $4" >> config.mk
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
创建顶层Makefile包含的文件include/ config.mk
#
# Create board specific header file
#
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h
创建开发板有关的头文件include/config.h
内容为/* Automatically generated - do not edit */
#include <configs/100ask24x0.h>
现在总结回顾一下,配置命令 make smdk2410_config;实际执行 “./mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0”命令
假设执行“./mkconfig $1 $2 $3 $4 $5 $6 ”命令。则产生如下结果。
(1) 开发板名称BOARD_NAME等于$1.
(2)创建到平台、开发板相关文件的链接,如如下所示;
ln -s asm-$2 asm
ln -s ${LNPREFIX}arch-$6 asm-$2/arch
ln -s ${LNPREFIX}proc-armv asm-$2/proc
(3)创建顶层Makefile包含的文件include/config.mk,如下所示:
ARCH = arm
CPU =arm920t
BOARD = 100ask24x0
SOC = s3c24x0
(4)创建开发板相关头文件include /config.h,如下所示:
/* Automatically generated - do not edit */
#include <configs/100ask24x0.h>
顶层makefile先调用各子目录的makefile,生成目标文件或者目标文件库。
然后再连接所有目标文件(库)生成最终的u-boot.bin。
连接的主要目标(库)如下:
OBJS = cpu/$(CPU)/start.o
LIBS = lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a
ifdef SOC
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
LIBS += lib_$(ARCH)/lib$(ARCH).a
LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a /
fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a
LIBS += net/libnet.a
LIBS += disk/libdisk.a
LIBS += rtc/librtc.a
LIBS += dtt/libdtt.a
LIBS += drivers/libdrivers.a
LIBS += drivers/nand/libnand.a
LIBS += drivers/nand_legacy/libnand_legacy.a
LIBS += drivers/sk98lin/libsk98lin.a
LIBS += post/libpost.a post/cpu/libcpu.a
LIBS += common/libcommon.a
LIBS += $(BOARDLIBS)
显然跟平台相关的主要是:
cpu/$(CPU)/start.o
board/$(BOARDDIR)/lib$(BOARD).a
cpu/$(CPU)/lib$(CPU).a
cpu/$(CPU)/$(SOC)/lib$(SOC).a
lib_$(ARCH)/lib$(ARCH).a
这里面的四个变量定义在include/config.mk(见上述)。
其余的均与平台无关。
所以考虑移植的时候也主要考虑这几个目标文件(库)对应的目录。