1

我正在尝试了解 uboot 的二级生成文件(此生成文件位于子目录中)

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)

====================================Makefile============== =====

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

#########################################################################
4

1 回答 1

1

a)$(COBJS:.o=.c)对每个元素执行后缀替换COBJ ,在这种情况下相当于使用SRCS := test.S test_main.c

b)$(call cmd_link_o_target, $(OBJS))是一种在 make中创建参数函数的方法。它将采用表达式 for cmd_link_o_target(包含在包含的文件中)并将每次出现的 替换为$(1)进一步$(OBJS)扩展。

c)是的,它确实(obj也包含在 Makefile 包含的文件中)。

=如果您想知道,和:=赋值之间的区别是=允许递归替换,:=而是静态的,即只扩展一次,而不创建对其他变量的引用。

于 2013-09-17T02:17:59.877 回答