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文件的目录
定义LOWERCASE和UPPERCASE变量,分别存放字母的小写,大些。
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
定义CTK和CTKVNC等变量。这是跟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操作系统的内核源文件目录。