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 X和iOS操作環境的作業系統部份。
(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互换。