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=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。

时间: 2024-10-11 09:42:34

Contiki 2.7 Makefile 文件(二)的相关文章

Contiki 2.7 Makefile 文件(四)

3.第三部分 这里我们假设TARGET为native (1) OBJECTDIR = obj_$(TARGET) LOWERCASE = -abcdefghijklmnopqrstuvwxyz UPPERCASE = _ABCDEFGHIJKLMNOPQRSTUVWXYZ TARGET_UPPERCASE := ${strip ${shell echo $(TARGET) | sed y!$(LOWERCASE)!$(UPPERCASE)!}} CFLAGS += -DCONTIKI=1 -DC

Contiki 2.7 Makefile 文件(三)

2.第二部分 这里的usage,targets,savetarget,savedefines都是伪目标. 和all不同,这些伪目标不会被执行,除非显式指定这些目标. 这里有两个目标savetarget,savedefines前边我们提过. 通过命令 make TARGET=esb savetarget可以保存默认的TARGET到Makefile.target中. 通过命令 make TARGET=esb DEFINES=MYTRACE,MYVALUE=4711 savedefines 可以保存默

Contiki 2.7 Makefile 文件(一)

一.主控Makefile 这里以hello-world例子为主线,从其工程Makefile开始,解析整个build过程. (1)CONTIKI_PROJECT = hello-world 定义变量CONTIKI_PROJECT为 hello-world (2)all:  $(CONTIKI_PROJECT) all是第一个目标,也就是默认目标,其为伪目标,依赖于CONTIKI_PROJECT变量定义的文件. 由于默认目标的特性是,总是被执行(除非显式定义了目标),但由于all是伪目标,只是一个标

Makefile文件(二)_总述

Makefile总述 一.Makefile里面有什么 Makefile主要包含了五个东西:显示规则.隐晦规则.变量定义.文件指示和注释. 显示规则:明显指出要生成的文件,文件的依赖文件,生成的命令 隐晦规则:make具有自动推导功能,隐晦规则可以比较粗糙地简略书写Makefile 变量定义:如一中的objects 文件指示:一个Makefile中引用另一个Makefile:根据某些情况指定Makefile中的有效部分:定义一个多行的命定 注释:'#',文件中使用该符号可以利用转义符号'/#' 注

linux中make命令的简单使用以及Makefile文件的书写

Makefile 会不会写makele,从一个侧面说明了一个是否具备完成大型工程的能力. 一个工程中的源件不计数,其按类型.功能.模块分别放在若干个目录中,makele定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makele就像一个Shell脚本一样,其中也可以执行操作系统的命令.makele带来的好处就是"自动化编译",一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率. ma

Makefile文件编写和autotools的使用

在Linux或Unix环境下,对于只含有几个源代码文件的小程序(如hello.c)的编译,可以手工键入gcc命令对源代码文件逐个进行编译:然而在大型的项目开发中,可能涉及几十到几百个源文件,采用手工键入的方式进行编译,则非常不方便,而且一旦修改了源代码,尤其头文件发生了的修改,采用手工方式进行编译和维护的工作量相当大,而且容易出错.所以在Linux或Unix环境下,人们通常利用GNU make工具来自动完成应用程序的维护和编译工作.实际上,GNU make工具通过一个称为Makefile的文件来

Makefile文件(三)_书写规则

Makefile书写规则包含两部分,一个是依赖关系,一个是生成目标.在Makefile中,规则的顺序很重要,因为Makefile中只有一个最终目标.一般,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终目标.如果第一条规则中的目标有多个,那么第一个目标会成为最终目标,也就是make所完成的目标. 一.规则举例 foo.o:foo.c defs.h  #foo模块 cc -c -g foo.c 这个规则告诉我们:文件的依赖关系,还有如果要生成或更新foo.o文件,则

工程管理之makefile与自动创建makefile文件过程

(风雪之隅 http://www.laruence.com/2009/11/18/1154.html) Linux Makefile自动编译和链接使用的环境 想知道到Linux Makefile系统的真相么,想知道Linux Makefile系统中藏有的内在奥义么,只有我来给大家全面讲解介绍Linux Makefile系统作为Linux下的程序开发人员,大家一定都遇到过Linux Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Linux Mak

linux中Makefile文件相关内容

第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,makefile还是要懂.这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力.因为,makefile关系到了整个