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操作系统的内核源文件目录。

时间: 2024-10-01 04:39:51

Contiki 2.7 Makefile 文件(四)的相关文章

Contiki 2.7 Makefile 文件(三)

2.第二部分 这里的usage,targets,savetarget,savedefines都是伪目标. 和all不同,这些伪目标不会被执行,除非显式指定这些目标. 这里有两个目标savetarget,savedefines前边我们提过. 通过命令 make TARGET=esb savetarget可以保存默认的TARGET到Makefile.target中. 通过命令 make TARGET=esb DEFINES=MYTRACE,MYVALUE=4711 savedefines 可以保存默

Contiki 2.7 Makefile 文件(二)

二.Makefile.include 1.第一部分 (1) ifndef CONTIKI ${error CONTIKI not defined! You must specify where Contiki resides} endif 含义: 如果没有定义CONTIKI变量,make停止运行. 并产生一个致命的错误信息,CONTIKI not  defined! You must specify where Contiki resides. hello-world这个例子在主控Makefil

Contiki 2.7 Makefile 文件(一)

一.主控Makefile 这里以hello-world例子为主线,从其工程Makefile开始,解析整个build过程. (1)CONTIKI_PROJECT = hello-world 定义变量CONTIKI_PROJECT为 hello-world (2)all:  $(CONTIKI_PROJECT) all是第一个目标,也就是默认目标,其为伪目标,依赖于CONTIKI_PROJECT变量定义的文件. 由于默认目标的特性是,总是被执行(除非显式定义了目标),但由于all是伪目标,只是一个标

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

Contiki Makefile.include 笔记 约定:  makefile 包括Makefile.Makefile.xxx,并不单指Makefile 不对makefile的语法进行分析,仅仅关注几个需要点. 首先要说明,Makefile.include是被用户的工程目录下的"Makefile"      include之,这个是必须要做的. Makefile.include 从上到下,顺序检索. 关注点一: 最开始,编译系统会检查用户是否定义了 contiki 源码根目录.检查

Makefile文件(四)_书写命令

变量说明: [email protected]       --->      目标文件 $^       --->       所有的依赖文件 $<       --->       第一个依赖文件 一.显示命令 @echo 正在编译xx模块...... 当make执行时,会输出"正在编译xx模块......",但不会输出命令 echo 正在编译xx模块...... make将输出:echo 正在编译xx模块......  正在编译xx模块...... 说明:

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

序言: 前面一节课讲解了Makefile的基础知识包括原理.预定义以及命令格式,这样是可以完成一个自动编译的文件,这些知识可以帮你完成.想想mak真是强大啊,可能有些同志发现了如果项目文件太多每个目标文件都要写指令有没有其它的简化来加快开发速度,提高项目的可维护性,答案当然是有的,这就是接下来的要讲解的I?n?f?e?r?e?n?c?e? ?R?u?l?e?s?(?推?导?规?则?),有了这个推导规则是的make更强大. 原理: I?n?f?e?r?e?n?c?e? ?R?u?l?e?s?(?推

自己动手写CPU之第四阶段(4)——Makefile文件建立

将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第14篇,我尽量每周四篇 4.4.6 编写Makefile文件 为了得到指令存储器初始化文件,我们需要输入4条命令,有点麻烦,最好只输入一条命令就可以了,这需要使用到Makefile文件.在汇编程序inst_rom.S所在目录下新建一个Document,文件名为Makefile,内容如下. ifndef CROSS_COMPILE CROSS_COMPILE = mips-sde-elf- endif CC = $(CROSS_CO

从头开始写项目Makefile(四):伪目标

[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] 一般情况下,Makefile都会有一个clean目标,用于清除编译过程中产生的二进制文件.我们在第一节的Makefile就用到了这个 clean目标,该目标没有任何依赖文件,并且该目标对应的命令执行后不会生产clean文件. 像这种特点目标,它的规则所定义的命令不是去创建文件,而仅仅通过make指定目标来执行一些特定系统命令或其依赖为目标的规则(如all),称为

Makefile文件(三)_书写规则

Makefile书写规则包含两部分,一个是依赖关系,一个是生成目标.在Makefile中,规则的顺序很重要,因为Makefile中只有一个最终目标.一般,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终目标.如果第一条规则中的目标有多个,那么第一个目标会成为最终目标,也就是make所完成的目标. 一.规则举例 foo.o:foo.c defs.h  #foo模块 cc -c -g foo.c 这个规则告诉我们:文件的依赖关系,还有如果要生成或更新foo.o文件,则