zoukankan      html  css  js  c++  java
  • Makefile学习笔记之shell命令调用及目录处理

    0. 前言

    前面一节我们学习了 make 的基本使用规则以及变量定义赋值方法,可以写一些简单的实例。

    在使用 make 进行开发的过程中,我们常常会遇到一些需要在 Makefile 中与系统进行通信或者
    对文件/文件夹名称进行获取并进一步处理的情况,本节就来学一下 make 语法中的相关操作。

    1. make 中调用shell命令

    在 Makefile 中调用shell 命令有两种形式。

    • 1.1 第一种是为了获取命令在shell环境中的执行结果。

      利用 $(shell commmand) 作为基本结构,不需要放在基本规则格式以制表符Tab开始的 command 位置处,我们提到的基本规则格式及文章开头展示的 target-prerequisted-command 的形式。如下示例

      CUR_DIR := $(shell pwd)
      CUR_TIME := $(shell date)
      FILE_LIST := $(shell ls *.c)
      
      all:
      	@echo $(CUR_DIR)
      	@echo $(CUR_TIME)
      	@echo $(FILE_LIST)
      

      输出的结果如下

      /home/cv/test
      2021年 7月19日 星期一 19时58分25秒 CST
      /home/cv/test/src/playground.c /home/cv/test/src/template.c
      
    • 1.2 第二种是在单纯执行指定的命令以进行特定的操作。

      用在基本规则格式的 command 处,例如打印信息、创建文件夹、删除中间文件等等。

      all:
      	mkdir build
      
      clean:
      	rm hello_test build/*.o
      

    2. 对文件夹/文件名称进行操作

    2.1 获取文件目录路径

    DIR_PATH = $(dir /home/cv/misc_codes/project/src/main.c)
    

    该指令的功能是从文件名序列中取出目录部分,返回值为目录部分,指的是最后一个反斜杠之前的部分。如果文件名中没有反斜杠将返回“./”。
    上面的指令结果是返回 /home/cv/misc_codes/project/src

    2.2 获取不含目录的文件名

    FILE_NAME = $(notdir /home/cv/misc_codes/project/src/main.c)
    

    该指令的功能是从文件名序列中取出非目录的部分,即最后一个反斜杠之后的部分。返回值为文件非目录的部分。
    上面的指令结果为 main.c

    2.3 获取文件后缀名

    RESULT = $(suffix /home/cv/misc_codes/project/src/main.c)
    

    该指令的功能是从文件名序列中取出各个文件的后缀名。返回值为文件名序列中的后缀序列,如果文件没有后缀名,则返回空字符串。
    上面的指令结果为 .c

    2.4 获取不含后缀的文件名

    RESULT = $(basename /home/cv/misc_codes/project/src/main.c)
    

    该指令的功能是从文件名序列中取出各个文件名的前缀部分。返回值为被取出来的文件的前缀名,包含文件目录的路径,如果文件没有前缀名则返回空的字符串。
    上面的指令结果为 /home/cv/misc_codes/project/src/main

    2.5 为文件添加前缀

    RESULT = $(addprefix /home/cv/misc_codes/project/src/, main.c)
    

    该指令的功能是把前缀加到文件名序列中的每个文件名的前面。返回值为添加上前缀的文件名序列。
    上面的指令结果为 /home/cv/misc_codes/project/src/main

    添加后缀的函数与此基本相同,使用的是 addsuffix

    2.6 拼接函数

    $(join <list1>,<list2>)
    

    该指令的功能是把 list2 的单词对应的拼接到 list1 的后面。
    如果 list1 的单词要比 list2的多,那么,list1 中多出来的单词将保持原样,如果 list1 中的单词要比 list2 中的单词少,那么 list2 中多出来的单词将保持原样。

    2.7 获取匹配模式文件名函数

    $(wildcard <PATTERN>)
    

    函数的功能是列出当前目录下所有符合模式的 PATTERN 格式的文件名。返回值为空格分隔并且存在当前目录下的所有符合模式 PATTERN 的文件名。

    (全文完)


    参考资料

    [1] Makefile常用文件名操作函数 http://c.biancheng.net/view/7081.html

    [2] Shell脚本——make命令和Makefile文件 https://blog.csdn.net/twc829/article/details/72729799

    本文作者 :phillee
    发表日期 :2021年7月19日
    本文链接https://www.cnblogs.com/phillee/p/15020046.html
    版权声明 :自由转载-非商用-非衍生-保持署名(创意共享3.0许可协议/CC BY-NC-SA 3.0)。转载请注明出处!
    限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

  • 相关阅读:
    谈谈关于MVP模式中V-P交互问题
    Delphi MVC模 2
    Delphi MVC模式 1
    Java长整除问题
    Java中Scanner类的简单用法
    Java中throw和throws的区别
    Java必须掌握的运算符
    Java编程多重循环
    Java实现三种简单的排序
    使用Java向properties存数据
  • 原文地址:https://www.cnblogs.com/phillee/p/15020046.html
Copyright © 2011-2022 走看看