Contiki 2.7 Makefile 文件(五)

4、第四部分

 (1)

oname = ${patsubst %.c,%.o,${patsubst %.S,%.o,$(1)}}

自定义函数,$(1)表示调用oname这个函数的第一个参数,patsubst是make内置函数,即模式字符串替换函数。

oname函数实现的功能是:

  将第一个参数中符合%.s模式的替换成%.o

  再继续将上述结果中符合%.c模式的替换成%.o

  也就是把所有 .s 和 .c文件名替换成 .o文件名

  这个函数的功能就是计算源文件名(c源文件,汇编源文件)所相对应的目标文件名(经过编译汇编后的文件)。

 

CONTIKI_OBJECTFILES = ${addprefix $(OBJECTDIR)/,${call oname, $(CONTIKI_SOURCEFILES)}}

PROJECT_OBJECTFILES = ${addprefix $(OBJECTDIR)/,${call oname, $(PROJECT_SOURCEFILES)}}

定义CONTIKI_OBJECTFILES变量

  首先用oname函数,将CONTIKI_SOURCEFILES所对应的源文件名,改为目标文件名,如process.c将会变为process.o

  再在文件名前边加上前缀$(OBJECTDIR)/,前边我们知道这个变量为obj_native,故process.c会变为obj_native/process.o

  这个变量应该是代表即将生成的Contiki操作系统目标文件名

 

定义PROJECT_OBJECTFILES变量

  功能同上

  这个变量应该是代表即将生成的项目中目标文件名

  PROJECT_SOURCEFILES这个变量为空,所以PROJECT_OBJECTFILES也为空。

 

# Provide way to create $(OBJECTDIR) if it has been removed by make clean
$(OBJECTDIR):
    mkdir $@

$@是自动化变量,表示规则中的目标文件集。我们知道OBJECTDIR为obj_native,所以$@为obj_native。

mkdir $@生成obj_native目录。

但是这个依赖关系链,怎么会涉及到obj_native的?

调试了一下:

在生成CONTIKI_OBJECTFILES所代表的文件时,目录不存在,会先找依赖关系生成目录,再生成具体文件。

所以mkdir obj_native会被执行。

 (2)

ifdef APPS
  APPDS = ${wildcard ${foreach DIR, $(APPDIRS), ${addprefix $(DIR)/, $(APPS)}}} \
             ${wildcard ${addprefix $(CONTIKI)/apps/, $(APPS)} \
             ${addprefix $(CONTIKI)/platform/$(TARGET)/apps/, $(APPS)} \
             $(APPS)}
  APPINCLUDES = ${foreach APP, $(APPS), ${wildcard ${foreach DIR, $(APPDS), $(DIR)/Makefile.$(APP)}}}
  -include $(APPINCLUDES)
  APP_SOURCES = ${foreach APP, $(APPS), $($(APP)_src)}
  DSC_SOURCES = ${foreach APP, $(APPS), $($(APP)_dsc)}
  CONTIKI_SOURCEFILES += $(APP_SOURCES) $(DSC_SOURCES)
endif

 The project's makefile can also define in the APPS variable a list of applications from the apps/ directory that should be included in the Contiki system.

hello-world这个例子没有定义APPS变量,故这段不会执行。

我们假设定义了APPS变量,其值为APPS += antelope unit-test

 

相关知识点:

wildcard函数: 返回所有符合pattern的文件名,以空格隔开

$(wildcard pattern)

The argument pattern is a file name pattern, typically containing wildcard
characters (as in shell file name patterns). The result of wildcard is a
space-separated list of the names of existing files that match the pattern.

 

foreach函数:

The syntax of the foreach function is:
$(foreach var,list,text)
The first two arguments, var and list, are expanded before anything else is done; note that
the last argument, text, is not expanded at the same time. Then for each word of the
expanded value of list, the variable named by the expanded value of var is set to that word,
and text is expanded. Presumably text contains references to that variable, so its expansion
will be different each time.
The result is that text is expanded as many times as there are whitespace-separated
words in list. The multiple expansions of text are concatenated, with spaces between them,
to make the result of foreach.

每次从list中取出一个词(空格分隔),赋给var变量,然后text(一般有var变量)被拓展开来。

只要list中还有空格分隔符就会一直循环下去,每一次text返回的结果都会以空格分隔开。

 

${wildcard ${foreach DIR, $(APPDIRS), ${addprefix $(DIR)/, $(APPS)}}}

先分析${foreach DIR, $(APPDIRS), ${addprefix $(DIR)/, $(APPS)}}

其中DIR是变量(var)$(APPDIRS)列表(list),这个例子中没有定义APPDIRS这个变量,估计是用于定义除了$CONTIKI/apps/之外的apps目录。

${addprefix $(DIR)/, $(APPS)}是text。我们假设定义了APPDIRS为a b。

那么第一次:DIR 会被赋值为a,${addprefix $(DIR)/, $(APPS)},又我们假定APPS为antelope unit-test,所以最终会被拓展为a/antelope  a/unit-test。

     DIR 会被赋值为b,${addprefix $(DIR)/, $(APPS)}又我们假定APPS为antelope unit-test所以最终会被拓展为b/antelope  b/unit-test

最终这两次结果会以空格分隔开,即a/antelope  a/unit-test b/antelope  b/unit-test

${wildcard a/antelope  a/unit-test b/antelope  b/unit-test} 返回空,因为找不到符合这样的目录。

所以最终这句语句,实现的功能是,返回$APPDIRS目录中,所有符合$APPS的目录。

 

${wildcard ${addprefix $(CONTIKI)/apps/, $(APPS)}

这句语句返回$(CONTIKI)/apps/目录下所有符合$APPS的目录,即contiki-release-2-7/apps/antelope contiki-release-2-7/apps/unit-test

 

${addprefix $(CONTIKI)/platform/$(TARGET)/apps/, $(APPS)}

这句语句返回$(CONTIKI)/platform/$(TARGET)/apps/目录下所有$APPS的目录,即contiki-release-2-7/platform/native/apps/antelope contiki-release-2-7/platform/native/apps/unit-test。

在contiki-release-2-7/platform/native目录下,并没有apps目录,后边有差错处理机制

 

$(APPS)

在当前目录下的所有$APPS目录,即antelope unit-test。

在hello-world例子中,并没有这些目录。

 

所以APPDS变量是包含所有与$APPS有关的目录。

 

APPINCLUDES变量是所有需要导入的APP Makefile文件。

在所有APPDS目录下,所有Makefile.$(APPS)文件。

 

在我们的假设条件APPS = antelope unit-testAPPDIRS =

只会导入contiki-release-2-7/apps/antelope/Makefile.antelope contiki-release-2-7/apps/unit-test/Makefile.unit-test

其余的均不存在,所以在include指令前要有符号-,即出错继续执行后续指令。

 

contiki-release-2-7/apps/antelope/Makefile.antelope

分别定义了两个变量,antelope_src用于保存antelope这个app的src文件,antelope_dsc用于保存antelope这个app的dsc文件。

 

contiki-release-2-7/apps/unit-test/Makefile.unit-test

分别定义了两个变量,unit-test_src用于保存unit-test这个app的src文件,unit-tes_dsc用于保存unit-test这个app的dsc文件。

 

变量APP_SOURCES

  APP_SOURCES = ${foreach APP, $(APPS), $($(APP)_src)}

取出所有APPS中的src文件变量,这个例子是$(antelope_src) 和$(unit-test_src)

 

变量APP_SOURCES

  DSC_SOURCES = ${foreach APP, $(APPS), $($(APP)_dsc)}

取出所有APPS中的dsc文件变量,这个例子是$(antelope_dsc) 和$(unit-test_dsc)

 

  CONTIKI_SOURCEFILES += $(APP_SOURCES) $(DSC_SOURCES)

这段话的最终目的:

将$APPS相关的所有源文件添加进CONTIKI_SOURCEFILES变量中。

(3)

target_makefile := $(wildcard $(CONTIKI)/platform/$(TARGET)/Makefile.$(TARGET) ${foreach TDIR, $(TARGETDIRS), $(TDIR)/$(TARGET)/Makefile.$(TARGET)})

# Check if the target makefile exists, and create the object directory if necessary.
ifeq ($(strip $(target_makefile)),)
  ${error The target platform "$(TARGET)" does not exist (maybe it was misspelled?)}
else
  ifneq (1, ${words $(target_makefile)})
    ${error More than one TARGET Makefile found: $(target_makefile)}
  endif
  include $(target_makefile)
endif

这断代码主要做的就是,找到在所有TAGET目录下找到符合的Makefile.$(TARGET)文件,放到target_makefile变量中。

再检查是否存在或者重复。并做相应的错误提示信息。

${error The target platform "$(TARGET)" does not exist (maybe it was misspelled?)}

${error More than one TARGET Makefile found: $(target_makefile)}

 

我们这个例子中 TARGET = native 并且 TARGETDIRS为空

所以最后会导入$(CONTIKI)/platform/native/Makefile.native

 

接下去要开始分析target和cpu的makefile文件了。

 

转载于:https://www.cnblogs.com/songdechiu/p/6012718.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值