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文件的目录
定义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操作系统的内核源文件目录。
Contiki 2.7 Makefile 文件(四)的更多相关文章
- Contiki 2.7 Makefile 文件(五)
4.第四部分 (1) oname = ${patsubst %.c,%.o,${patsubst %.S,%.o,$(1)}} 自定义函数,$(1)表示调用oname这个函数的第一个参数,patsub ...
- Contiki 2.7 Makefile 文件(六)
5.第五部分 ifndef CONTIKI $(error CONTIKI not defined! You must specify where CONTIKI resides!) endif if ...
- Contiki 2.7 Makefile 文件(三)
2.第二部分 这里的usage,targets,savetarget,savedefines都是伪目标. 和all不同,这些伪目标不会被执行,除非显式指定这些目标. 这里有两个目标savetarget ...
- Contiki 2.7 Makefile 文件(二)
二.Makefile.include 1.第一部分 (1) ifndef CONTIKI ${error CONTIKI not defined! You must specify where Con ...
- Contiki 2.7 Makefile 文件(一)
一.主控Makefile 这里以hello-world例子为主线,从其工程Makefile开始,解析整个build过程.
- contiki Makefile.include 四个关注点<contiki学习之二>
Contiki Makefile.include 笔记 约定: makefile 包括Makefile.Makefile.xxx,并不单指Makefile 不对makefile的语法进行分析,仅仅关 ...
- Makefile第四讲:include 引用其它makefile文件
main.cpp #include "classes/fun.h" int main() { Test::display("Hello makefile"); ...
- 第四课 Makefile文件的制作(下)
1序言: 前面一节课讲解了Makefile的基础知识包括原理.预定义以及命令格式,这样是可以完成一个自动编译的文件,这些知识可以帮你完成.想想mak真是强大啊,可能有些同志发现了如果项目文件太多每个目 ...
- 利用 autoconf 和 automake 生成 Makefile 文件
一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.M ...
随机推荐
- 在cmd窗口输入命令遇到You must run this command from a command prompt with administrator privilege怎么办?
点开始菜单,找到Accessories(附件),找到Command Prompt窗口,点右键,选“run as administrator”(以管理员身份运行),之后再执行先前的命令就好了. 2017 ...
- Redis的安装和环境的搭建并设置服务(Redis学习笔记一)
由于Redis在win上安装实在是太过于麻烦.我们选择把redis安装部署在linux上,然后远程连接. 安装Redis (1)cd /usr/src 进入下载目录 (1) yum install - ...
- lnmp环境网页访问慢排查思路
1.首先看每个服务器的负载情况 2.若各个服务器负载不高 首先查看是不是负载均衡服务器问题相接访问web服务看是否慢,若也慢则查看是不是访问动态页面慢,创建一个静态页面访问试试,若不慢则是动态页面问题 ...
- struts2类型转换+校验
1.action中validate()与validateXxx() 用于action执行前的校验,如果校验失败,跳到input视图, 前者校验整个Action: 后者校验该Action中的Xxx方法. ...
- U盘启动盘恢复为普通盘
U盘启动盘恢复为普通盘 此操作必须借助软件完成. 所用软件:diskgenius 下载地址: https://pan.baidu.com/s/1geDkK7L 密码: 8888 先将u盘中文件拷贝 ...
- Shiro学习(7)与Web整合
Shiro提供了与Web集成的支持,其通过一个ShiroFilter入口来拦截须要安全控制的URL.然后进行对应的控制,ShiroFilter相似于如Strut2/SpringMVC这样的web框架的 ...
- 【经验】使用Profiler工具分析内存占用情况
Unity3D为我们提供了一个强大的性能分析工具Profiler.今天我们就使用Profiler来具体分析一下官方样例AngryBots的内存使用信息数据. 首先打开Profiler选择Memory选 ...
- 【转载】ASP.Net请求处理机制初步探索之旅 - Part 3 管道
开篇:上一篇我们了解了一个ASP.Net页面请求的核心处理入口,它经历了三个重要的入口,分别是:ISAPIRuntime.ProcessRequest().HttpRuntime.ProcessReq ...
- Laravel 5.4的本地化
简介 Laravel 的本地化功能提供方便的方法来获取多语言的字符串,让你的网站可以简单的支持多语言. 语言包存放在 resources/lang 目录下的文件里.在此目录中应该有应用对应支持的语言并 ...
- 在dev目录创建一个字符设备驱动的流程
1.struct file_operations 字符设备文件接口 1: static int mpu_open(struct inode *inode, struct file *file) 2: ...
