mikefile函数与实用模板

news2024/11/17 0:07:48

文章目录

  • 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(生成多目标)

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-pie

LIBS += -L./lib -Lxxx
LIBS +=  -lpthread -lxxx
 
INC += -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/gcc

AR=/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 -ldl

iclient_CXXFLAGS=-m64 -g -xxx
iclient_ARFLAGS=-cr

all:  iclient example.out 

#.PHONY: all  example.out iclient
.PHONY: all  example.out iclient

example.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>&1

b.o: b.cpp
	 b.cpp
	 -p build
	@$(CXX) -c -g $(example.out_CXXFLAGS) -o b.o example/b.cpp > build/.build.log 2>&1
	
c.o: c.cpp
	 c.cpp
	 -p build
	@$(CXX) -c -g $(example.out_CXXFLAGS) -o c.o example/c.cpp > build/.build.log 2>&1



iclient: 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>&1

A.o: src/A.cpp
	 compiling.release A.cpp
	 -p build
	@$(CXX) -c -g $(iclient_CXXFLAGS) -o A.o A.cpp > build/.build.log 2>&1

B.o: src/B.cpp
	 compiling.release B.cpp
	 -p build
	@$(CXX) -c -g $(iclient_CXXFLAGS) -o B.o B.cpp > build/.build.log 2>&1
	
C.o: src/C.cpp
	 compiling.release C.cpp
	 -p build
	@$(CXX) -c -g $(iclient_CXXFLAGS) -o C.o C.cpp > build/.build.log 2>&1


clean:  clean_example.out clean_iclient

clean_example.out:  clean_iclient
	 -rf bin/example.out
	 -rf bin/example.out.sym
	 -rf a.o
	 -rf b.o
	 -rf c.o

clean_iclient: 
	 -rf lib/linux/libiclient.a
	 -rf lib/linux/iclient.sym
	 -rf A.o
	 -rf B.o
	 -rf C.o

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大型模型技术构建本地知识库

使用大型模型技术构建本地知识库是一个复杂的过程&#xff0c;涉及到数据科学、机器学习和软件工程等多个领域的知识。以下是构建本地知识库的一般步骤。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求分析&#xff1a; 确定知…

java版数据结构:堆,大根堆,小根堆

目录 堆的基本概念&#xff1a; 如何将一个二叉树调整成一个大根堆&#xff1a; 转成大根堆的时间复杂度 根堆中的插入&#xff0c;取出数据&#xff1a; 堆的基本概念&#xff1a; 堆是一种特殊的树形数据结构&#xff0c;它满足以下两个性质&#xff1a; 堆是一个完全二叉…

常见物联网面试题详解

物联网一直是非常火热的行业&#xff0c;G端如智慧城市、智慧工厂、智慧园区、智慧水利、智慧矿山等行业&#xff0c;都会涉及到物联网&#xff0c;基本都是软硬一体&#xff0c;因此当面试相关企业时&#xff0c;物联网平台是面试企业重点考察的项&#xff0c;小伙伴如果从事相…

网络安全在数字时代的重要性:以近期网络安全事件为镜

在当今这个信息化爆炸的时代&#xff0c;互联网如同一张无形的网&#xff0c;将我们的生活、工作、学习紧密相连。然而&#xff0c;这张网在带来便捷的同时&#xff0c;也暗藏着无数的安全隐患。近年来&#xff0c;网络安全事件频发&#xff0c;从个人隐私泄露到企业数据被盗&a…

中国地图(2024版审图号地图)和地图变化说明

2024版shp格式审图号地图预览图&#xff1a; 新版中国地图的变化&#xff08;简述&#xff09; 国土面积的增加&#xff1a;新版中国地图显示&#xff0c;中国的国土面积从960万平方公里增加到1045万平方公里&#xff0c;增加了85万平方公里。 九段线变为十段线&#xff1a;…

如何使用 ArcGIS Pro 制作地震动画

在做某些汇报的时候&#xff0c;除了图文&#xff0c;如果有动画肯定会成为加分项&#xff0c;这里为大家介绍一下如何使用 ArcGIS Pro 制作地震动画&#xff0c;希望能对你有所帮助。 添加时间 在图层属性内&#xff0c;选择时间选项卡&#xff0c;图层时间选择每个要素具有…

每日两题 / 226. 翻转二叉树 98. 验证二叉搜索树(LeetCode热题100)

226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 以后续遍历的方式交换当前节点的左右指针 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), ri…

自适应调节Q和R的自适应UKF(AUKF_QR)的MATLAB程序

简述 基于三维模型的UKF&#xff0c;设计一段时间的输入状态误差较大&#xff0c;此时通过对比预测的状态值与观测值的残差&#xff0c;在相应的情况下自适应调节系统协方差Q和观测协方差R&#xff0c;构成自适应无迹卡尔曼滤波&#xff08;AUKF&#xff09;&#xff0c;与传统…

你可能喜欢但也许还不知道的好用网站-搜嗖工具箱

在线工具 https://www.zxgj.cn/ 作为一个工作生活好帮手&#xff0c;在线咨询网站提供了丰富的实用功能&#xff0c;从工作中的图表制作、图片修改到生活中的各种测试、健康、娱乐、学习、理财等等涵盖面很广。 在线工具网站从界面和操作上来看对用户也很友好&#xff0c;页面…

提高Rust安装与更新的速度

一、背景 因为rust安装过程中&#xff0c;默认的下载服务器为crates.io&#xff0c;这是一个国外的服务器&#xff0c;国内用户使用时&#xff0c;下载与更新的速度非常慢&#xff0c;因此&#xff0c;我们需要使用一个国内的服务器来提高下载与更新的速度。 本文推荐使用字节…

谷歌地图商家采集在外贸客户开发中的作用和意义

谷歌地图商家采集在外贸客户开发中扮演着至关重要的角色&#xff0c;其主要作用和意义体现在以下几个方面&#xff1a; 精准定位目标市场&#xff1a;通过谷歌地图&#xff0c;外贸人员可以根据特定的行业关键词&#xff08;如“fabric stores”&#xff09;搜索目标国家或地区…

Redis加入系统服务,开机自启

vi /etc/systemd/system/redis.service i :wq #加载服务配置文件 systemctl daemon-reload #启动redis systemctl start redis #设置开机自启 systemctl enable redis #查看启动状态 systemctl status redis

11.买卖股票的最佳时机Ⅰ

文章目录 题目简介题目解答解法一&#xff1a;一次遍历代码&#xff1a;复杂度分析&#xff1a; 题目链接 大家好&#xff0c;我是晓星航。今天为大家带来的是 买卖股票的最佳时机面试题Ⅰ 相关的讲解&#xff01;&#x1f600; 题目简介 题目解答 解法一&#xff1a;一次遍历…

汗之谜语,流产之哀:肾合唤醒生命花园的璀璨绽放

在这个疾驰的时代洪流中&#xff0c;女性宛若四季更迭间绚烂绽放的花朵&#xff0c;她们在风雨的锤炼与暖阳的抚慰下&#xff0c;演绎着生命的绚烂篇章。但当这份细腻柔美的内在花园偶遇冷冽寒潮&#xff0c;诸如汗水的异常涌动与生命的意外流失&#xff0c;就如同春暖花开之际…

01面向类的讲解

指针指向类成员使用 代码&#xff1a; #include<iostream> using namespace std;class Test { public:void func() { cout << "call Test::func" << endl; }static void static_func();int ma;static int mb; //不依赖对象 }; void Test::static…

【强化学习-Mode-Free DRL】深度强化学习如何选择合适的算法?DQN、DDPG、A3C等经典算法Mode-Free DRL算法的四个核心改进方向

【强化学习-DRL】深度强化学习如何选择合适的算法&#xff1f; 引言&#xff1a;本文第一节先对DRL的脉络进行简要介绍&#xff0c;引出Mode-Free DRL。第二节对Mode-Free DRL的两种分类进行简要介绍&#xff0c;并对三种经典的DQL算法给出其交叉分类情况&#xff1b;第三节对…

基于VOLOPV2的自动驾驶环境感知系统

基于VOLOPV2的自动驾驶环境感知系统是一个复杂的系统&#xff0c;它主要负责实时检测并识别周围环境中的各种物体和信息&#xff0c;为自动驾驶车辆提供必要的感知数据。以下是对该系统的一个简要介绍&#xff1a; 环境感知是自动驾驶系统中的一个关键部分&#xff0c;它依赖于…

揭秘全网都在搜索的抖音快速涨10000粉的方法,打造真实粉丝海洋!巨量千川投流

抖音作为当下最热门的社交媒体平台之一&#xff0c;拥有数以亿计的用户。对于许多用户来说&#xff0c;快速涨粉成为了一个追逐的目标。在这篇文章中&#xff0c;我们将揭秘一些全网都在搜索的抖音快速涨粉方法&#xff0c;帮助你打造属于自己的真实粉丝海洋。巨量千川投流&…

将机械手与CodeSys中的运动学模型绑定

文章目录 1.背景介绍2.选定运动学模型3.机械手各尺寸的对应4.总结4.1.选择正确的运动学模型4.2.注意各个关节旋转的正方向。4.3.编码器零点与机械零点的偏移修正。 1.背景介绍 最近搞到了一台工业机械手&#xff0c;虽然这个机械手有自己的控制程序&#xff0c;但是我们还是想…

概述篇——计算机网络学习笔记(基于谢希仁教材与PPT)

教材用的是谢希仁的教材&#xff0c;图片来源于谢希仁老师配套的PPT 计算机网络课程PPT&#xff08;通过这个链接&#xff0c;你可以找到课程配套的ppt&#xff09; 计算机网络的定义及其特点 定义 网络 过去大众熟知的三种网络分别是提供电话、电报及传真等服务的电信网络&am…