关于Makefile的一些问题

时间:2013-09-17 01:54:48

标签: c++ c linux makefile embedded

我正在尝试了解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

#########################################################################

1 个答案:

答案 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 ,即只扩展一次,而不创建对其他变量的引用。