makefile学习
本文用来介绍Makefile的用法
一、 什么是makefile
makefile定义了一系列规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些需要重新编译,也就是说用来实现自动化编译,本来编译这件事是由开发环境帮忙完成的,但是在Unix下,则需要makefile:
- 编译 , 源文件生成中间代码文件的过程叫编译;
- 链接 ,把大量的可中间代码文件合成可执行文件的过程叫做链接;
二、makefile的规则
target…: prerequisites
command…
target是生成的目标文件,prerequisite是源文件,command是要执行的命令。
三、 makefile的语法
1. 判断
关键字 | 功能 |
---|---|
ifeq | 判断参数是否相等,相等为true,不相等为false |
ifneq | 判断参数是否不相等,不相等为true,相等为false |
ifdef | 判断是否有值,有值为true,没有值为false |
ifndef | 判断是否没值,没有值为true,有值为false |
ifeq表示条件语句的开始,并指定一个比较条件,else表示当条件不满足时执行的部分,不是所有条件都需要执行,endif是判断语句结束标志,所有条件判断结束都要有该语句。
2.通用函数
- wildcard:扩展函数,展开为已经存在的匹配模式指定模式的使用管控个分隔的文件列表;若指定模式均不匹配,则返回空。
例:SRC=$(wildcard $(ALG_SRCPATH)/*.c),src 等于ALG_SRCPATH路径下的所有.c文件。 - patsubst:替换函数,
例:OBJS := ( p a t s u b s t (patsubst %.c,%.o, (patsubst(SRC)),把src路径下的所有.c文件替换成.o文件赋值给OBJS - filter:过滤掉字符串中不符合指定模式的内容,可以指定多个过滤模式,模式表达式之间使用空格分隔
例:all:
@echo $(fileter %.o %s, 1.c 2.o 3.s)
输出:2.o 3.s - strip:去除字符串前后的空格
例:str1:= he llo
all:
@echo (strip $(str1))
输出:he llo - foreach:循环处理一些操作
- notdir:去除文件的路径信息,只保留文件名
all:
@echo $(notdir test/1.c test/2.c)
输出:1.c 2.c - subst:以指定的替换规则替换文本中的字符串
- eval:对指定内容进行二次展开,使得其中的内容被make进行解析和执行