一、基本格式
<target> : <prerequisites>
[tab] <commands>
target --目标文件,可以是Object File 也可以是可执行文件,还可也是标签Label;
prerequisites --生成target所需的文件或目标;
command --make需要执行的命令,可以是任何shell命令。
二、案例
CC=gcc
TARGET:=test
all:${TARGET}
C_SRCS=$(wildcard *.c)
C_OBJS=${patsubst %.c, %.o, $(C_SRCS)}
all:${TARGET}
${TARGET}:${C_OBJS}
${CC} -o $@ $^
%.o:%.c
${CC} -c -o $@ $<
.PHONY:clean
clean:
rm -rf ${TARGET} *.o
$@:规则的目标文件名
$<:规则的第一个依赖文件名
$^:规则的所有依赖文件列表
$? :指代比目标更新的所有前置条件,之间以空格分隔。
比如,规则为 t: p1 p2,其中 p2 的时间戳比 t 新,$?就指代p2。
$* :指代匹配符 % 匹配的部分。
比如% 匹配 f1.txt 中的f1 ,$* 就表示 f1。
%.格式:代表所有该格式的文件(在vi替换命中令也使用了%代表所有)
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
模式匹配
规则 1:%.o:%.c
gcc -Wall -g -c $< -o $@
规则 2:.c.o
gcc -Wall -g -c $< -o $@
规则2注意 .c.o之间不能由空格
make常用内嵌函数
函数调用
$(function arguments)
$(wildcard 模式)
当前目录下匹配模式的文件:src = $(wildcard *.c) ,获取所有.c文件
$(src:%.c=%.o), 把src的 .c替换为.o
obj = $(src:%.c=%.o)
shell函数 执行shell命令: $(shell ls –d */) -> 获取所有子目录
三、总结
简单的Makefile。