二、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这个例子在主控Makefile中就定义了CONTIKI变量,所以不会发生这个错误。
注:所以主控Makefile中一定要定义CONTIKI这个变量。
相关知识点:
其中error是一个控制make的函数,函数的调用语句是
$(<function> <arguments>)
函数名和参数名用空格分隔,参数之间用逗号,分隔。函数的返回值可以当做变量来使用,故上述语句将是函数的返回值。
所以${error CONTIKI not defined! You must specify where Contiki resides}语句
会使make停止运行,并返回一个错误信息CONTIKI not defined! You must specify where Contiki resides。
(2)
ifeq ($(TARGET),) -include Makefile.target ifeq ($(TARGET),) ${info TARGET not defined, using target ‘native‘} TARGET=native else ${info using saved target ‘$(TARGET)‘} endif endif
含义:
在Contiki build system中知道,make命令可以显式定义TARGET:make TARGET=esb
还可以保存默认的TARGET到Makefile.target中:make TARGET=esb savetarget
先判断TARGET变量是否为空,如果不为空,则跳过这一段语句。
如果TARGET为空,则TARGET变量没有显式定义(至少在这之前还没有定义),导入Makefile.target文件,看是否已经保存了默认的TARGET。
是的话(Makefile.target文件存在),则使用Makefile.target文件中默认的TARGET,并提示。
如果没有显式定义,又没有保存默认的TARGET到Makefile.target,那么设置TARGET=native,即本机,并提示。
注:include之前的符号-,加了这个符号之后,即使这条命令出错,make也会继续执行后续的命令。
因为这里Makefile.target可能不存在,但不能影响make继续执行,所以在include命令前添加了 -。
(3)
ifeq ($(DEFINES),) -include Makefile.$(TARGET).defines ifneq ($(DEFINES),) ${info using saved defines ‘$(DEFINES)‘} endif endif
含义:
在Contiki build system中知道,make命令可以显式定义DEFINES,为c预处理设定任意的变量:make TARGET=esb DEFINES=MYTRACE,MYVALUE=4711
还可以保存默认的DEFINES到Makefile.$(TARGET).DEFINES中:make TARGET=esb DEFINES=MYTRACE,MYVALUE=4711 savedefines
先判断DEFINES变量是否为空,如果不为空,则跳过这一段语句。
如果DEFINES为空,则DEFINES没有显式定义(至少在这之前还没有定义),导入Makefile.$(TARGET).DEFINES文件,看是否已经保存了默认的DEFINES。
如果已经保存了默认的DEFINES的话(Makefile.$(TARGET).DEFINES文件存在),则使用Makefile.$(TARGET).DEFINES文件中默认的DEFINES,并提示。
没有保存的话,则没有任何操作。
注:include之前的符号-,加了这个符号之后,即使这条命令出错,make也会继续执行后续的命令。
因为这里Makefile.$(TARGET).DEFINES可能不存在,但不能影响make继续执行,所以在include命令前添加了 -。
(4)
ifndef HOST_OS ifeq ($(OS),Windows_NT) ## TODO: detect more specific Windows set-ups, ## e.g. CygWin, MingW, VisualC, Watcom, Interix HOST_OS := Windows else HOST_OS := $(shell uname) endif endif
含义:
判断是否有定义HOST_OS变量,如果已经定义了这个变量,则跳过这段语句。
如果没有定义这个变量,判断OS变量的值。
如果OS为Windows_NT,即在Windows系统,设置HOST_OS为windows。
如果OS不为Windows_NT,即不是Windows系统,用shell uname命令获取当前操作系统的名字。
$(shell uname)获取返回值,即操作系统的名字,并赋值给HOST_OS变量。
shell是make内置的函数,shell的参数就是Shell的命令,shell函数将执行Shell命令后的输出作为函数的返回。
在Shell执行uname命令,输出Linux,故shell函数返回Linux。