首页 > 代码库 > Contiki 2.7 Makefile 文件(二)
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这个例子在主控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=http://www.mamicode.com/4711
还可以保存默认的DEFINES到Makefile.$(TARGET).DEFINES中:make TARGET=esb DEFINES=MYTRACE,MYVALUE=http://www.mamicode.com/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。
Contiki 2.7 Makefile 文件(二)