zoukankan      html  css  js  c++  java
  • Makefile之patsubst

     

     经常要手写项目的Makefile,或者看其他项目的遗留项目的Makefile,有些makefile内置函数常用,
    却用完就忘记了,最近项目中使用patsubst,感觉挺好用的
     
     
    格式:$(patsubst <pattern>,<replacement>,<text> ) 

    名称:模式字符串替换函数——patsubst。
    功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。

       这里,<pattern>可以包括通配符“%”,表示任意长度的字串。如果<replacement>中也包含“%”,那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。

       (可以用“\”来转义,以“\%”来表示真实含义的“%”字符)
    返回:函数返回被替换过后的字符串。

    示例:

    $(patsubst %.c,%.o, a.c b.c)

    把字串“a.c b.c”符合模式[%.c]的单词替换成[%.o],返回结果是“a.o b.o”

    make中有个变量替换引用

    对于一个已经定义的变量,可以使用“替换引用”将其值中的后缀字符(串)使用指定的字符(字符串)替换。格式为“$(VAR:A=B)”(或者“${VAR:A=B}”),

    意思是,替换变量“VAR”中所有“A”字符结尾的字为“B”结尾的字。“结尾”的含义是空格之前(变量值多个字之间使用空格分开)。而对于变量其它部分的“A”字符不进行替换。

    例如: 

    foo := a.o b.o c.o

    bar := $(foo:.o=.c)

    在这个定义中,变量“bar”的值就为“a.c b.c c.c”。使用变量的替换引用将变量“foo”以空格分开的值中的所有的字的尾字符“o”替换为“c”,其他部分不变。

    如果在变量“foo”中如果存在“o.o”时,那么变量“bar”的值为“a.c b.c c.c o.c”而不是“a.c b.c c.c c.c”。



    例子:
    使用以下3个内置函数
    1、wildcard : 扩展通配符
    2、notdir : 去除路径
    3、patsubst :替换通配符

    建立一个测试目录,在测试目录下建立一个名为sub的子目录
    $ mkdir  mk
    $ cd mk
    $ mkdir sub

    在mk下,建立a.c和b.c 2个文件,在sub目录下,建立aa.c和bb.c 2 个文件

    建立一个简单的Makefile
    src=$(wildcard *.c ./sub/*.c)
    file=$(notdir $(src))
    obj=$(patsubst %.c,%.o,$(src) )

    all:
      @echo $(src)  
      @echo $(file)
      @echo $(obj)


    执行结果分析:
    第一行输出:
    a.c b.c ./sub/aa.c ./sub/bb.c

    wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。

    第二行输出:
    a.c b.c aa.c bb.c
    notdir把展开的文件去除掉路径信息

    第三行输出:
    a.o b.o aa.o bb.o

    在$(patsubst %.c,%.o,$(src) )中,patsubst把$(file)中的变量符合后缀是.c的全部替换成.o,
    任何输出。
    或者可以使用
    obj=$(file:%.c=%.o)
    效果也是一样的。

  • 相关阅读:
    Java文档注释
    Java程序基本框架
    Java文件手动编译执行步骤
    JDK安装中配置Path无效解决办法
    JDK安装配置
    Java简单介绍运行机制
    python代码注释
    python从hello world开始
    python,pycharm,anaconda之间的区别与联系
    python环境配置
  • 原文地址:https://www.cnblogs.com/geeker/p/4455538.html
Copyright © 2011-2022 走看看