makefile教程(一)
Makefile简介:自动化构建工具的力量
Makefile是一种用于自动化构建项目的工具。它定义了一组规则,指定了如何生成目标文件。通过编写Makefile,开发人员可以简化项目的构建过程,减少手动操作的错误,并提高开发效率。
Makefile的基本概念
Makefile由三部分组成:目标(target)、依赖(dependencies)和命令(commands)。
- 目标:要生成的文件或执行的任务。
- 依赖:目标文件所依赖的文件或任务。
- 命令:生成目标文件或执行任务的命令。
以下是一个简单的Makefile示例:
1 |
|
在这个例子中,all
是目标,它依赖于program
。program
依赖于main.o
和utils.o
。生成main.o
和utils.o
的命令分别是编译main.c
和utils.c
。
Makefile的工作流程
- 定义目标、依赖和命令。在Makefile中,目标通常放在文件的顶部,依赖和命令则放在目标下面。
- 运行
make
命令,指定要生成的目标。例如,运行make all
将生成名为all
的目标。如果不指定目标,则默认生成名为all
的目标。 - Makefile检查目标是否已过期。如果目标不存在或依赖文件中的任何一个比目标更新,则目标被视为过期。
- 如果目标过期,Makefile会执行与目标相关的命令来生成目标。如果目标没有过期,则不会执行任何操作。
- 如果在执行命令时出现错误,Makefile将停止并显示错误消息。如果没有错误,则生成目标文件或执行任务。
- 完成后,可以运行其他目标或执行其他操作。
使用Makefile的优点
- 自动化:通过编写一次Makefile,可以自动化构建过程,减少手动操作。
- 可移植性:Makefile在不同的操作系统和环境中运行,使得构建过程更加一致。
- 灵活性:Makefile支持条件语句、变量和函数等高级功能,可以根据项目需求进行定制。
Makefile中的常用函数
Makefile支持自定义函数,这些函数可以用于处理字符串和文件名,以及执行其他任务。
自定义函数的定义格式为:
1 |
|
其中,functionName
是函数的名称,command1
、command2
等是函数内部的命令。
在函数内部,可以通过命令来操作变量、执行特定任务等。函数内部使用的变量在函数外部是不可见的,只有在函数内部才能访问到这些变量。
下面是一个简单的示例,展示了如何递归遍历目录下指定后缀的文件:
1 |
|
在这个例子中,我们定义了一个名为rwildcard
的函数,该函数接受两个参数路径和文件后缀返回匹配的文件。然后我们使用$(call functionName,param1,param2,...)
语法来调用函数,将参数传递给函数并获取返回值。在这个例子中,$(call rwildcard,path,*.c)
将返回后缀为.c的所有文件路径,并存储在变量result
中。最后,使用echo
命令输出结果。
除了上述的示例外,Makefile还提供了许多预定义的函数来处理文件名、文件路径、环境变量等。这些函数可以与自定义函数一起使用,以便更灵活地处理文件和执行任务。
在Makefile中,函数是用于处理字符串和文件名的强大工具。下面是一些常用的Makefile函数:
1. 字符串函数
$(subst from,to,text)
: 将字符串中的"from"替换为"to"。$(patsubst pattern,replacement,text)
: 将符合"pattern"的字符串替换为"replacement"。$(strip string)
: 去掉字符串开头和结尾的空格。$(findstring find,in)
: 在"in"中查找"find",返回"find"的起始位置。如果未找到,返回空字符串。$(filter pattern...,text)
: 返回符合"pattern"的字符串列表。$(filter-out pattern...,text)
: 返回不符合"pattern"的字符串列表。$(sort list)
: 对字符串列表进行排序。$(word n,text)
: 返回"text"中的第n个单词。$(wordlist s,e,text)
: 返回"text"中从第s个到第e个单词的列表。$(words text)
: 返回"text"中的单词数量。$(firstword names...)
: 返回第一个非空、非空格字符的单词。$(lastword names...)
: 返回最后一个非空、非空格字符的单词。
2. 文件名函数
$(dir names...)
: 返回文件名中的目录部分。$(notdir names...)
: 返回文件名中的非目录部分。$(suffix names...)
: 返回文件名中的后缀部分。$(basename names...)
: 返回文件名中的基本名称部分(去掉后缀)。$(addsuffix suffix,names...)
: 将后缀"suffix"添加到文件名"names"上。$(addprefix prefix,names...)
: 将前缀"prefix"添加到文件名"names"上。$(join list1,list2)
: 将两个列表中的对应项连接起来,并以空格分隔。$(wildcard pattern)
: 返回符合"pattern"的文件名列表。$(realpath names...)
: 返回文件名的绝对路径。$(abspath names...)
: 返回文件名的绝对路径(如果文件存在)。$(call variable,param,param,...)
: 使用参数扩展变量。
makefile通用模板
1 |
|