[置顶] contiki2.6之Makefile详细解读三

     接着分析contiki系统的makefile。

    之前分析到Makefile.cc2530dk的这个地方

%.upload: %.hex
 $(PROG) -P $< 

这里这个PROG变量现在还不明确,-P为选项,$<为%.hex文件名

 

sensinode.serialdump:
 $(SERIALDUMP)

伪目标sensinode.serialdump为调试所用,它调用命令SERIALDUMP,这个变量所代表的的意思猜测应该是打开串口,向其中打印数据。

 

CONTIKI_CPU=$(CONTIKI)/cpu/cc253x
include $(CONTIKI_CPU)/Makefile.cc253x

这里定义CONTIKI_CPU为$(CONTIKI)/cpu/cc253x 然后读取该目录下面的Makefile.cc253x,这里先不展开,因为在上篇文章中只是打开Makefile.cc2530dk,但是make没有真正执行到里面。

 

回溯到Makefile.include文件中

 

# 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
  ifeq (${wildcard $(OBJECTDIR)},)
    DUMMY := ${shell mkdir $(OBJECTDIR)}
  endif
  ifneq (1, ${words $(target_makefile)})
    ${error More than one TARGET Makefile found: $(target_makefile)}
  endif
  include $(target_makefile)
endif

ifeq语句开始调用strip函数去掉变量target_makefile的多余空格,然后比较是否为空,有前面可知target_makefile的值为$(CONTIKI)/platform/cc2530dk/Makefile.cc2530dk,不为空,执行else语句

我们知道OBJECTDIR值为obj_cc2530dk,调用wildcard函数在当前目录中搜索匹配该值的文件名,此时该目录中还没有该文件,所以其值为空,执行ifeq下面一句,调用shell命令mkdir在当前文件夹下建立OBJECTDIR所代表的目录即obj_cc2530dk目录。然后将其值返回给DUMMY,那么这个值是什么呢? 如果命令执行成功就为0,如果不成功则返回非零,通过此值,我们可以知道此命令调用失败的原因。

继续下面ifneq的语句,它调用了words函数,此函数是统计后面字串中的单词个数,我们知道target_makefile为

$(CONTIKI)/platform/cc2530dk/Makefile.cc2530dk,那么它有多少单词呢?显然是1个了。

ifneq判断,两者相等则判断为假,不执行下面的语句。

最后包含此Makefile.cc2530dk,make去读取此文件中的内容,该文件的内容在上篇文章中已经分析了,固这里就不做解释了。继续往下

 

COMMA := ,
CFLAGS += ${addprefix -D,${subst $(COMMA), ,$(DEFINES)}}

定义逗号变量,再将DEFINES所代表的字串中逗号全部替换为空格,然后在每一个单词前加前缀-D表示定义该宏。在cc2530dk中没有DEFINES变量,那么这句相当于什么也不做。

 

CONTIKI_TARGET_DIRS_CONCAT = ${addprefix ${dir $(target_makefile)}, \
                               $(CONTIKI_TARGET_DIRS)}
CONTIKI_CPU_DIRS_CONCAT    = ${addprefix $(CONTIKI_CPU)/, \
                               $(CONTIKI_CPU_DIRS)}

第一句:先取target_makefile变量$(CONTIKI)/platform/cc2530dk/Makefile.cc2530dk文件的目录名即$(CONTIKI)/platform/cc2530dk/,注意最后一个斜杠别漏了。然后再将$(CONTIKI)/platform/cc2530dk/添加到CONTIKI_TARGET_DIRS变量的值前面,该值为多少呢?在Makefile.cc2530dk中表示的是.dev,是吗?

 

在上面我们包含了Makefile.cc2530dk,然后读取它,在该文件中的最后包含了Makefile.cc253x,也要读取它,只不过我前面没有分下,下面我们就分析一下这个文件的内容。此文件内容略多,不过我们先看其中部分

CC       = sdcc
LD       = sdcc
AS       = sdcc
AR       = sdcclib
OBJCOPY  = objcopy
STRIP    = strip

这写和编译相关的变量,我们编译链接并产生可执行文件所用的编译器为sdcc,该编译器的安装网上可以找到。

下面和编译器相关的变量这里就不提,用到的时候再提,

 

CLEAN += *.lnk *.lk *.sym *.lib *.ihx *.rel *.mem *.rst *.asm *.hex
CLEAN += *.omf *.cdb *.banks *.flags *.banked-hex
CLEAN += symbols.c symbols.h

定义CLEAN变量,此变量代表的是所有CPU所依赖的清除文件。我们用make clean的时候清楚所有这些文件。

 

CONTIKI_CPU_DIRS = . dev

定义变量CONTIKI_CPU_DIRS值为.  dev,注意这里是两个值,一个为表示当前目录,一个表示dev目录

 

CONTIKI_SOURCEFILES += soc.c clock.c
CONTIKI_SOURCEFILES += uart0.c uart1.c uart-intr.c
CONTIKI_SOURCEFILES += dma.c dma_intr.c
CONTIKI_SOURCEFILES += cc2530-rf.c
CONTIKI_SOURCEFILES += watchdog.c rtimer-arch.c
CONTIKI_ASMFILES +=

这里追加了当前工作目录中的一些源文件到CONTIKI_SOURCEFILES中。CONTIKI_ASMFILES为空。

 

CONTIKI_ASMOBJECTFILES = $(addprefix $(OBJECTDIR)/,$(CONTIKI_ASMFILES:.S=.rel))

这句意思很明显了,在obj_cc2530dk目录中添加相应的以.rel为后缀的目标文件,此地方设计到了makefile中变量的高级用法。$(CONTIKI_ASMFILES:.S=.rel))此变量表示CONTIKI_ASMFILES所表示的所有以.S结尾的文件名替换成以.rel为结尾的文件名,然后这个变量值就是替换后的文件名列表。

那么CONTIKI_ASMOBJECTFILES的值为obj_cc2530dk/*.S ......

 

CONTIKI_CASMOBJECTFILES = $(addprefix $(OBJECTDIR)/,  $(CONTIKI_CASMFILES:.cS=.rel))

这句和上面句意思一样,只不过后缀名换了!

 

CONTIKI_PLATFORM_DIRS = $(PLATFORM_APPDIRS) \
  $(addprefix $(CONTIKI)/platform/$(TARGET)/, $(CONTIKI_TARGET_DIRS))

定义CONTIKI_PLATFORM变量,经分析其值为$(CONTIKI)/platform/cc2530dk/.dev

 

CONTIKI_CPU_DIRS_LIST    = $(addprefix $(CONTIKI_CPU)/, $(CONTIKI_CPU_DIRS))

定义变量CONTIKI_CPU_DIRS_LIST值为$(CONTIKI)/cpu/cc253x/.dev

 

oname = $(patsubst %.c,%.rel,$(patsubst %.S,%.rel,$(1)))

自定义函数oname,在前面文章中已经分析了此函数的作用,这里就不赘余了!

 


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

调用上面自定义的函数,那么CONTIKI_OBJECTFILES的值就不言而喻了。这一句覆盖了在Makefile.include文件中

CONTIKI_OBJECTFILES = $(addprefix $(OBJECTDIR)/,  $(call oname, $(CONTIKI_SOURCEFILES))),因为CONTIKI_SOURCEFILE变量中添加了一些源文件。

 

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

同上!

 

接下来是一些编译的规则,我们暂且不看它。

 

回到刚开始的那个问题CONTIKI_TARGET_DIRS的变量值为.dev吗,经过上述并没有看到改变此变量的语句,显然它就是.dev。

 

  下篇就对后面的继续深入分析!

 

 

 

 

 

 

 

你可能感兴趣的:(makefile,CC2530,contiki2.6)