Makefile学习笔记之shell命令调用及目录处理

摘要:
all:mkdirbuildclean:rmhello_Testbuild/*。o2.对文件夹/文件名进行操作2.1获取文件目录路径DIR_ path=$此命令的功能是从文件名序列中获取目录部分。返回值是目录部分,它指的是最后一个反斜杠之前的部分。上面的指令结果是/home/cv/misc_codes/project/src/main

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)。转载请注明出处!
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

免责声明:文章转载自《Makefile学习笔记之shell命令调用及目录处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇获取用户IP地址,防钓鱼批量横向打印Excel下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Json 的日期格式转化(时区标准化)

在JavaScript中,这无疑可以通过初始化Data()对象//converttomsecsinceJan11970localTime=d轻松完成。获取时间();步骤2:接下来,通过Data()对象的getTimezoneOffset()方法//obtainlocalUTCoffsetandconverttomseclocalOffset=d找出本地时间偏...

Android开发 Camera2的CaptureRequest属性整理--完善中

当android.control.aeExposureCompensation改变时,即使AE锁定为ON,则相机设备将仍然调整其曝光值。如果android.control.aeMode是ON_ALWAYS_FLASH,现场可能会变得过度曝光。同样,AEprecapture触发取消了当AE已被锁定没有影响。见android.control.aeState为AE...

(二)Jenkins配置主从节点实例

4.从节点配置和相关配置中从节点机创建jenkins用户,并从一些环境配置中创建jenkings用户的ssh密钥,用于指定上述配置界面的ssh启动模式;在配置启动模式和项目源代码管理中从远程仓库获取源代码;创建Jenkins用户并使用root登录到远程子节点计算机。#adduserjenkins#passwdjenkins生成Jenkins用户的ssh密钥。...

数据可视化之powerBI技巧(十四)采悟:PowerBI中自制中文单位万和亿

最令人不快的事情之一是数据单元的设置。现在让我们看看如何通过设置测量值来切换单位。需要动态选择1万元和1亿元的单位进行显示。首先,手动创建单位表,然后使用单位表中的[unit]字段生成切片器。下一步是建立销售衡量标准。销售额=总和('订单'[销售额])为了按过滤单位显示销售额,SELECTEDVALUE函数可以根据切片器选择动态更改分母。如果切片器未进行任何...

antd中,popover 不同情境下设置不同背景图,无法设置className的情况

于是就想通过设置不同的status值来添加不同的className,以设置.ant-popover-inner的样式来设置背景图,当然,这样做有一个不完美的就是不能一步到位的全部改变,需要手动更改.ant-popover-placement-bottom˃.ant-popover-content˃.ant-popover-arrow来替换那个角角的值。问题就...

使用Docker构建redis集群

将六个独立的Redis节点关联到主机上的Redis集群中。Redis部落。rb是Redis官方提供的一个ruby脚本,用于构建Redis集群并修改Redis conf将其移动到上部路径/usr/docker_root/redis_Cluster/。受保护模式norequipassa1s2W3l4%Greunbind无法连接到凹坑以构建Redis基本映像。9....