all : main.c foo1.c foo2.c foo3.c
        gcc main.c foo1.c foo2.c foo3.c -o all

targets:prerequisites
        command
或者
targets :prerequisites
        command

targets:目标文件名可以多个,空格隔开
prerequisite:依赖目标
command:命令行,命令太长用反斜杠\作为换行符,需要Tab作为开头



%代表任意长度串,空格不属于





在Makefile中使用命令要Tab开始,

否则会出现“遗漏分隔符,停止”。

变量有(=)和(:=)两种,前者会造成递归定义。

(?=)如果左边变量未定义则赋予右值。

变量使用需要$(变量)或者${变量}。

全局变量




define 变量
        命令
endef

全局变量




override 指示符

全局变量




 $@目标集合 $<依赖目标集合
     自动化变量 中$<属于规则性变量,依赖于规则的目标和依赖目标的定义

目标变量

自动化变量运行才有值



%.o :CFLAGS=-o

目标模式变量




$(function argument1,argument2)
${function argument1,argument2}

函数调用




若干个单词串处理函数

$(subst replaceword,newword,sourceText


$(subst ee,EE,feet on the street)

fEEt on the strEEt

空返回‘ ’

$(patsubst pattern,replacement,sourcetext)


$(patsubst %.c,%.o,x.c.c bar.c)

x.c.o bar.o


$(findstring find,sourcetext)

有返回对应,否则' '




$(filter pattern1 pattern2 ,sourceText)

过滤器,返回SourceText符合 %.后缀的模式




$(filter-out pattern1 pattern2,sourceText)

反过滤,返回不符合对应模式的




$(sort word1 word2)

字母序升序排序且去重




$(word index_1,sourceText)

取第index个单词(单词不是字符),从1开始




$(wordlist fromIndex_1,toIndex_1,sourceText)

去从fromIndex到toIndex的文本单词




$(words sourceText)

统计单词个数




$(firstword sourceText)

返回首单词



文件名操作函数

$(dir  name1 name2)

取目录函数,返回文件所在目录,不包括文件名

$(dir usr/e/hha.c dd)

usr/e/  ./


$(notdir name1 name2)

取文件名

$(notdir usr/e/hh.c dd)

hh.c dd


$(suffix name1 name2)

取后缀,无后缀‘ ’




$(basename name1 name2)

取前缀,无前缀‘ ’




$(addsuffix suffix,sourceText)

加后缀




$(addprefix prefix,sourceText)

加前缀




$(join list1,list2)

连接函数,对应index的连接,无对应自己




$(foreach oneOfList,list,EveryDealText)

循环函数,list中取之局部变量oneOfList中,用到处理部分,每个返回空格连接



条件判断函数

ifeq (arg1,arg2)  endif

if equal 判断是否相等?真:假;




ifneq (arg1,arg2)  endif

判断是否不等?真:假;




ifdef variable-name  endif

变量有值?真:假;




ifndef variable-name  endif

变量空值?真:假;




$(if condition,then_part,else_part)





$(if condition,then_part)




其他函数

$(call expression,parm1,parm2)

在expression中用到后面的parm1用$(1)

reverse=$(2) $(2)
foo=$(call reverse,a,b)

b a


$(origin variable)

Undefined未定义
Dafault默认定义 CC
environment环境变量
file被定义在Makefile
command line被命令行定义
override指示符重新定义
automatic一个命令运行中的自动化变量




$(shell shell命令)

生成一个shell程序来执行命令

$(shell echo just text)

just text

控制make的函数

$(error text)


ifdef ERROR_001
$(error error is $(ERROR_001))
endif



$(warning text)




模式规则

destiPattern:sourcePattern;command

%.o:%.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@



@echo just text 

echo just text
just text




echo just text

just text