uboot的顶层config.mk cmd_link_o_target解析
以下是uboot的顶层config.mk# If the list of objects to link is empty, just create an empty built-in.o
cmd_link_o_target = $(if $(strip $1),\ $(LD) -r -o $@ $1 ,\
rm -f $@; $(AR) rcs $@ )
调用如下:
include $(TOPDIR)/config.mk
LIB = $(obj)lib$(BOARD).a
COBJS-y := smdk6410.o
SOBJS := lowlevel_init.o
SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
OBJS := $(addprefix $(obj),$(COBJS-y))
SOBJS := $(addprefix $(obj),$(SOBJS))
$(LIB): $(obj).depend $(SOBJS) $(OBJS)
$(call cmd_link_o_target, $(SOBJS) $(OBJS))
#cmd_link_o_target = $(if $(strip $1),\
# $(LD) $(LDFLAGS) -r -o $@ $1,\
# rm -f $@; $(AR) rcs $@ )
clean:
rm -f $(SOBJS) $(OBJS)
distclean: clean
rm -f $(LIB) core *.bak $(obj).depend
#########################################################################
# defines $(obj).depend target
include $(SRCTREE)/rules.mk
sinclude $(obj).depend
#########################################################################
在新版的uboot是有调用的,我们分析下在board/sumsung/smdk6410文件夹下的makefile如上。
cmd_link_o_target在make时当然会运行,要不干吗用。
$@就是$(obj)lib$(BOARD).a
$(strip $1),个人觉得应改为$(strip $1) && $(strip $2) 这个在连接时把COBJS-y := smdk6410.o
SOBJS := lowlevel_init.o 都连接进去。
$(AR) rcs $@ 生成静态库文件
rm -f $@;如果删掉的话,还生成个鸟啊。搞不明白这个。。。
各位大侠有何高见 怎么没有人讨论呢 mark,正在看u-boot,稍后分析此段。 本帖最后由 shushi0123 于 2013-5-12 22:20 编辑
rm -f $@;如果删掉的话,还生成个鸟啊。搞不明白这个。。。
$(if $(strip $1),\ $(LD) -r -o $@ $1 ,\
rm -f $@; $(AR) rcs $@ )
if函数有三个参数,一个是判断表达式,第二个是执行代码,第三个是执行代码。如果第一个表达式不为空就执行第二个执行代码否则就执行第三个代码。上面的代码$(strip $1)不为空,就执行$(LD) -r -o $@ $1 ,否则就执行rm -f $@删除lib.o。还有你说的
$(strip $1),个人觉得应改为$(strip $1) && $(strip $2) 这个在连接时把COBJS-y := smdk6410.o
$(strip $1)中的$1不是$(SOBJS) 而是$(SOBJS) $(OBJS))其展开就是lowlevel_init.o smdk6410.o,$(call cmd_link_o_target, $(SOBJS) $(OBJS))这句call函数表达式条件中参数$(SOBJS) $(OBJS))是$(1)而不是$(SOBJS),$(OBJS)而作为两个参数$(1),$(2)传递。
页:
[1]