mikefile函数与实用模板

文章目录

  • 0.概述
  • 1.函数调用语法
  • 2.字符串处理函数
    • 2.1 subst(字符串替换函数)
    • 2.2 patsubst(模式字符串替换函数)
    • 2.3 strip(去空格函数)
    • 2.4 findstring(查找字符串函数)
    • 2.5 filter(过滤函数)
    • 2.6 filter-out(反过滤函数)
    • 2.7 sort(排序函数)
    • 2.8 word(取单词函数)
    • 2.9 wordlist(取单词串函数)
    • 2.10 words(单词个数统计函数)
    • 2.11 firstword(首单词函数——firstword)
  • 3.文件名操作函数
    • 3.1 dir(取目录函数)
    • 3.2 notdir(取文件函数)
    • 3.3 suffix(取後缀函数)
    • 3.4 basename(取前缀函数)
    • 3.5 addsuffix(加后缀函数)
    • 3.6 addprefix(加前缀函数)
    • 3.7 join(连接函数)
  • 4. 其他函数
    • 4. 1 foreach 函数(几乎是仿照for语句)
    • 4. 2 if 函数(类似make所支持的条件语句——ifeq)
    • 4. 3 call 函数(创建新的参数化的函数)
    • 4. 4 origin函数(变量是哪里来的)
    • 4. 5 shell函数(Shell的命令)
    • 4. 6 控制make的函数
  • 5. 补充
    • 5.1 wildcard
  • 6. 实用模板
    • 6.1 实例1
    • 6.2 实例2(生成多目标)
    • 6.3 实例3(根据输入生成多目标)

0.概述

在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能。

makefile详细消息见makefile经验总结。部分函数是工作中遇到的补充。

1.函数调用语法

函数调用,很像变量的使用,也是以 $ 来标识的,其语法如下:

$(<function> <arguments>)

或是:

${<function> <arguments>}

function 就是函数名,make支持的函数不多。 arguments 为函数的参数,参数间以逗号 , 分隔,而函数名和参数之间以“空格”分隔。函数调用以 $ 开头,以圆括号或花括号把函数名和参数括起。感觉很像一个变量,是不是?函数中的参数可以使用变量,为了风格的统一,函数和变量的括号最好一样。
示例:

comma:= ,
empty:=
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))

在这个示例中, $(comma) 的值是一个逗号。 $(space) 使用了 $(empty) 定义了一个空格, $(foo) 的值是 a b c , $(bar) 的定义用,调用了函数 subst ,这是一个替换函数,这个函数有三个参数,第一个参数是被替换字串,第二个参数是替换字串,第三个参数是替换操作作用的字串。这个函数也就是把 $(foo) 中的空格替换成逗号,所以 $(bar) 的值是 a,b,c 。

2.字符串处理函数

2.1 subst(字符串替换函数)

在这里插入图片描述

2.2 patsubst(模式字符串替换函数)

在这里插入图片描述

2.3 strip(去空格函数)

在这里插入图片描述

2.4 findstring(查找字符串函数)

在这里插入图片描述

2.5 filter(过滤函数)

在这里插入图片描述

2.6 filter-out(反过滤函数)

在这里插入图片描述

2.7 sort(排序函数)

在这里插入图片描述

2.8 word(取单词函数)

在这里插入图片描述

2.9 wordlist(取单词串函数)

在这里插入图片描述

2.10 words(单词个数统计函数)

在这里插入图片描述

2.11 firstword(首单词函数——firstword)

在这里插入图片描述
以上,是所有的字符串操作函数,如果搭配混合使用,可以完成比较复杂的功能。这里,举一个现实中应用的例子。我们知道,make使用 VPATH 变量来指定“依赖文件”的搜索路径。于是,我们可以利用这个搜索路径来指定编译器对头文件的搜索路径参数 CFLAGS ,如:

override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))

如果我们的 $(VPATH) 值是 src:…/headers ,那么 ( p a t s u b s t (patsubst %,-I%, (patsubst(subst :, ,$(VPATH))) 将返回 -Isrc -I…/headers ,这正是cc或gcc搜索头文件路径的参数。

3.文件名操作函数

下面我们要介绍的函数主要是处理文件名的。每个函数的参数字符串都会被当做一个或是一系列的文件名来对待。

3.1 dir(取目录函数)

在这里插入图片描述

3.2 notdir(取文件函数)

在这里插入图片描述

3.3 suffix(取後缀函数)

在这里插入图片描述

3.4 basename(取前缀函数)

在这里插入图片描述

3.5 addsuffix(加后缀函数)

在这里插入图片描述

3.6 addprefix(加前缀函数)

在这里插入图片描述

3.7 join(连接函数)

在这里插入图片描述

4. 其他函数

4. 1 foreach 函数(几乎是仿照for语句)

在这里插入图片描述

4. 2 if 函数(类似make所支持的条件语句——ifeq)

在这里插入图片描述

4. 3 call 函数(创建新的参数化的函数)

在这里插入图片描述

4. 4 origin函数(变量是哪里来的)

在这里插入图片描述

4. 5 shell函数(Shell的命令)

在这里插入图片描述

4. 6 控制make的函数

在这里插入图片描述

5. 补充

5.1 wildcard

$(wildcard <PATTERN...>)

用于获取匹配该模式下的所有文件列表,<PATTERN…>参数若有多个则用空格分隔。若没有找到指定的匹配模式则返回为空。

在这里插入图片描述

6. 实用模板

基于工作经验编写的makefile 模板,基本满足日常需求。

6.1 实例1

#目标文件
TARGET = targe_bin
#目标路径
CUR_PATH = .#获取所有c cpp文件
DIRS = $(shell find $(CUR_PATH) -maxdepth 10 -type d)
SRC = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))
CSRC = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))
CCSRC = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cc))
# 将所有.c,.cpp文件改为对应的.o文件
OBJS = $(patsubst %.cpp,${DIR_OBJ}/%.o,$(notdir ${SRC})) 
COBJS = $(patsubst %.c,${DIR_OBJ}/%.o,$(notdir ${CSRC})) 
CCOBJS = $(patsubst %.cc,${DIR_OBJ}/%.o,$(notdir ${CCSRC})) #确认.c文件路径
VPATH = $(DIR_SRC):$(XXX)
  1. 使用shell函数find 列出搜索路径下所有的文件列表
    在这里插入图片描述
  2. 通过foreach函数轮询find函数搜索结果,通过wildcard函数展开.cpp .c .cc文件,注意结果中包含路径
  3. 通过notdir函数去除第二步中的路径,再调用patsubst函数将.cc .c .cpp 文件转换为.o文件。

编译选项配置环节合库的链接。

#c语言编译选项
CFLAGS += -W -fPIC -DNONUTF8CONV -DELPP_NO_DEFAULT_LOG_FILE '-Wno-implicit-fallthrough' -Wfatal-errors
#cc cpp规则
CPPFLAGS += $(CFLAGS) -std=c++14 -fpermissive -no-pieLIBS += -L./lib -Lxxx
LIBS +=  -lpthread -lxxxINC += -I./ -I/xxx

目标生成

all: dir_check ${OBJS} ${COBJS} ${CCOBJS}$(CXX) $(CPPFLAGS) -g ${OBJS} ${COBJS} ${CCOBJS} -o ${BIN_TARGET} $(LIBS)#$(CXX) $(CPPFLAGS) -g ${OBJS} ${COBJS} ${CCOBJS} -o ${BIN_TARGET} $(LIBS)
#编译所有源文件
${DIR_OBJ}/%.o:%.cpp$(CXX) $(CPPFLAGS) $(INC) -c $< -o $@ $(LIBS)
${DIR_OBJ}/%.o:%.cc$(CXX) $(CPPFLAGS) $(INC) -c $< -o $@ $(LIBS)
${DIR_OBJ}/%.o:%.c$(CC) $(CFLAGS) $(INC) -c $< -o $@ $(LIBS)dir_check: -d ./obj || mkdir -p ./obj.PHONY: clean
clean:rm -rf ${OBJS} ${COBJS} ${CCOBJS} $(BIN_TARGET)

通过自动化变量$@ $< 生成目标.o,通过目标.o生成bin文件。

6.2 实例2(生成多目标)

利用伪目标生成多目标,make一次生成多个。

# this is the build file for project 
# it is autogenerated by the xmake build system.
# do not edit by hand.MXX=/usr/bin/gcc
AS=/usr/bin/gcc
CXX=/usr/bin/gcc
MM=/usr/bin/gcc
CC=/usr/bin/gccAR=/usr/bin/ar
SH=/usr/bin/g++
LD=/usr/bin/g++example.out_CXXFLAGS=-m64 -g -xxx 
example.out_LDFLAGS=-m64 -g -Llib/linux -s -liclient -lcurl -lpthread -ldliclient_CXXFLAGS=-m64 -g -xxx
iclient_ARFLAGS=-crall:  iclient example.out #.PHONY: all  example.out iclient
.PHONY: all  example.out iclientexample.out: bin/example.out
bin/example.out: a.o b.o  c.o  linking.release example.out -p bin@$(LD) -o bin/example.out a.o: a.cpp a.cpp -p build@$(CXX) -c -g $(example.out_CXXFLAGS) -o a.o example/a.cpp > build/.build.log 2>&1b.o: b.cpp b.cpp -p build@$(CXX) -c -g $(example.out_CXXFLAGS) -o b.o example/b.cpp > build/.build.log 2>&1c.o: c.cpp c.cpp -p build@$(CXX) -c -g $(example.out_CXXFLAGS) -o c.o example/c.cpp > build/.build.log 2>&1iclient: lib/linux/libiclient.a
lib/linux/libiclient.a: A.o B.o C.o  linking.release libiclient.a -p lib/linux@$(AR) $(iclient_ARFLAGS) lib/linux/libiclient.a A.o B.o C.o  > build/.build.log 2>&1A.o: src/A.cpp compiling.release A.cpp -p build@$(CXX) -c -g $(iclient_CXXFLAGS) -o A.o A.cpp > build/.build.log 2>&1B.o: src/B.cpp compiling.release B.cpp -p build@$(CXX) -c -g $(iclient_CXXFLAGS) -o B.o B.cpp > build/.build.log 2>&1C.o: src/C.cpp compiling.release C.cpp -p build@$(CXX) -c -g $(iclient_CXXFLAGS) -o C.o C.cpp > build/.build.log 2>&1clean:  clean_example.out clean_iclientclean_example.out:  clean_iclient -rf bin/example.out -rf bin/example.out.sym -rf a.o -rf b.o -rf c.oclean_iclient:  -rf lib/linux/libiclient.a -rf lib/linux/iclient.sym -rf A.o -rf B.o -rf C.o

6.3 实例3(根据输入生成多目标)

CXX=/usr/bin/g++
CC=/usr/bin/gccCFLAGS	+=-Wall -g -lstdc++ -lpthread -lcurl -D_FILE_OFFSET_BITS=64 -D_GUN_SOURCE -O2
bin = ./bin/VPATH = ./srcALL: dir_check %:%.cpp$(CXX) $< -o $(bin)$@ $(CFLAGS)dir_check: -d ./bin || mkdir -p ./binclean: -rf $(bin)*.PHONY:clean ALL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/697998.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业网站HTTP网站业务被慢连接攻击了该怎么办

企业的网站建设中遇到网络攻击会出现哪些问题&#xff1f;一些中小型企业对于网络安全的认知不足&#xff0c;网站建设种类众多&#xff0c;电子商城类&#xff0c;小型游戏&#xff0c;支付类型&#xff0c;H5页面的网站&#xff0c;开发等等&#xff0c;如遇见网络攻击造成的…

vue3专栏项目 -- 四、前后端结合(下)

一、async 和 await 1、使用async 和 await 改造异步请求 在接触后端API以后就遇到了越来越多的异步请求&#xff0c;现在我们就使用async 和 await 改造异步请求。 async function是把返回内容包裹成个Promise返回Promise await 它在async function里面才起作用&#xff0…

大厂常见算法50题-两数相加

专栏持续更新50道算法题&#xff0c;都是大厂高频算法题&#xff0c;建议关注, 一起巧‘背’算法! 文章目录 题目解法总结 题目 解法 定义一个节点pre&#xff0c;用于初始化结果链表的头部&#xff0c;cur指向pre&#xff0c;它将在遍历过程中用于构建新的链表。初始化进位变…

Linux实验 Shell编程

实验目的&#xff1a; 熟练掌握Shell程序的建立与执行&#xff1b;掌握Shell变量的两种类型&#xff08;Shell环境变量和用户自定义变量&#xff09;及其用法&#xff1b;掌握Shell中的特殊字符、算术与逻辑运算&#xff1b;掌握Shell中输入输出命令&#xff1b;掌握Shell程序…

学术共振 美妙发声 | 2024美沃斯大会完美收官,米兰柏羽倾力承办

5月10日-5月12日&#xff0c;为期3天的第十七届美沃斯医疗美容大会在杭州国际博览中心盛大举办&#xff0c;作为行业顶级学术交流平台&#xff0c;本届美沃斯大会不仅是医美行业的一次学术交流盛会&#xff0c;更是一次深度探讨行业未来的远眺之窗。 5月9日&#xff0c;即美沃…

Docker 安装 MySQL(Mac电脑M芯片)

Docker 安装 MySQL&#xff08;Mac电脑M芯片&#xff09; 1. 下载MySQL镜像文件2. 创建容器实例2.1 命令参数介绍 3. 容器实例内连接MySQL3.1 进入容器实例后台3.2 连接MySQL 4. DBeaver连接MySQL4.1 连接异常 1. 下载MySQL镜像文件 # 默认下载laster版本 docker pull mysql# …

MPEG-4 AVC/H.264高清编码器 JR3211P

概述 JR3211P MPEG-4 AVC/H.264高清编码器是一款专业的高清音/视频编码产品。该产品支持几乎所有模拟及数字音/视频输入接口&#xff0c;包括CVBS、YPbPr、S-video、SD/HD-SDI、HDMI视频输入接口、平衡模拟音频&#xff08;XLR&#xff09;、非平衡模拟音频&#xff08;RCA&am…

百度云内容审核

百度云内容审核介绍 百度智能云内容审核平台&#xff1a;是一款针对多媒体内容进行智能审核的服务平台。支持对图像、文本、音频、视频、直播等内容进行安全审核&#xff0c;具有精准的审核模型、丰富的审核维度、灵活的规则配置等特点。通过可视化界面选择审核维度、个性化调整…

LabVIEW开发RS422通信

LabVIEW开发RS422通信 项目围绕LabVIEW软件开发的程序在RS422通信技术检测方面的应用进行展开&#xff0c;通过软件编程将上位计算机虚拟化为检测设备&#xff0c;控制其通信端口与被测产品进行RS422通信&#xff0c;以此检验产品的性能优劣。该虚拟检测仪器在实际测试中表现出…

Adobe Media Encoder ME v24.3.0 解锁版 (视频和音频编码渲染工具)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 解锁版 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 解锁版 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 解锁版 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 解锁版 (视…

Go框架三件套:Gorm的基本操作

1.概述 这里的Go框架三件套是指 Web、RPC、ORM框架&#xff0c;具体如下: Gorm框架 gorm框架是一个已经迭代了10年的功能强大的ORM框架&#xff0c;在字节内部被广泛使用并且拥有非常丰富的开源扩展。 Kitex框架 Kitex是字节内部的Golang微服务RPC框架&#xff0c;具有高性能…

Shell编程之循环语句

目录 一、for循环 for循环实操 二、while循环 while循环实操 三、until循环命令 until循环实操 一、for循环 读取不同的变量值&#xff0c;用来逐个执行同一组命 for 变量 in 取值列表 do 命令序列 done [rootlocalhost ~]# for i in 1 2 3 4 5 > do > echo "…