我正在尝试了解uboot的第二级makefile(此makefile位于子目录中)
a) What is the difference between $(COBJS:.o=.c) and COBJS := test_main.o
b) What is the meaning of $(call cmd_link_o_target, $(OBJS)). What is the cmd_link_o_target and what is the call statement doing
c) Does this line creating 2 targets ?
ALL := $(obj).depend $(LIB)
===================================生成文件=========== ======
include $(TOPDIR)/config.mk
LIB = $(obj)libtest.o
SOBJS := test.o
COBJS := test_main.o
COBJS += diagnostic.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
OBJS := $(addprefix $(obj),$(COBJS) $(SOBJS))
ALL := $(obj).depend $(LIB)
all: $(ALL)
$(LIB): $(OBJS)
$(call cmd_link_o_target, $(OBJS))
#########################################################################
# defines $(obj).depend target
include $(SRCTREE)/rules.mk
sinclude $(obj).depend
#########################################################################
答案 0 :(得分:1)
a)$(COBJS:.o=.c)
对COBJ
的每个元素执行后缀替换,在这种情况下相当于使用SRCS := test.S test_main.c
b)$(call cmd_link_o_target, $(OBJS))
是一种在make中创建参数函数的方法。它将采用cmd_link_o_target
(包含在包含的文件中)的表达式,并将$(1)
的每一次出现替换为$(OBJS)
进一步扩展。
c)是的,它确实(obj
也包含在Makefile包含的文件中。)
如果您想知道,=
和:=
分配之间的区别在于=
允许递归替换,而:=
是 static ,即只扩展一次,而不创建对其他变量的引用。