makefile

介绍

# 目标       依赖目标
foo.o: foo.c defs.h
# 			   命令
	cc -c -g foo.c

关键字

  • @:用于命令前,在执行makefile时避免显示命令本身
  • -:用于命令前,不管命令执行成功与否都认为执行成功
  • exportunexport:传递/禁止传递变量到下级makefile中;默认只有命令行参数会向下传递,若想传递文件中的变量,需要使用export关键字声明
  • override:若make有命令行参数,那么makefile中对这个变量的赋值会被忽略。如果想在makefile中设置这类参数的值,那么可以给在变量赋值前面加上override
  • vpath:指定不同的文件在不同的搜索目录中
    • vpath <pattern> <directories>:为符合模式的所有文件指定搜索目录
    • vpath <pattern>:清除符合模式的文件的搜索目录
    • vpath:清除所有设置好的文件搜索目录
  • include:类似C语言中的#include,可将其他makefile文件展开到当前makefile中
  • defineendefifdefifndefifeqifneqendifelse:类似C语言中的条件编译,define可以用于定义命令包

变量

  • 赋值

    • = :直接赋值,允许此前未定义的变量赋值
    • :=:不允许此前未定义的变量赋值
    • +=:对变量进行追加,若变量此前未定义则默认先前规则为=;若变量此前定义,则根据先前定义规则进行追加
  • 环境变量

    • CCCFLAGMAKEMAKEFILESVPATH
  • 目标变量

    • <target>: <variable-assignment>:当设置了这样一个变量,此变量会作用到由这个目标锁引发的所有规则中,具有局部性;目标可以使用模式,如此变量会作用在符合模式的所有目标上
  • 自动化变量

    • $@:目标
    • $<:第一个依赖目标
    • $?:所有比目标新的依赖目标的集合
    • $^:所有依赖目标的集合,去除重复依赖目标
    • $+:所有依赖目标的集合,不去除重复依赖目标

规则

  • 显式规则

    • 当依赖目标新于目标时,执行当前目标下的命令
    • 命令规则为Unix下的文件规则
    • 伪目标:
      • 对于实际不需要生成文件的目标,我们把它们叫做伪目标
      • 如果伪目标有依赖目标,那么依赖目标将总是被检查
      • 用一个特殊目标.PHONY来显式指明伪目标,保持它是一个好习惯
    • 自动生成依赖性:
      • 编译器支持参数-M,可以生成.d文件,其中有目标文件的依赖关系,可以直接通过makefile中的关键字include将其加入makefile中
      • GNU的编译器需要用参数-MM,不然.d文件中会包含一些标准库的头文件
      • 如果使用参数-MD-MMD,那么编译器会从.c同时生成.o.d文件
  • 隐含规则

    • make会运行一些makefile中没有写出的规则,例如把.c文件编译成.o,就算你不写,make也会自动推导出这种规则,并生成.o文件
  • 模式规则

    • <target-pattern>: <prereq-pattern>; <command>;

    • % 的展开发生在变量和函数的展开之后,变量和函数的展开发生在make载入 Makefile时,而模式规则中的 % 则发生在运行时。

  • 静态模式规则

    • <target>: <target-pattern>: <prereq-patterns>
  • 后缀规则(弃用)

函数

函数格式:S(<function> <arguments>)

  • 字符串函数
    • subst$(subst <from>,<to>,<text>)
      • 将串<text>中的<from>替换为<to>
      • 返回替换后的串
    • patsubst$(patsubst <pattern>,<replacement>,<text>)
      • 基本与subst相同,前两个参数可以使用模式匹配
    • strip$(strip <string>)
      • 去掉串开头和结尾的空字符
      • 返回去掉空格后的串
    • findstring$(findstring <find>,<to>)
      • 在串<in>中查找串<find>
      • 找到则返回串<find>,否则返回空串
    • filter$(filter <pattern...>,<text>)
      • 以模式<pattern>过滤串<text>,保留符合模式的子串,可以有多个模式
      • 返回符合模式的子串
    • filter-out$(filter-out <pattern...>,<text>)
      • 作用与filter相反,去除符合模式的子串
      • 返回不符合模式的子串
    • sort$(sort <list>)
      • 升序排序串中的子串,并去除重复的子串
      • 返回排序后的串
    • word$(word <n>,<text>)
      • 取串<text>中的第<n>个子串(从1开始)
      • 返回串<text>的第<n>个子串;若<n>大于<text>的子串数,返回空串
    • wordlist$(wordlist <ss>,<e>,<text>)
      • 从串<text>中取从<ss>开始到<e>(闭区间)的子串
      • 返回串<text><ss><e>的子串;若<ss>大于<text>子串数,返回空串;若<e>大于<text>子串数,返回<ss>到串<text>结束的子串
    • words$(words <text>)
      • 统计串<text>中子串个数
      • 返回串<text>中的子串数
    • firstword$(firstword <text>)
      • 取串<text>的第一个子串
      • 返回串<text>的第一个子串
  • 文件函数
    • dir$(dir <names...>)
      • 从文件名集<names...>中取出目录部分
      • 返回文件名集<names...>的目录部分;如果子串没有/,那么返回./
    • notdir$(notdir <names...>)
      • 从文件名集<names...>中取出非目录部分
      • 返回文件名集<names...>的非目录部分
    • suffix$(suffix <names...>)
      • 从文件名集<names...>中取出各个子串的后缀
      • 返回文件名集<names...>中各个子串的后缀
    • basename$(basename <names...>)
      • 从文件名集<names...>中取出各个子串的前缀
      • 返回文件名集<names...>中各个子串的前缀
    • addsuffix$(addsuffix <suffix>,<names...>)
      • 把后缀suffix加到文件名集<names...>的每个子串后
      • 返回加过后缀的文件名序列
    • addprefix$(addprefix <prefix>,<names...>)
      • 把前缀prefix加到文件名集<names...>的每个子串前
      • 返回加过前缀的文件名序列
  • 其他函数
    • join
    • foreach
    • if
    • call
    • origin
    • shell
  • 控制make的函数
    • error
    • warning
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值