5、第五部分

ifndef CONTIKI
$(error CONTIKI not defined! You must specify where CONTIKI resides!)
endif ifeq ($(HOST_OS),Darwin)
AROPTS = rc
endif ifeq ($(UIP_CONF_IPV6),1)
CFLAGS += -DWITH_UIP6=1
endif CONTIKI_TARGET_DIRS = . dev ctk
CONTIKI_TARGET_MAIN = ${addprefix $(OBJECTDIR)/,contiki-main.o} CONTIKI_TARGET_SOURCEFILES = contiki-main.c clock.c leds.c leds-arch.c \
button-sensor.c pir-sensor.c vib-sensor.c xmem.c \
sensors.c irq.c cfs-posix.c cfs-posix-dir.c ctk-curses.c ifeq ($(HOST_OS),Windows)
CONTIKI_TARGET_SOURCEFILES += wpcap-drv.c wpcap.c
TARGET_LIBFILES = /lib/w32api/libws2_32.a /lib/w32api/libiphlpapi.a
else
CONTIKI_TARGET_SOURCEFILES += tapdev-drv.c
#math
ifneq ($(UIP_CONF_IPV6),1)
CONTIKI_TARGET_SOURCEFILES += tapdev.c
else
CONTIKI_TARGET_SOURCEFILES += tapdev6.c
endif
endif CONTIKI_SOURCEFILES += $(CTK) ctk-conio.c $(CONTIKI_TARGET_SOURCEFILES) .SUFFIXES: ### Define the CPU directory
CONTIKI_CPU=$(CONTIKI)/cpu/native
include $(CONTIKI)/cpu/native/Makefile.native ifeq ($(HOST_OS),Windows)
CFLAGS += -I/usr/include/ncurses
endif CURSES_LIBS ?= -lncurses TARGET_LIBFILES += $(CURSES_LIBS)

(1)

ifndef CONTIKI
$(error CONTIKI not defined! You must specify where CONTIKI resides!)
endif

保证CONTIKI变量有定义

(2)

ifeq ($(HOST_OS),Darwin)
AROPTS = rc
endif

如果是在Darwin操作系统上,定义变量AROPTS。

没用这个操作系统,不理。

注:Darwin是由蘋果公司於2000年所釋出的一個開放原始碼作業系統。Darwin是Mac OS XiOS操作環境的作業系統部份。

(3)

ifeq ($(UIP_CONF_IPV6),1)
CFLAGS += -DWITH_UIP6=1
endif

如果变量UIP_CONF_IPV6为1

设置CFLAGS参数,追加,DWITH_UIP=1,这是编译参数,暂时不知有什么用。

(4)

CONTIKI_TARGET_DIRS = . dev ctk
CONTIKI_TARGET_MAIN = ${addprefix $(OBJECTDIR)/,contiki-main.o}

设置CONTIKI_TARGET_DIRS变量为. dev ctk,看/platform/native目录下的内容就理解了

设置CONTIKI_TARGET_MAIN为$(OBJECTDIR)/contiki-main.o

$(OBJECTDIR)之前设置为obj_native。

(5)

CONTIKI_TARGET_SOURCEFILES = contiki-main.c clock.c leds.c leds-arch.c \
button-sensor.c pir-sensor.c vib-sensor.c xmem.c \
sensors.c irq.c cfs-posix.c cfs-posix-dir.c ctk-curses.c

contiki-main.c clock.c leds-arch.c button-sensor.c pir-sensor.c vib-sensor.c xmem.c irq.c ctk-curse.c在platform/native目录下可以找到

leds.c在core/dev目录下

cfs-posix.c cfs-posix-dir.c在core/cfs目录下

sensors.c 找不到,先不理。

(6)

ifeq ($(HOST_OS),Windows)
CONTIKI_TARGET_SOURCEFILES += wpcap-drv.c wpcap.c
TARGET_LIBFILES = /lib/w32api/libws2_32.a /lib/w32api/libiphlpapi.a
else
CONTIKI_TARGET_SOURCEFILES += tapdev-drv.c
#math
ifneq ($(UIP_CONF_IPV6),1)
CONTIKI_TARGET_SOURCEFILES += tapdev.c
else
CONTIKI_TARGET_SOURCEFILES += tapdev6.c
endif
endif

这段是包含跟网络相关的源文件。

如果实在windows系统下的话,包含wpcap-drv.c wpcap.c文件到CONTIKI_TARGET_SOURCEFILES

包含/lib/w32api/libws2_32.a /lib/w32api/libiphlpapi.a库到TARGET_LIBFILES,在cygwin环境下是有这两个库文件的。

如果不是windows系统,包含tapdev-drv.c文件,至于包含tapdev.c还是tapdev6.c文件,看UIP_CONF_IPV6的值。

(7)

CONTIKI_SOURCEFILES += $(CTK) ctk-conio.c $(CONTIKI_TARGET_SOURCEFILES)

CTK在前边定义为ctk.c

这里把ctk.c ctk-conio.c 和TARGET_SOURCEFILES加入到CONTIKI_SOURCEFILES中。

(8)

.SUFFIXES:

SUFFIXE被用来定义默认的后缀列表

可以用.SUFFIXES来改变后缀列表,如删除后缀列表,加入后缀列表

.SUFFIXES: .hack .win  把后缀.hack和.win加入后缀列表中的末尾

.SUFFIXES:       删除默认的后缀(make的参数-r或-no-builtin-rules也会使默认的后缀列表为空)

所以这句话就是把默认的后缀列表删除。

隐含规则:

许多的隐含规则都是使用了“后缀规则”来定义的,只要隐含规则中有“后缀列表”(.SUFFIXES的依赖目标不为空),那么后缀隐含规则就会生效。

后缀规则有双后缀单后缀

双后缀: .c.o 相当于  %o : %c 。

单后缀: .c 相当于 % : %.c 。

后缀规则必须有命令,否则没有意义。

举例如下:

.c.o:
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<

模式规则:

也可以用模式规则来定义一个隐含规则。

模式规则中,至少在规则的目标定义中要包含%,否则就是一般的规则。

目标中的%定义表示对文件名的匹配,%表示长度任意的非空字符串。

%.o : %.c ; <command ......>;

上述语句中,目标中的%决定了依赖目标中的%

可以重新构造和内建隐含规则不同的命令

%.o : %.c
$(CC) -c $(CPPFLAGS) $(CFLAGS) -D$(date)

可以取消内建的隐含规则

%.o : %.s

(9)

### Define the CPU directory
CONTIKI_CPU=$(CONTIKI)/cpu/native
include $(CONTIKI)/cpu/native/Makefile.native

导入cpu的makefile文件

(10)

ifeq ($(HOST_OS),Windows)
CFLAGS += -I/usr/include/ncurses
endif

如果在Windows系统下,CFLAGS追加-I/usr/include/ncurses

-I参数指定头文件目录

至于ncurses目录下有什么?先不理

(11)

CURSES_LIBS ?= -lncurses

如果CURSES_LIBS变量没有被定义过,那么定义CURSES_LIBS为-Incurses

-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名。

这个库用来干嘛?先不理

(12)

TARGET_LIBFILES += $(CURSES_LIBS)

TARGET_LIBFILES追加$(CURSES_LIBS)

即加上CURSES_LIBS库到库文件

注:

curses 的命名是来自一个叫做 “cursor optimization”(光标最优化)的双关语(译者注:curses本身有诅咒的意思)。curses构成了一个工作在底层终端代码之上的封装,并 向用户提供了一个灵活高效的API(Application Programming Interface 应用程序接口)。它提供了移动光标,建立窗口,产生颜色,处理鼠标操作等功能。使程序员编写应用程序不需要关心那些底层的终端操作。

ncurses是最早的System V Release 4.0 (SVr4)中 CURSES的一个克隆。这是一个可自由配置的库,完全兼容旧版本的curses。简而言之,它是一个管理应用程序在字符终端显示的函数库。当后面提到 curses的时候,同时也可以和NCURSES互换。

05-26 21:06