Technorati 标签: Makefile 基本知识
最常见的书写方式:
CC          = gcc
LD        = ld
STRIP     = strip
CFLAGS      := -Os -static -DEZ_OS_LINUX
CLFLAGS     := -Os -static
all: mainEXEC = main
OBJS = main.o mytool1.o mytool2.o
INCS = mytool1.h mytool2.hall: $(EXEC)
$(EXEC): $(OBJS)$(CC) $(CFLAGS) -o $@ $(OBJS)$(STRIP) $@
clean:-rm -f $(EXEC) *.elf *.gdb *.o
%.o: %.c $(INCS)$(CC) $(CFLAGS) -c $< -o $@

Makefile中允许使用简单的宏来指代源文件以及相关编译选项,引用宏时,必须在变量名称前加美元$,同时,使用圆括号括起来(变量名为两个字母以上时)

下面都是有效的宏引用:

$(CFLAGS)

$2

$Z

$(Z) 
其中最后两个引用是完全一致的。

$@      --  目标文件,

$^      --  所有的依赖文件,

$<      --  第一个依赖文件。

# 这是简化后的Makefile

main:main.o mytool1.o mytool2.o

gcc -o $@ $^            //$@ 就是main, $^就是main.o mytool1.o mytool2.o

main.o:main.c mytool1.h mytool2.h

gcc -c $<               //$<就是main.c

mytool1.o:mytool1.c mytool1.h

gcc -c $<               //$<就是mytool1.c

mytool2.o:mytool2.c mytool2.h

gcc -c $<               //$<就是mytool2.c

常用字符串处理函数

1.$(subst FROM,TO,TEXT)
函数名称:字符串替换函数—subst。
函数功能:把字串“TEXT”中的“FROM”字符替换为“TO”。
返回值:替换后的新字符串。
2.$(patsubst PATTERN,REPLACEMENT,TEXT)
函数名称:模式替换函数—patsubst。
函数功能:搜索“TEXT”中以空格分开的单词,将否符合模式“TATTERN”替换为“REPLACEMENT”。参数“PATTERN”中可以使用模式通配符“%”来代表一个单词中的若干字符。
返回值:替换后的新字符串。
函数说明:参数“TEXT”单词之间的多个空格在处理时被合并为一个空格,但前导和结尾空格忽略。

3.$(strip STRINT)
函数名称:去空格函数—strip。
函数功能:去掉字串(若干单词,使用若干空字符分割)“STRINT”开头和结尾的空字符,并将其中多个连续空字符合并为一个空字符。
返回值:无前导和结尾空字符、使用单一空格分割的多单词字符串。
函数说明:空字符包括空格、[Tab]等不可显示字符。

4.$(sort LIST)
函数名称:排序函数—sort。
函数功能:给字串“LIST”中的单词以首字母为准进行排序(升序),并取掉重复的单词
返回值:空格分割的没有重复单词的字串。
函数说明:两个功能,排序和去字串中的重复单词。可以单独使用其中一个功能。

二、文件名处理函数

1.$(dir NAMES…)
函数名称:取目录函数—dir。
函数功能:从文件名序列“NAMES…”中取出各个文件名目录部分。文件名的目录部分就是包含在文件名中的最后一个斜线(“/”)(包括斜线)之前的部分。
返回值:空格分割的文件名序列“NAMES…”中每一个文件的目录部分。
函数说明:如果文件名中没有斜线,认为此文件为当前目录(“./”)下的文件。

2.$(notdir NAMES…)
函数名称:取文件名函数——notdir。
函数功能:从文件名序列“NAMES…”中取出非目录部分。目录部分是指最后一个斜线(“/”)(包括斜线)之前的部分。删除所有文件名中的目录部分,只保留非目录部分
返回值:文件名序列“NAMES…”中每一个文件的非目录部分。

3.$(addprefix PREFIX,NAMES…)
函数名称:加前缀函数—addprefix。
函数功能:为“NAMES…”中的每一个文件名添加前缀“PREFIX”。参数“NAMES…”是空格分割的文件名序列,将“SUFFIX”添加到此序列的每一个文件名之前。
返回值:以单空格分割的添加了前缀“PREFIX”的文件名序列。

4.$(wildcard PATTERN)
函数名称:获取匹配模式文件名函数—wildcard
函数功能:列出当前目录下所有符合模式“PATTERN”格式的文件名。
返回值:空格分割的、存在当前目录下的所有符合模式“PATTERN”的文件名。
函数说明:“PATTERN”使用shell可识别的通配符,包括“?”(单字符)、“*”(多字符)等。

三、其它函数

1.$(foreach VAR,LIST,TEXT)
函数功能:函数“foreach”不同于其它函数。它是一个循环函数。类似于Linux的shell中的循环(for语句)。这个函数的工作过程是这样的:如果必要(存在变量或者函数的引用),首先展开变量“VAR”和“LIST”;而表达式“TEXT”中的变量引用不被展开。执行时把“LIST”中使用空格分割的单词依次取出赋值给变量“VAR”,然后执行“TEXT”表达式。重复直到“LIST”的最后一个单词(为空时结束)。“TEXT”中的变量或者函数引用在执行时才被展开,因此如果在“TEXT”中存在对“VAR”的引用,那么“VAR”的值在每一次展开式将会到的不同的值。
返回值:空格分割的多次表达式“TEXT”的计算的结果。

2.$(if CONDITION,THEN-PART[,ELSE-PART])
函数功能:函数“if”提供了一个在函数上下文中实现条件判断的功能。就像make所支持的条件语句—ifeq。第一个参数“CONDITION”,在函数执行时忽略其前导和结尾空字符并展开。“CONDITION”的展开结果非空,则条件为真,就将第二个参数“THEN_PATR”作为函数的计算表达式,函数的返回值就是第二表达式的计算结果;“CONDITION”的展开结果为空,将第三个参数“ELSE-PART”作为函数的表达式,返回结果为第三个表达式的计算结果。
返回值:根据条件决定函数的返回值是第一个或者第二个参数表达式的计算结果。当不存在第三个参数“ELSE-PART”,并且“CONDITION”展开为空,函数返回空。
函数说明:函数的条件表达式“CONDITION”决定了,函数的返回值只能是“THEN-PART”或者“ELSE-PART”两个之一的计算结果。

3.$(shell command arguments)
函数功能:函数“shell”所实现的功能和shell中的引用(``)相同。实现了命令的扩展。意味着需要一个shell命令作为它的参数,而返回的结果是此命令在shell中的执行结果。make仅仅对它的回返结果进行处理;make将函数的返回结果中的所有换行符(“\n”)或者一对“\n\r”替换为单空格;并去掉末尾的回车符号(“\n”)或者“\n\r”。函数展开式时,它所调用的命令(它的参数)得到执行。除了对它的引用出现在规则的命令行中和递归的变量定义引用以外,其它决大多数情况下,make在读取Makefile时函数shell就被扩展。
返回值:函数“shell”的参数在shell中的执行结果。
函数说明:函数本身的返回值是其参数的执行结果,没有进行任何处理。对结果的处理是由make进行的。当对函数的引用出现在规则的命令行中,命令行在执行时函数引用才被展开。展开过程函数参数的执行时在另外一个shell进程中完成的,因此对于出现在规则命令行的多级“shell”函数引用需要谨慎处理,否则会影响效率(每一级的“shell”函数的参数都会有各自的shell进程)。

转载于:https://www.cnblogs.com/cherishui/p/4313965.html

Makefile 基本知识相关推荐

  1. 编译—Makefile基础知识

    编译-Makefile基础知识 一.Makefile简介 二.Makefile规则与语法 1.Makefile规则 2.Makefile核心语法 命令 变量赋值 条件语句 函数 3.伪目标 order ...

  2. 5、Makefile基础知识汇总(转自陈皓总述)

    一.Makefile里有什么? Makefile里主要包含了五个东西:显式规则.隐晦规则.变量定义.文件指示和注释. 1.显式规则.显式规则说明了,如何生成一个或多的的目标文件.这是由Makefile ...

  3. 关于实验中的makefile相关知识

    可能有用的链接: (简书)linux编程入门(六)-编写Makefile文件 深入学习Make命令和Makefile UNIX系统上很多软件包都是使用make程序和Makefile文件来实现自动编译的 ...

  4. makefile编写知识小结

    1.Makefile中的宏定义 -D 增加编译宏定义:-I增加头文件搜索路径: 示例:CFLAGS+=-D __CUSTOMER_CODE__, 则编译时,只编译__CUSTOMER_CODE__宏定 ...

  5. linux内核kconfig objs,linux内核中Kconfig和Makefile 详解

    内核源码树的目录下都有两个文档 Kconfig (2.4版本是Config.in)和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录 ...

  6. 【转】Kconfig,Makefile 和 .config

    原文网址:http://blog.csdn.net/nxh_love/article/details/11846861 最新在做Sensor驱动移植的时候,发现了Android driver 中有Kc ...

  7. Linux/Android Kconfig Makefile defconfig 和 .config关系

    点击打开链接 在进行Android L->M升级时遇到打印: Root cause is probably that a dependancy declared in Kconfig is no ...

  8. Android驱动中的Kconfig文件与Makefile文件

    内核源码树的目录下都有两个文档Kconfig(2.4版本是Config.in)和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文 ...

  9. Linux Kconfig及Makefile学习

    内核源码树的目录下都有两个文档 Kconfig (2.4版本是Config.in)和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了 所属目 ...

最新文章

  1. Djiango模板语言DTL
  2. Matlab GUI 设计(4):不同控件之间的数据传递
  3. 吐槽: 移动端缓存策略
  4. java 监控执行时间_java-监测方法运行时间 | 学步园
  5. 使用 kafka 提升你的订单接口吞吐量
  6. casio dt-930 条码采集器 盘点软件源程序
  7. SRAM(静态随机存储器)
  8. 如何在Java 8中创建线程安全的ConcurrentHashSet?
  9. qt QMessageBox 中文乱码的问题
  10. java react_2019JAVA最新课程-React从入门到实战(新)
  11. 重磅发布!最新版《动手学深度学习》PDF版今天终于可以下载
  12. R爬虫可视化第五季-图解欧洲足球五大联赛
  13. 并发编程学习之CopyOnWriteArraySet
  14. 阿里小蜜:语音识别、语义分析、深度学习在手机淘宝的实战分享
  15. mysql数据库防篡改_数据库如何防篡改
  16. visio常用快捷键_Visio实用快捷键+比较不错的总结
  17. drop、truncate和delete的区别
  18. Perl Summary
  19. Unity3d 技巧(3)-如何在自己的程序中 Shader.Find 到自己写的shader
  20. 让你的高清监控摄像头,轻松实现在微信公众号直播

热门文章

  1. Vue + webpack 项目配置化、接口请求统一管理
  2. 程序员的思维修炼》读书笔记
  3. 摩拜大数据杀熟?官方:老用户押金的确退款延迟
  4. oneuijs/You-Dont-Need-jQuery
  5. 一个待办事列表todolist
  6. 获取泛型T的ClassT clazz
  7. 36--斐波那契数列
  8. python 数组和列表的区别
  9. python实例化对象做实参_如何在Python中记住类实例化?
  10. Source Insight上手教程