1、最简单的makefile文件
all:
echo "Hello world!" #注意:每行命令都必须以tab键开始!
2、makefile的文件结构
终极目标:依赖A 依赖B 依赖C
终极目标命令
依赖A:子依赖A1 子依赖A2
依赖A命令
依赖B:子依赖B1 子依赖B2
依赖B命令
依赖C:子依赖C1 子依赖C2
依赖C命令
举例:
simple: main.c Simple.c
gcc -o simple main.c simple.c
touch main.c //更改时间戳
3、makefile复杂例子
(版本1)
complicated: main.o complicated.o
gcc -o complicated main.o complicated.o
main.o: main.c
gcc -o main.o -c main.c
complicated.o: complicated.c
gcc -o complicated.o -c complicated.c
4、makefile的注释
# 这是一个演示注释语法的makefile
all: test #关于依赖的注释
# echo "Makefile for comment 1" 这里是注释,不是命令
echo "Makefile for comment 2"
# 这是一个关于test规则的 \
多行注释
test:
# 没有反斜线\, #被当作注释的开始
echo this is a # test rule1
# 加上反斜线\, #被当作普通字符
echo this is a \# test rule2
# 这是一个演示注释语法的makefile
all: test #关于依赖的注释
# echo "Makefile for comment 1" 这里是注释,不是命令
echo "Makefile for comment 2"
# 这是一个关于test规则的 \
多行注释
test:
# 没有反斜线\, #被当作注释的开始
echo this is a # test rule1
# 加上反斜线\, #被当作普通字符
echo this is a \# test rule2
5、makefile的变量定义与引用
# 变量定义
objects = program.o foo.o utils.o
program : $(objects) #在依赖中引用变量
gcc -o program ${objects} #在命令中引用变量
$(objects) : defs.h #在目标中引用变量
foo1 = $(bar) #递归展开式变量
foo2 := $(bar) #直接展开式变量
bar = $(ugh)
ugh = Huh?
all:
echo "foo1 is $(foo1), foo2 is $(foo2)"
bar = foo1
bar += foo2 #追加赋值,bar的值将为 foo1 foo2
all:
echo $(bar)
bar1 = foo1
bar1 ?= foo2 # bar1 的值还是foo1
bar2 ?= foo2 # bar2 的值为foo2
all:
echo "bar1 is $(bar1), bar2 is $(bar2)"
特殊变量
all: first second third
echo "\$$@ = $@"
echo "$$< = $<"
echo "$$^ = $^"
first second third:
变量的替换引用
sources := a.c b.c c.c d.d
objects := $(sources:.c=.o)
all:
echo "objects = $(objects)"
missing separate. 停止
(版本2)
# 描述:complicated 项目 makefile文件
# 版本:v1.2
# 修改记录:
# 1. 为complicated项目makefile添加注释
# 2. 使用变量改进我们complicated项目的makefile
# 定义可执行文件变量
executbale := complicated
# 定义源文件列表变量
sources := main.c complicated.c
# 使用变量的引用替换,定义object文件列表
objects := $(sources:.c=.o)
# 定义编译命令变量
CC := gcc
# 终极目标规则,生成complicated可执行文件
$(executbale): $(objects)
# 使用自动化变量改造我们的编译命令
$(CC) -o $@ $^
# 子规则1, main.o的生成规则
main.o: main.c
$(CC) -o $@ -c $<
# 子规则2,complicated.o的生成规则
complicated.o: complicated.c
$(CC) -o $@ -c $<
6、makefile的多目标规则
all: target1 target2
echo "This is a rule for $@"
# 利用多目标规则合并 target1 和target2的规则
target1 target2: dep
echo "This is a rule for $@"
dep:
# 静态模式规则简化complicated makefile
$(objects): %.o: %.c
$(CC) -o $@ -c $<
# complicated项目添加clean 规则
clean:
rm -rf complicated complicated.o main.o
all:
@echo "Hello world!" //关闭命令回显
make -f cmd.mk all
(版本3)
# 描述:complicated 项目 makefile文件
# 版本:v1.3
# 修改记录:
# 1. 为complicated项目makefile添加注释
# 2. 使用变量改进我们complicated项目的makefile
# 3. 使用静态模式规则,简化makefile
# 4. 使用伪目标,加上clean规则
# 定义可执行文件变量
executbale := complicated
# 定义源文件列表变量
sources := main.c complicated.c
# 使用变量的引用替换,定义object文件列表
objects := $(sources:.c=.o)
# 定义编译命令变量
CC := gcc
RM := rm -rf
# 终极目标规则,生成complicated可执行文件
$(executbale): $(objects)
# 使用自动化变量改造我们的编译命令
$(CC) -o $@ $^
# 子规则, main.o和complicated.o的生成规则,使用静态模式规则
$(objects):%.o:%.c
$(CC) -o $@ -c $<
# clean规则
.PHONY: clean
clean:
$(RM) $(executbale) $(objects)
(版本4)
# 描述:complicated 项目 makefile文件
# 版本:v1.4
# 修改记录:
# 1. 为complicated项目makefile添加注释
# 2. 使用变量改进我们complicated项目的makefile
# 3. 使用静态模式规则,简化makefile
# 4. 使用伪目标,加上clean规则
# 5. 引进wildcard函数,自动扫描当前目录下的源文件
# 定义可执行文件变量
executbale := complicated
# 引进wildcard函数扫描源文件,定义列表变量
sources := $(wildcard *.c)
# 使用变量的引用替换,定义object文件列表
objects := $(sources:.c=.o)
# 定义编译命令变量
CC := gcc
RM := rm -rf
# 终极目标规则,生成complicated可执行文件
$(executbale): $(objects)
# 使用自动化变量改造我们的编译命令
$(CC) -o $@ $^
# 子规则, main.o和complicated.o的生成规则,使用静态模式规则
$(objects):%.o:%.c
$(CC) -o $@ -c $<
# clean规则
.PHONY: clean
clean:
$(RM) $(executbale) $(objects)
$(deps):%.d:%.c
gcc -MM $< > $@
gcc -MM main.c #获取依赖关系
(版本5)
# 描述:complicated 项目 makefile文件
# 版本:v1.5
# 修改记录:
# 1. 为complicated项目makefile添加注释
# 2. 使用变量改进我们complicated项目的makefile
# 3. 使用静态模式规则,简化makefile
# 4. 使用伪目标,加上clean规则
# 5. 引进wildcard函数,自动扫描当前目录下的源文件
# 6. 加入自动规则依赖
# 定义可执行文件变量
executbale := complicated
# wildcard函数扫描源文件,定义列表变量
sources := $(wildcard *.c)
# 使用变量的引用替换,定义object文件列表
objects := $(sources:.c=.o)
# 使用变量的引用替换,定义依赖描述文件列表
deps := $(sources:.c=.d)
# 定义编译命令变量
CC := gcc
RM := rm -rf
# 终极目标规则,生成complicated可执行文件
$(executbale): $(objects)
# 使用自动化变量改造我们的编译命令
$(CC) -o $@ $^
# 子规则, main.o和complicated.o的生成规则,使用静态模式规则
$(objects):%.o:%.c
$(CC) -o $@ -c $<
# clean规则
.PHONY: clean
clean:
$(RM) $(executbale) $(objects) $(deps)
# 自动规则依赖
sinclude $(deps)
$(deps):%.d:%.c
$(CC) -MM $< > $@
makefile
最新推荐文章于 2024-05-04 07:48:16 发布