首页 > 代码库 > Contiki 2.7 Makefile 文件(四)

Contiki 2.7 Makefile 文件(四)

技术分享

3、第三部分

这里我们假设TARGET为native

(1)

OBJECTDIR = obj_$(TARGET)

LOWERCASE = -abcdefghijklmnopqrstuvwxyz
UPPERCASE = _ABCDEFGHIJKLMNOPQRSTUVWXYZ
TARGET_UPPERCASE := ${strip ${shell echo $(TARGET) | sed y!$(LOWERCASE)!$(UPPERCASE)!}}
CFLAGS += -DCONTIKI=1 -DCONTIKI_TARGET_$(TARGET_UPPERCASE)=1

定义OBJECTDIR变量为obj_native,这个是存放object文件的目录

定义LOWERCASEUPPERCASE变量,分别存放字母的小写,大些。

TARGET_UPPERCASE看名字就知道,应该是将native转换为NATIVE,看怎么实现的。

echo $(TARGET)  这个命令输出TARGET变量的值,我们这里假定为native,故输出native。

| 是管道,连接上个指令的标准输出,做为下个指令的标准输入,即sed命令的输入是echo $(TARGET)的输出native。

sed命令:

 y/source/dest/
              Transliterate the characters in the pattern space which appear in source to the corresponding character in dest.

LOWERCASE和UPPERCASE所对应的位置,就是字母的小写和大写,所以native被转换成了NATIVE。

shell是make内置的函数,参数是Shell命令,将Shell命令的输出作为返回值,故这里的返回值为NATIVE。

strip是make内置的函数,返回去掉空格的字符串值。这里的NATIVE没有空格,故返回NATIVE。

CFLAGS追加 -DCONTIKI=1 -DCONTIKI_TARGET_NATIVE=1

 

(2)

include $(CONTIKI)/core/net/rime/Makefile.rime
include $(CONTIKI)/core/net/mac/Makefile.mac

 导入两个Makefile文件。

 

$(CONTIKI)/core/net/rime/Makefile.rime: 
ifeq ($(UIP_CONF_IPV6),1)
#RIME_UIP6      = rime-udp.c
RIME_BASE      = rimeaddr.c timesynch.c rimestats.c
else
RIME_CHAMELEON = chameleon.c channel.c chameleon-raw.c chameleon-bitopt.c
RIME_BASE      = rimeaddr.c rime.c timesynch.c                  rimestats.c announcement.c polite-announcement.c                  broadcast-announcement.c
RIME_SINGLEHOP = broadcast.c stbroadcast.c unicast.c stunicast.c                  runicast.c abc.c                  rucb.c polite.c ipolite.c
RIME_MULTIHOP  = netflood.c multihop.c rmh.c trickle.c
RIME_MESH      = mesh.c route.c route-discovery.c
RIME_COLLECT   = collect.c collect-neighbor.c neighbor-discovery.c          collect-link-estimate.c
RIME_RUDOLPH   = rudolph0.c rudolph1.c rudolph2.c
endif # UIP_CONF_IPV6

CONTIKI_SOURCEFILES += $(RIME_BASE)                $(RIME_SINGLEHOP)                $(RIME_MULTIHOP)                $(RIME_MESH)                $(RIME_COLLECT)                $(RIME_RUDOLPH)                $(RIME_CHAMELEON)                $(RIME_UIP6)

 

 这里根据UIP_CONF_IPV6的值来决定Rime模块中有哪些文件需要包含进CONTIKI_SOURCEFILES(源文件)。

这里的变量基本都可以从字面上的意思看得明白。

注:UIP_CONF_IPV6为1时,走ipv6。

 

 $(CONTIKI)/core/net/mac/Makefile.mac

CONTIKI_SOURCEFILES += cxmac.c xmac.c nullmac.c lpp.c frame802154.c sicslowmac.c nullrdc.c nullrdc-noframer.c mac.c
CONTIKI_SOURCEFILES += framer-nullmac.c framer-802154.c csma.c contikimac.c phase.c

 

包含Mac模块中所有源文件进 CONTIKI_SOURCEFILES(源文件)

(3)

SYSTEM  = process.c procinit.c autostart.c elfloader.c profile.c           timetable.c timetable-aggregate.c compower.c serial-line.c
THREADS = mt.c
LIBS    = memb.c mmem.c timer.c list.c etimer.c ctimer.c energest.c rtimer.c stimer.c trickle-timer.c           print-stats.c ifft.c crc16.c random.c checkpoint.c ringbuf.c settings.c
DEV     = nullradio.c

include $(CONTIKI)/core/net/Makefile.uip
include $(CONTIKI)/core/net/rpl/Makefile.rpl

CTK     = ctk.c
CTKVNC  = $(CTK) ctk-vncserver.c libconio.c vnc-server.c vnc-out.c ctk-vncfont.c

ifndef CONTIKI_NO_NET
  CONTIKIFILES = $(SYSTEM) $(LIBS) $(NET) $(THREADS) $(DHCP) $(DEV)
else
  CONTIKIFILES = $(SYSTEM) $(LIBS) $(THREADS) $(DEV) sicslowpan.c fakeuip.c
endif

CONTIKI_SOURCEFILES += $(CONTIKIFILES)

 

定义SYSTEM THREADS LIBS DEV等变量,这些都很容易理解,这是Contiki系统存储系统运行,多进程,库,设备等源文件的变量

导入$(CONTIKI)/core/net/Makefile.uip

NET =                        dhcpc.c                        hc.c                        nbr-table.c            netstack.c                    packetbuf.c                    packetqueue.c                    psock.c                        queuebuf.c                    resolv.c                    sicslowpan.c                    simple-udp.c                    tcpdump.c                    tcpip.c                        uaodv-rt.c                    uaodv.c                        uip-debug.c                    uip-ds6-route.c                    uip-ds6-nbr.c                uip-ds6.c                    uip-fw-drv.c                    uip-fw.c                    uip-icmp6.c                    uip-nd6.c                    uip-neighbor.c                    uip-over-mesh.c                    uip-packetqueue.c                uip-split.c                    uip-udp-packet.c                uip.c                        uip6.c                        uip_arp.c                    uiplib.c

 

定义uIP所需的源文件,并存放在NET变量中。

 

导入$(CONTIKI)/core/net/rpl/Makefile.rpl

CONTIKI_SOURCEFILES += rpl.c rpl-dag.c rpl-icmp6.c rpl-timers.c     rpl-mrhof.c rpl-ext-header.c

 

将rpl模块的源文件包含进 CONTIKI_SOURCEFILES(源文件)

 

CTK     = ctk.c
CTKVNC  = $(CTK) ctk-vncserver.c libconio.c vnc-server.c vnc-out.c ctk-vncfont.c

定义CTKCTKVNC等变量。这是跟GUI相关。

 

ifndef CONTIKI_NO_NET
  CONTIKIFILES = $(SYSTEM) $(LIBS) $(NET) $(THREADS) $(DHCP) $(DEV)
else
  CONTIKIFILES = $(SYSTEM) $(LIBS) $(THREADS) $(DEV) sicslowpan.c fakeuip.c
endif

 

根据是否定义了CONTIKI_NO_NET这个变量,来决定是否将NET变量中的源文件包含进CONTIKIFILES(源文件)。

即决定是否要包含uIP中的源文件。

 

CONTIKI_SOURCEFILES += $(CONTIKIFILES)

将上个步骤定义好的CONTIKIFILES变量的值添加到CONTIKI_SOURCEFILES(源文件)中去。

 

CONTIKIDIRS += ${addprefix $(CONTIKI)/core/,dev lib net net/mac net/rime                  net/rpl sys cfs ctk lib/ctk loader . }

定义Contiki操作系统,源文件目录。

addprefix为make的内置函数,即为后边的字符串添加$(CONTIKI)/core/。

最后为$(CONTIKI)/core/dev,  $(CONTIKI)/core/lib, $(CONTIKI)/core/net, $(CONTIKI)/core/net/mac, $(CONTIKI)/core/net/rime, $(CONTIKI)/core/net/rpl, $(CONTIKI)/core/sys, $(CONTIKI)/core/cfs, $(CONTIKI)/core/ctk, $(CONTIKI)/core/lib/ctk, $(CONTIKI)/core/loader, $(CONTIKI)/core/.

这些都是Contiki操作系统的内核源文件目录。

Contiki 2.7 Makefile 文件(四)