Makefile基础篇

    • 基本语法

makefile用于大型文件编译,原因是它编译时只编译依赖时间戳比目标新的文件,而不必去重新编译整个工程文件。换句话说就是用我们指定的方式去编译文件

  1. 基本规则:

目标是指一个普通文件,也可以是一个标签或者执行文件。

依赖是指生成这个目标需要的文件或目标,以空格隔开依赖

命令是指任意的shell命令,注意一定要以tab键开头

它的基本规则是:当任意一个及以上的依赖文件的时间戳比目标要新,或者目标不存在,就执行下面的命令

来写一个最简单的makefile:

分析:原来只有a.c与Makefile这两个文件,在编写好Makefile后,执行make,此时没有生成a这个目标文件,它会执行后面的命令。有了a之后再执行make,此时显示目标文件是最新的,因为依赖文件没有更改,时间戳自然比生成的文件落后,所有没有执行命令。利用touch命令更新一下a的时间,此时再执行make,它又会执行命令。

  1. 假想目标.PHONY:避免目录下含有与目标相同的文件名引起冲突。

用法就是用.PHONY修饰一下目标即可

  1. all:它只是一个约定俗成,是所有目标的集合,和常规目标用法没啥不同,只是习惯把要生存的多个目标放到这儿来生成,例如,我们要生成两个目标文件,如果一个一个写,它只会执行第一个目标,后面的只能通过make+指定目标才能执行,举例

执行make,结果只执行第一个

要执行第二个,就应该

而想要生成两个目标就应该这样

直接make或者make all结果相同,也可以单独执行main1或者main2

    • 变量

大型文件自然不可能像这么简单,我们得学习一下makefile变量

makefile的变量全是字符串形式,不需要定义类型,变量间以空格隔开。

变量:分为立即变量与延时变量

  1. 即时变量赋值(立即覆盖原值):

:= 覆盖前面的值,即刻确定

  1. 延时变量赋值

= 用到时才确定

?= 如果是第一次定义变量才起效,前面如果已经定义则此时赋值忽略

  1. 特殊

+= 附加,它是即时变量还是延时变量取决于前面的定义

  1. 举例说明

x1为即时变量,在用时c的值还未确定为空,所以打印结果为空

x2为延时变量,执行完时,c的值为100,所以打印结果为100

x3与x2也是延时变量,

在4,5行皆是对原本值附加d的值,x1是即时变量,附加后也是,附加时d的结果未确定,所以还是为空。而x2是延时变量,追加后也是延时变量,结果值自然可以附加后面d定义的值。

    • 常用函数

参数与函数名以空格隔开,参数之间用逗号隔开

函数1.foreach

用法:将list的所有值拿出来赋给var,再执行text,

eg:

结果:

函数2.filter与filter-out

用法:在text中取出符合pattern格式的值

用法:取出text中不符合pattern格式的值

eg:

函数3:wildcard pattern

用法:pattern定义了文件名的格式,wildcard取出其中存在的文件

eg:

释义:当前目录下含有a.c b.c文件,运用wildcard函数后,它会将将files中真实存在的文件拿出来,也就是a.c和b.c

函数4:patsubst

说明:将var的值全部拿出来,将符合pattern格式的值替换为replacement格式,不符合格式的不做改变

eg:

    • 常见符号

*:在系统里匹配的通配符

%:在makefile里匹配的通配符

$@:目标文件

$<:第一个依赖文件

$^:所有的依赖文件

$?:依赖中比目标新的文件

好了,到这儿我们应该编写一些基本的makefile是没有多大的问题了,基础篇到这儿就结束了,所有内容只是我的一些实验和结果总结,如果有错误还请指出,接下来还有一些补充,后面总结完再发

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值