4、第四部分

(1)

oname = ${patsubst %.c,%.o,${patsubst %.S,%.o,$(1)}}

自定义函数,$(1)表示调用oname这个函数的第一个参数,patsubst是make内置函数,即模式字符串替换函数。

oname函数实现的功能是:

  将第一个参数中符合%.s模式的替换成%.o

  再继续将上述结果中符合%.c模式的替换成%.o

  也就是把所有 .s 和 .c文件名替换成 .o文件名

  这个函数的功能就是计算源文件名(c源文件,汇编源文件)所相对应的目标文件名(经过编译汇编后的文件)。

CONTIKI_OBJECTFILES = ${addprefix $(OBJECTDIR)/,${call oname, $(CONTIKI_SOURCEFILES)}}PROJECT_OBJECTFILES = ${addprefix $(OBJECTDIR)/,${call oname, $(PROJECT_SOURCEFILES)}}

定义CONTIKI_OBJECTFILES变量

  首先用oname函数,将CONTIKI_SOURCEFILES所对应的源文件名,改为目标文件名,如process.c将会变为process.o

  再在文件名前边加上前缀$(OBJECTDIR)/,前边我们知道这个变量为obj_native,故process.c会变为obj_native/process.o

  这个变量应该是代表即将生成的Contiki操作系统目标文件名

定义PROJECT_OBJECTFILES变量

  功能同上

  这个变量应该是代表即将生成的项目中目标文件名

  PROJECT_SOURCEFILES这个变量为空,所以PROJECT_OBJECTFILES也为空。

# Provide way to create $(OBJECTDIR) if it has been removed by make clean
$(OBJECTDIR):mkdir $@

$@是自动化变量,表示规则中的目标文件集。我们知道OBJECTDIR为obj_native,所以$@为obj_native。

mkdir $@生成obj_native目录。

但是这个依赖关系链,怎么会涉及到obj_native的?

调试了一下:

在生成CONTIKI_OBJECTFILES所代表的文件时,目录不存在,会先找依赖关系生成目录,再生成具体文件。

所以mkdir obj_native会被执行。

(2)

ifdef APPSAPPDS = ${wildcard ${foreach DIR, $(APPDIRS), ${addprefix $(DIR)/, $(APPS)}}} \${wildcard ${addprefix $(CONTIKI)/apps/, $(APPS)} \${addprefix $(CONTIKI)/platform/$(TARGET)/apps/, $(APPS)} \$(APPS)}APPINCLUDES = ${foreach APP, $(APPS), ${wildcard ${foreach DIR, $(APPDS), $(DIR)/Makefile.$(APP)}}}-include $(APPINCLUDES)APP_SOURCES = ${foreach APP, $(APPS), $($(APP)_src)}DSC_SOURCES = ${foreach APP, $(APPS), $($(APP)_dsc)}CONTIKI_SOURCEFILES += $(APP_SOURCES) $(DSC_SOURCES)
endif

 The project's makefile can also define in the APPS variable a list of applications from the apps/ directory that should be included in the Contiki system.

hello-world这个例子没有定义APPS变量,故这段不会执行。

我们假设定义了APPS变量,其值为APPS += antelope unit-test

相关知识点:

wildcard函数: 返回所有符合pattern的文件名,以空格隔开

$(wildcard pattern)

The argument pattern is a file name pattern, typically containing wildcard
characters (as in shell file name patterns). The result of wildcard is a
space-separated list of the names of existing files that match the pattern.

foreach函数:

The syntax of the foreach function is:
$(foreach var,list,text)
The first two arguments, var and list, are expanded before anything else is done; note that
the last argument, text, is not expanded at the same time. Then for each word of the
expanded value of list, the variable named by the expanded value of var is set to that word,
and text is expanded. Presumably text contains references to that variable, so its expansion
will be different each time.
The result is that text is expanded as many times as there are whitespace-separated
words in list. The multiple expansions of text are concatenated, with spaces between them,
to make the result of foreach.

每次从list中取出一个词(空格分隔),赋给var变量,然后text(一般有var变量)被拓展开来。

只要list中还有空格分隔符就会一直循环下去,每一次text返回的结果都会以空格分隔开。

${wildcard ${foreach DIR, $(APPDIRS), ${addprefix $(DIR)/, $(APPS)}}}

先分析${foreach DIR, $(APPDIRS), ${addprefix $(DIR)/, $(APPS)}}

其中DIR是变量(var)$(APPDIRS)列表(list),这个例子中没有定义APPDIRS这个变量,估计是用于定义除了$CONTIKI/apps/之外的apps目录。

${addprefix $(DIR)/, $(APPS)}是text。我们假设定义了APPDIRS为a b。

那么第一次:DIR 会被赋值为a,${addprefix $(DIR)/, $(APPS)},又我们假定APPS为antelope unit-test,所以最终会被拓展为a/antelope  a/unit-test。

     DIR 会被赋值为b,${addprefix $(DIR)/, $(APPS)}又我们假定APPS为antelope unit-test,所以最终会被拓展为b/antelope  b/unit-test

最终这两次结果会以空格分隔开,即a/antelope  a/unit-test b/antelope  b/unit-test

${wildcard a/antelope  a/unit-test b/antelope  b/unit-test} 返回空,因为找不到符合这样的目录。

所以最终这句语句,实现的功能是,返回$APPDIRS目录中,所有符合$APPS的目录。

${wildcard ${addprefix $(CONTIKI)/apps/, $(APPS)}

这句语句返回$(CONTIKI)/apps/目录下所有符合$APPS的目录,即contiki-release-2-7/apps/antelope contiki-release-2-7/apps/unit-test

${addprefix $(CONTIKI)/platform/$(TARGET)/apps/, $(APPS)}

这句语句返回$(CONTIKI)/platform/$(TARGET)/apps/目录下所有$APPS的目录,即contiki-release-2-7/platform/native/apps/antelope contiki-release-2-7/platform/native/apps/unit-test。

在contiki-release-2-7/platform/native目录下,并没有apps目录,后边有差错处理机制

$(APPS)

在当前目录下的所有$APPS目录,即antelope unit-test。

在hello-world例子中,并没有这些目录。

所以APPDS变量是包含所有与$APPS有关的目录。

APPINCLUDES变量是所有需要导入的APP Makefile文件。

在所有APPDS目录下,所有Makefile.$(APPS)文件。

在我们的假设条件APPS = antelope unit-testAPPDIRS =

只会导入contiki-release-2-7/apps/antelope/Makefile.antelope contiki-release-2-7/apps/unit-test/Makefile.unit-test

其余的均不存在,所以在include指令前要有符号-,即出错继续执行后续指令。

contiki-release-2-7/apps/antelope/Makefile.antelope

分别定义了两个变量,antelope_src用于保存antelope这个app的src文件,antelope_dsc用于保存antelope这个app的dsc文件。

contiki-release-2-7/apps/unit-test/Makefile.unit-test

分别定义了两个变量,unit-test_src用于保存unit-test这个app的src文件,unit-tes_dsc用于保存unit-test这个app的dsc文件。

变量APP_SOURCES

  APP_SOURCES = ${foreach APP, $(APPS), $($(APP)_src)}

取出所有APPS中的src文件变量,这个例子是$(antelope_src) 和$(unit-test_src)

变量APP_SOURCES

  DSC_SOURCES = ${foreach APP, $(APPS), $($(APP)_dsc)}

取出所有APPS中的dsc文件变量,这个例子是$(antelope_dsc) 和$(unit-test_dsc)

  CONTIKI_SOURCEFILES += $(APP_SOURCES) $(DSC_SOURCES)

这段话的最终目的:

将$APPS相关的所有源文件添加进CONTIKI_SOURCEFILES变量中。

(3)

target_makefile := $(wildcard $(CONTIKI)/platform/$(TARGET)/Makefile.$(TARGET) ${foreach TDIR, $(TARGETDIRS), $(TDIR)/$(TARGET)/Makefile.$(TARGET)})# Check if the target makefile exists, and create the object directory if necessary.
ifeq ($(strip $(target_makefile)),)${error The target platform "$(TARGET)" does not exist (maybe it was misspelled?)}
elseifneq (1, ${words $(target_makefile)})${error More than one TARGET Makefile found: $(target_makefile)}endifinclude $(target_makefile)
endif

这断代码主要做的就是,找到在所有TAGET目录下找到符合的Makefile.$(TARGET)文件,放到target_makefile变量中。

再检查是否存在或者重复。并做相应的错误提示信息。

${error The target platform "$(TARGET)" does not exist (maybe it was misspelled?)}

${error More than one TARGET Makefile found: $(target_makefile)}

我们这个例子中 TARGET = native 并且 TARGETDIRS为空

所以最后会导入$(CONTIKI)/platform/native/Makefile.native

接下去要开始分析target和cpu的makefile文件了。

转载于:https://www.cnblogs.com/songdechiu/p/6012718.html

Contiki 2.7 Makefile 文件(五)相关推荐

  1. Contiki 2.7 Makefile 文件(一)

    一.主控Makefile 这里以hello-world例子为主线,从其工程Makefile开始,解析整个build过程. (1)CONTIKI_PROJECT = hello-world 定义变量CO ...

  2. makefile文件编写教程

    技术交流QQ群:1027579432,欢迎你的加入! 1.make介绍 gcc:编译器(gcc根据菜谱进行编译) make: linux自带的构建器(相当于一个菜谱) 构建的规则(菜谱)在makefi ...

  3. MakeFile 文件的作用

    makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等).创建程序(make程序)首先读取makefi ...

  4. C语言makefile文件

    文章目录 一.makefile的编写 二.make命令 三.makefile文件中的变量 四.应用经验 五.课后作业 六.版权声明 在软件的工程中的源文件是很多的,其按照类型.功能.模块分别放在若干个 ...

  5. Makefile文件编写规则

    From: http://aviva.iteye.com/blog/807494 Makefile中包含五种内容:显式规则,隐式规则,变量定义,指令(directive)和注释. 1.显式规则――描述 ...

  6. Makefile文件(四)_书写命令

    变量说明: $@       --->      目标文件 $^       --->       所有的依赖文件 $<       --->       第一个依赖文件 一. ...

  7. C语言makefile文件详解,makefile讲解

    仅供自己学习使用 一.Makefile介绍 Makefile 或 makefile: 告诉make维护一个大型程序, 该做什么.Makefile说明了组成程序的各模块间的相互 关系及更新模块时必须进行 ...

  8. makefile 文件 (​ http://blog.csdn.net/ruglcc/article/details/7814546/ )

    makefile三要素:目标,依赖,命令 make -f makefilename   指定makefile文件 (makefile写多行命令时,使用换行符"\") 一.makef ...

  9. Linux内核Makefile文件

    Linux内核Makefile文件(翻译自内 核手册) 转载自:http://blog.chinaunix.net/uid-21651676-id-60377.html Linux 内核Makefil ...

最新文章

  1. Express.js 中的 Sessions 如何工作?(译)
  2. 如何利用Winsock控件编写自己的Internet程序
  3. 在Win8中创建热点,共享网络
  4. Apache ZooKeeper - ZK的数据和文件
  5. (包含重力矢量)Pygame粒子模拟
  6. 高通量数据分析必备|基因组浏览器使用介绍 - 1
  7. 从一个简单的“欢迎“页面开始小程序之旅
  8. 原生html冻结表头,CSS如何实现表头冻结效果
  9. OpenCV Sobel和Scharr (索贝尔和夏尔滤波器检测边缘)
  10. Confluence 6 教程:在 Confluence 中导航
  11. 【FPGA】QuartusII_13.1安装及破解
  12. java实习简历_怎么样写一份比较好的Java实习生的简历?
  13. 《软件工程》第5章系统建模
  14. 六、数据库管理与维护
  15. 凌晨 计算机博士,凌晨三点,被我的博士老婆喊起来写程序……
  16. 数据结构----各种排序方法总结
  17. 虎年啦,小老虎带你4.5分钟彻底掌握Linux中的创建-目录-文件(mkdir-touch)
  18. 如何更改已经pushed的commit的注释信息(How to change the pushed commit message)
  19. Android ART虚拟机执行引擎-Interpreter(八)
  20. 任务二:Crypto学习

热门文章

  1. (转)The POM for 0.0.1-SNAPSHOT is missing, no dependency informat
  2. 柏林纪行(中):Node.js Collaboration Summit
  3. pycharm (二)
  4. 信息安全的技术研究相关站点
  5. VS2010测试功能之旅:编码的“.NET研究”UI测试(2)-操作动作的录制原理(上)...
  6. 关于group by的用法 原理
  7. flink 任务执行类的加载
  8. go string 转 uint64_如何优雅的使用Go接口?
  9. golang 的 tag
  10. 程序猿怎样的生活方式才能兼顾工作、家庭和自我提升