Makefile

基本组成

1.需要生成的目标文件(target file)
2.生成目标文件的依赖文件(dependencyfile)
3.生成目标文件的编译规则命令行(command)

target file : dependencyfile
command  (前面要加一个<Tab>)

编译过程

1.读取Makefile文件
2.查找第一个目标文件,同时也是最终目标
3.把目标文件的依赖文件当作目标文件进行依赖规则检查。

  • 1 如果缺少依赖文件,则执行规则命令生产依赖文件(假如缺少a.o,则执行命令cc -c a.c 生成a.o)
  • 2 如果存在依赖文件,把其作为目标文件来检查依赖规则(假如a.c比a.o新,则执行命令 cc-c a.c 更新a.o)
  • 3 如果目标文件比依赖文件新,则不做处理

4.生成或更新最终目标文件

特性

1.变量
定义方式:
  • 1 通过 “=” 实现
	a1=$(a2)
	a2=a.o
  • 2 通过 “:=” 实现
	a1:=a.o
	a2:=$(a1) b.o    这样a2就是 a.o b.o
  • 3 通过 “+=” 实现
	a1+=a.o
	a2+=$(a1) b.o    这样a2就是 a.o b.o
  • 4 通过 “?=” 实现
	a1:=a.o
	a1?=b.o    如果a1未定义则为新值,否则为原值
使用方式:
    obj = a.o b.o
    test : $(obj)
    cc -o test $(obj)
2.自动推导

  默认每一个目标文件都有与之对应的依赖文件,可以自动推导出与目标文件对应的基本编译规则命令,如a.o文件的规则命令为“gcc -c -o a.c”

  伪目标

使用make 伪目标的方式让管理变得简单

  • make all

     obj=a.o b.o
     
     .PHONY : all
     all :  test $(obj)
     
     test : $(obj)
     	cc -o test $(obj)
    
  • make clean

     .PHONY : clean
     clean : 
     	rm -rf test $(obj)
    
  • make install

     test_dir=/home/t_d
     .PHONY : install
     install :  
     	mkdir $(test_dir)
     	cp test $(test_dir)
    
  • make uninstall

     .PHONY : uninstall
     uninstall :  
     	rm -rf $(test_dir)
    
3.文件查找

(1)VPATH:Make在当前路径找不到源文件的情况下,会在制定路径中寻找

VPATH = 目录 : 目录
VPATH =  /a : /b

(2)vpath:vpath 是 关键字,VPATH 是路径

vpath 模式 目录 : 目录
vpath %.c  /a : /b
4.嵌套执行

Make会先读根目录的Makefile,再去读各个子目录的Makefile

cd 子目录 && $(MAKE)
	或
$(MAKE) -c 子目录
5.条件判断
(1)ifeq(参数1,参数2) 
	
			else
		
(2)ifneq(参数1,参数2)
    		
    		else
    		
(3)ifdef(参数1)
    		
    		else
    		
(4)ifndef(参数)
    	
    		else
6.函数
$(函数名 参数,参数...)
(1)$(subset 参数1,参数2,参数3)
									用参数2代替参数3中的参数1
	$(patsubst 模式参数,参数1,参数2)
									把参数二中符合模式参数的字符串替换成参数1
(2)$(foreach 变量参数,参数1,表达式)
									循环取出参数1中的字符串赋给变量参数
				例:		a:=x y z
							$(foreach b, $(a), $(b).c)		
					result: x.c y.c z.c
(3)$(wildcard 模式参数)
									打印出所有符合的文件名
(4)$(strip 参数)
									去掉参数开头结尾的空格
(5)$(findstring 参数1,参数2)
									在参数2中找到参数1,找到返回1									
(6)$(fliter 模式参数, 参数1)
									筛选出符合模式参数的字符串
(7)$(addsuffix 参数1,参数2)
									在每个参数2后面加上参数1
	 $(addprefix 参数1,参数2)
									在每个参数2前面加上参数1
(8)$(call 变量参数,参数....)
									把参数依次赋给变量参数
						例:		a := $(2) $(1)
									result := $(call $(a) , x y)
(9)$(if 条件参数 , 执行参数)
     $(if 条件参数 , 执行参数1,执行参数2)
(10)$(dir 参数)
									从参数中取出路径部分
(11)$(error 参数)
									停止Make 打印error
	  $(warning 参数)
									打印warning
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值