首页 > 代码库 > 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 文件(二)