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 文件(四)的更多相关文章

  1. Contiki 2.7 Makefile 文件(五)

    4.第四部分 (1) oname = ${patsubst %.c,%.o,${patsubst %.S,%.o,$(1)}} 自定义函数,$(1)表示调用oname这个函数的第一个参数,patsub ...

  2. Contiki 2.7 Makefile 文件(六)

    5.第五部分 ifndef CONTIKI $(error CONTIKI not defined! You must specify where CONTIKI resides!) endif if ...

  3. Contiki 2.7 Makefile 文件(三)

    2.第二部分 这里的usage,targets,savetarget,savedefines都是伪目标. 和all不同,这些伪目标不会被执行,除非显式指定这些目标. 这里有两个目标savetarget ...

  4. Contiki 2.7 Makefile 文件(二)

    二.Makefile.include 1.第一部分 (1) ifndef CONTIKI ${error CONTIKI not defined! You must specify where Con ...

  5. Contiki 2.7 Makefile 文件(一)

    一.主控Makefile 这里以hello-world例子为主线,从其工程Makefile开始,解析整个build过程.

  6. contiki Makefile.include 四个关注点<contiki学习之二>

    Contiki Makefile.include 笔记 约定:  makefile 包括Makefile.Makefile.xxx,并不单指Makefile 不对makefile的语法进行分析,仅仅关 ...

  7. Makefile第四讲:include 引用其它makefile文件

    main.cpp #include "classes/fun.h" int main() { Test::display("Hello makefile"); ...

  8. 第四课 Makefile文件的制作(下)

    1序言: 前面一节课讲解了Makefile的基础知识包括原理.预定义以及命令格式,这样是可以完成一个自动编译的文件,这些知识可以帮你完成.想想mak真是强大啊,可能有些同志发现了如果项目文件太多每个目 ...

  9. 利用 autoconf 和 automake 生成 Makefile 文件

    一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.M ...

随机推荐

  1. 获取类路径中含有beans.xml的jar包名称

    获取类路径中含有beans.xml的jar包名称 package com.stono; import java.io.File; import java.io.IOException; import ...

  2. 【React Native开发】React Native控件之DrawerLayoutAndroid抽屉导航切换组件解说(13)

    ),请不要反复加群! 欢迎各位大牛,React Native技术爱好者增加交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送! 该DrawerLayoutAndroid组件封 ...

  3. oracle恢复已经删除的数据

    insert into tablerestore select * from tablerestore as of timestamp to_Date('2014-8-8 15:00:00','yyy ...

  4. php 导出CSV抽象类

    php 导出CSV抽象类,依据总记录数与每批次记录数,计算总批次.循环导出.避免内存不足的问题. ExportCSV.class.php <? php /** php Export CSV ab ...

  5. smokeping插件使用及说明

    smokeping七大组件:general(普通设置) .alerts(警报设置).Datebase(数据库参数).presentation(网络自定义).slaves(从smokeping定义).t ...

  6. Microsoft-office 常见问题

    1.工作表写入保护,忘记密码,解决办法: 流程如下: 1打开文件2工具---宏----录制新宏---输入名字如:aa3停止录制(这样得到一个空宏)4工具---宏----宏,选aa,点编辑按钮5删除窗口 ...

  7. 【WPF学习笔记】之如何传递第一个登录界面的值到下一个页面显示:动画系列之(三)

    ... ... 承接系列(二) 在之前的登录后台已设置发送到主界面: 在主界面接收传递的值: using System; using System.Collections.Generic; using ...

  8. 手动删除引用nuget如何还原

    1.不小心从项目的引用中删除了nuget安装的程序集; 2.从其他地方复制的packages.config到当前项目; 这两种情况 在解决方案中是无法通过还原nuget来还原程序集的,可以通过以下的方 ...

  9. Drcom账户管理Server端解说

    https://www.github.com/xiyouMc 首先今天要讲的是针对Drcom查询账户URL的解析和抓取数据.    Drcom是大学生宿舍上网普遍使用的联网client,然而对于自己账 ...

  10. iOS界面-仿网易新闻左侧抽屉式交互 续(添加新闻内容页和评论页手势)

     本文转载至  http://blog.csdn.net/totogo2010/article/details/8637430       1.介绍 有的博友看了上篇博文iOS界面-仿网易新闻左侧抽屉 ...