基本规则
makefile的规则,一般由以下组成
目标: 依赖列表
命令列表
1、其中第一条规则中的”目标“,将会成为终极目标。我们最终目的,就是为了生成这个目标的
2、每一个规则中的目标。都可以是一个文件,也可以是一个标签
3、每一个规则中的目标,不一定要有依赖
目标:
命令列表
此时的目标,我们成为”伪目标“
4、每一个规则,也不一定有命令列表
案例
假设我们有三个.c源文件,main.c、f1.c、f2.c
f1.c
#include "stdio.h"
void f1()
{
printf("This is f1
);}
f2.c
#include "stdio.h"
void f2()
{
printf("This is f2
);}
然后我们在main里面调用f1与f2这两个函数,接着编译、运行即可
下面我们编写一下Makefile
target:main.c f1.c f2.c
gcc f1.c f2.c main.c
输入命令 make
即可完成编译
如果不想打印出gcc f1.c f2.c main.c
这条命令,可以在Makefile
文件中的命令列表前加上一个@
符号
变量
创建变量,与shell类似
number = '56',此时,变量number的值就是56,
可以使用echo验证: echo &$number
其中这个符号$
就是使用已声明的变量
变量的三种赋值方式
第一种:'=' 称为”延时展开赋值“
例如:
temp = $number
number = '56'
此时你输出'temp'等于56,所谓延时展开赋值就是当number成功赋值之后,再把number的值赋给temp
第二种:':='称为”立即展开赋值“
例如:
temp := $number
number = '56'
此时你输出'temp'就为空
第三种:'?='称为条件赋值
例如:
temp ?= $number
假如在这之前没有给变量temp赋过值,那么就会把number的值赋给temp,反之就不会把number的值赋给temp
特殊变量
$@
: 当前规则中的目标
$^
: 当前规则中的所有依赖
$<
: 当前依赖中的第一个
$$
: 当前执行的进程的进程编号
$*
: 模式规则中的所有%匹配的部分
$?
: 模式规则中所有比所在规则中的目标更 新的文件组成的列表
下面借助变量优化一下上述案例的Makefile
SOURCE=main.c f1.c f2.c
target:$(SOURCE)
gcc $^
模式规则
%.o: %.c
gcc -c $<
%.c
会匹配.c文件前面的部分,相当于shell
中的*.c
模式规则执行时,是一个循环取出的过程,每次取出一个.c
,调用命令生成对应的.o
模式规则举例
#strat
TARGET = a.out
SRCS = main.c
$(TARGET): $(SRCS:.c = .o)
gcc $^ -o $@
#$(SRCS:.c=.o) 可以理解为目标所依赖文件是由.c文件生成的.o文件
#模式规则
%.o: %.c
gcc -c $< #模式规则每次取出一个,所以这里用$<
#end
写Makefile系列的文章是做个笔记,为了以后方便复习,里面应该有许多BUG,等学一段时间后会继续完善
审核编辑:汤梓红
-
Makefile
+关注
关注
1文章
125浏览量
19181
发布评论请先 登录
相关推荐
评论