写在最前面:本博客不算是原创博客,在查看了crystal736 关于contiki2.6之Makefile
的详细解读系列博客之后,对于此部分内容有一定的理解,结合自己的理解对相关的知
识进行整理归纳。另外本文分析的是Contiki-sensinode分支,因为实验是关于contiki在
cc2530平台下的udp-ipv6实验,这个实验在contiki2.7的源代码中的栈空间的管理存在一
定的问题,实验过程中server节点一直处于复位重启的状态。
对于contiki的makefile的分析主要包括两个方面的内容:
- Makefile文件的相互包含关系
- 目标文件生成的相互依赖关系
【Makefile文件的相互包含关系】
在contiki源码中有很多工程,在example目录里面,每一个目录对应一个工程,比如cc2530dk目录中就对应的是cc2530平台的工程,记住有makefile文件的当前目录才是工程目录。在工程目录下的Makefile自然就是我们在工程目录下执行make命令最起始的文件。
DEFINES+=PROJECT_CONF_H=\"project-conf.h\"
HAVE_BANKING=1
UIP_CONF_IPV6=1
UIP_CONF_RPL=1
PROJECT_SOURCEFILES += ping6.c
CONTIKI_PROJECT = client server
all: $(CONTIKI_PROJECT)
CONTIKI = ../../..
include $(CONTIKI)/Makefile.include
此Makefile文件的内容如上所述。可以看到Makefile中包含了根目录下的Makefile.include的文件.
Makefile.include文件中可能存在的Makefile文件包含有:
- include Makefile.target(TARGET变量未定义时包含 && Makefile.target的路劲存在于工程目录下)
- include Makefile.$(TARGET).defines (变量DEFINES未定义时包含 &&Makefile.$(TARGET).defines存在于工程目录下)
- include $(CONTIKI)/core/net/rime/Makefile.rime
- include $(CONTIKI)/core/net/mac/Makefile.mac
- include $(CONTIKI)/core/net/rpl/Makefile.rpl (定义UIP_CONF_IPV6 且 UIP_CONF_RPL 不为 0 )
- -include $(APPINCLUDES)
- include $(target_makefile)
- -include ${addprefix $(OBJECTDIR)/,$(CONTIKI_SOURCEFILES:.c=.d) \
$(PROJECT_SOURCEFILES:.c=.d)}
【6】
### Include application makefiles
ifdef APPS
APPDIRS += ${wildcard ${addprefix $(CONTIKI)/apps/, $(APPS)} \
${addprefix $(CONTIKI)/platform/$(TARGET)/apps/, $(APPS)} \
$(APPS)}
APPINCLUDES = ${foreach APP, $(APPS), ${wildcard ${foreach DIR, $(APPDIRS), $(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
如果定义了APPS,则包含,没有就不包含,在cc2530中我们没有定义这个变量,所以就不包含应用程序目录中的文件。那么在其他的平台如sky中的某一个工程,会定义APPS,此时定义APPDIRS变量。假如APPS 为telnet (apps目录中的某一个目录文件),则用wildcard函数找出与此APPS相关的一些目录列表,wilcard后面的参数代表是的是一种模式,它是在当前目录中搜索符合这种模式的文件,并返回这种模式的文件名列表。注意这里在当前目录中搜索,包括目录的子目录,子目录的子目录等。
【7】
target_makefile := $(wildcard $(CONTIKI)/platform/$(TARGET)/Makefile.$(TARGET)
-include ${addprefix $(OBJECTDIR)/,$(CONTIKI_SOURCEFILES:.c=.d) \
$(PROJECT_SOURCEFILES:.c=.d)}
endif
MAKECMDGOALS为make的环境变量,它会存放你所指定的终极目标的列表。那么上面几句表示如果执行的命令不是make clean 则包含include指定的makefile文件,这些文件是什么呢?obj_cc2530dk/....中以.d为后缀的文件
上面分析结束后,我们makefile的文件包含便分析到了根目录下的makefile.include. 其中第【7】Makefile.cc2530dk项还存在子包含,其他项不存在。
Makefile.cc2530dk中定义了一系列于目标板CC2530相关的一些变量,并在其结尾处:
CONTIKI_CPU=$(CONTIKI)/cpu/cc253x
include $(CONTIKI_CPU)/Makefile.cc253x
包含了$(CONTIKI)/cpu/cc253x路径下的Makefile.cc253x文件
Makefile.cc253x文件中仅存在一个makefile的包含关系
include $(CONTIKI_CPU)/usb/Makefile.usb