Makefile学习笔记之shell命令调用及目录处理
0. 前言
前面一节我们学习了 make 的基本使用规则以及变量定义赋值方法,可以写一些简单的实例。
-
target ... : prerequisites ... command ... ...
在使用 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)。转载请注明出处!
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。