通用Makefile详解

分析一个Makefile的代码。主要是几个函数的使用

CROSS_COMPILE 	?= arm-linux-gnueabihf-
TARGET			?= ledcCC 					:= $(CROSS_COMPILE)gcc
LD 					:= $(CROSS_COMPILE)ld
OBJCOPY 			:= $(CROSS_COMPILE)objcopy
OBJDUMP				:= $(CROSS_COMPILE)objdumpINCUDIRS			:=  imx6u \bsp/clk \bsp/led \bsp/delaySRCDIRS				:=  project \bsp/clk \bsp/led \bsp/delayINCLUDE				:= $(patsubst %, -I %, $(INCUDIRS))SFILES				:= $(foreach dir, $(SRCDIRS),$(wildcard $(dir)/*.S))
CFILES				:= $(foreach dir, $(SRCDIRS),$(wildcard $(dir)/*.c))SFILESNDIR 			:=$(notdir $(SFILES))
CFILESNDIR 			:=$(notdir $(CFILES))SOBJS				:= $(patsubst %, obj/%, $(SFILESNDIR:.S=.o))
COBJS				:= $(patsubst %, obj/%, $(CFILESNDIR:.c=.o))OBJS 				:= $(SOBJS)$(COBJS)VPATH				:= $(SRCDIRS).PHONY:clean$(TARGET).bin : $(OBJS)$(LD) -Timx6u.lds -o $(TARGET).elf $^$(OBJCOPY) -O binary -S $(TARGET).elf $@$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis$(SOBJS) : obj/%.o :%.S$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<$(COBJS) : obj/%.o :%.c$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<clean:rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).dis $(OBJS)print:@echo INCLUDE = $(INCLUDE)@echo SFILES = $(SFILES)@echo CFILES = $(CFILES)@echo SFILESNDIR = $(SFILESNDIR)@echo CFILESNDIR = $(CFILESNDIR)@echo SOBJS = $(SOBJS)@echo COBJS = $(COBJS)@echo OBJS = $(OBJS)

代码比较容易,就是用变量代替一些需要重复输入的部分,这里详细解释一下使用的几个函数。

patsubst

模式字符串替换函数。基本形式:

$(patsubst<pattern>,<replacement>,<text>)

功能:查找<text>里面的字符串(单词用空格、tab、回车、换行分隔),如果有符合<pattern>的部分,就使用<replacement>代替。注意,text可以是表达式。
看一下例子:

INCLUDE				:= $(patsubst %, -I %, $(INCUDIRS))

这里定义了一个INCLUDE变量,然后在变量INCUDIRS里每个单词前面加-I
通过echo打印,结果就是:

INCLUDE = -I imx6u -I bsp/clk -I bsp/led -I bsp/delay

后面的

SOBJS				:= $(patsubst %, obj/%, $(SFILESNDIR:.S=.o))

其中,$(SFILESNDIR:.S=.o)的意思是把SFILESNDIR这个变量中的.S改为.o

wildcard和foreach

看一下代码:

SFILES				:= $(foreach dir, $(SRCDIRS),$(wildcard $(dir)/*.S))

先说wildcard。这个函数的形式:

$(wildcard <pattern>)

wildcard函数是针对通配符在函数或变量定义中展开无效情况下使用的,用于获取匹配该模式下的所有文件列表。其实就是通配符的展开。
然后是foreach:

$(foreach<var>,<list>,<text>)

把参数<list>里的单词逐一取出,放到<var>所指定的变量里,然后执行<text>。这是一个循环函数。
看例子里的,结合这两个函数,结果就是把SRCDIRS里所有的单词取出来,放到dir里面去,然后执行通配符展开。那么SFILES其实就是定义了项目里所有的.S文件的路径。
echo之后结果就是:

SFILES = project/start.S

notdir

这个很简单,就是获取不带路径的文件名。

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

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

相关文章

要不要从单片机转Linux?进来看看大神怎么说

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;究竟要不要从单片机转Linu…

二维正态结论

关于二维正态分布&#xff0c;需掌握如下结论&#xff1a; &#xff08;1&#xff09;二维正态分布的两个边缘分布均为一维正态分布。 即由&#xff08;X&#xff0c;Y&#xff09;~N&#xff08;μ1&#xff0c;μ2&#xff0c;σ1&#xff0c;σ2&#xff0c;ρ&#xff09…

RabbitMq 消息确认和退回机制

一、Rabbit中消息确认和退回机制 1、发布确认 生产者将信道设置成 confirm 模式&#xff0c;一旦信道进入 confirm 模式&#xff0c;所有在该信道上面发布的消息都将会被指派一个唯一的 ID (从 1 开始)&#xff0c;一旦消息被投递到所有匹配的队列之后&#xff0c;broker 就会…

【面试题】网络 IO多路复用模型 select

目录 1.概念 使用select模型的步骤 select模型特点&#xff1a; Windows 和Linux 有什么区别&#xff1f; 为什么要引入select模型呢 同步阻塞问题我们可以利用多线程 或者把socket改成非阻塞 当我们要接受数据的时候我们要来回查看接受缓冲区有没有数据这样我们就要来回切…

英伟达被“压制”的25年

十九世纪中叶的美国西部&#xff0c;掀起了一场轰轰烈烈的淘金热&#xff0c;但最终赚到钱的&#xff0c;并不是拿命去赌的淘金者。一个名叫萨姆布瑞南的商人&#xff0c;通过向淘金者出售铲子&#xff0c;成了加州历史上第一位百万富翁。 每一次风口出现时&#xff0c;总有企…

使用Qt Installer Framework在centos7中打包

文章目录 步骤 1: 安装Qt和Qt Installer Framework安装Qt安装Qt Installer Framework步骤 2: 创建项目目录结构步骤 3: 编写安装脚本配置文件(config/config.xml)Package 信息meta/package.xmldata 目录步骤 4: 编写安装脚本步骤 5: 生成安装程序总结在CentOS 7中使用Qt Inst…

k8s自动清理节点服务

要在 Kubernetes 中实现当某个节点的 CPU 或内存使用超过 90% 时清理该节点上的服务&#xff0c;你可以使用以下几种方法&#xff1a; 自定义脚本和 cron job&#xff1a;编写一个脚本监控节点的资源使用情况&#xff0c;并在超过阈值时触发清理操作。使用 DaemonSet 运行监控…

互联网下的扭蛋机小程序开发:探索其独特优势

随着互联网技术的飞速发展&#xff0c;小程序作为一种新兴的轻量级应用形式&#xff0c;已经在各个领域展现出强大的生命力和广泛的应用前景。在娱乐和零售行业&#xff0c;扭蛋机作为一种经典的随机性消费体验方式&#xff0c;结合小程序进行开发&#xff0c;带来了诸多独特优…

每日一更 EFK日志分析系统

需要docker和docker-compose环境 下面时docker-compose.yaml文件 [rootnode1 docker-EFK]# cat docker-compose.yaml version: 3.3services:elasticsearch:image: "docker.elastic.co/elasticsearch/elasticsearch:7.17.5"container_name: elasticsearchrestart: …

鲲鹏arm服务器部署paddleOCR

1. 部署环境信息查看 1.1 操作系统 $ cat /etc/os-release PRETTY_NAME"UnionTech OS Server 20" NAME"UnionTech OS Server 20" VERSION_ID"20" VERSION"20" ID"uos" PLATFORM_ID"platform:uel20" HOME_URL&q…

「AIGC」大数据开发语言Scala入门

Scala 是一种多范式编程语言,设计初衷是集成面向对象编程和函数式编程的特点。它运行在 Java 虚拟机(JVM)上,因此可以与 Java 库无缝集成。Scala 也因其在大数据处理领域的应用而受到欢迎,特别是与 Apache Spark 这类框架结合使用。 1. 环境搭建 安装 Scala:可以从 Scala…

使用 Python 五年后,我发现学 python 必看这三本书!少走一半弯路

第一本 《Python编程-从入门到实践》 适合零基础的读者 豆瓣评分&#xff1a;9.1 推荐指数&#xff1a;5颗星 推荐理由&#xff1a; 本书是针对所有层次的 Python 读者而作的 Python 入门书。全书分为两部分&#xff1a; 第一部分介绍使用Python 编程所必须了解的…

CV每日论文--2024.6.28

1、On Scaling Up 3D Gaussian Splatting Training 中文标题&#xff1a;扩展 3D 高斯泼溅训练 简介&#xff1a;3D高斯点描(3DGS)由于其卓越的视觉质量和渲染速度,越来越受欢迎用于3D重建。然而,3DGS的训练目前仅在单个GPU上进行,由于内存限制,它的处理高分辨率和大规模3D重建…

SPU和sku的区别

SPU&#xff08;Standard Product Unit&#xff09;和SKU&#xff08;Stock Keeping Unit&#xff09;是两种常见的商品管理概念&#xff0c;它们在商品分类和管理中扮演着不同的角色。 SPU&#xff08;标准产品单元&#xff09;&#xff1a; 定义&#xff1a;SPU代表了一种标…

java中的抽象类abstract

抽象类 ① 格式&#xff1a;abstract class A {} ② 抽象类不能实例化对象 ③ 抽象类可以没有抽象方法&#xff0c;但是抽象方法所在的类&#xff0c;一定是抽象类 ④ 抽象类中包含构造器&#xff0c;因为在子类实例化对象时&#xff0c;会直接或间接调用父类构造器 抽象方法…

2024 年江西省研究生数学建模竞赛题目 B题投标中的竞争策略问题---完整文章分享(仅供学习)

问题&#xff1a; 招投标问题是企业运营过程中必须面对的基本问题之一。现有的招投标平台有国家级的&#xff0c;也有地方性的。在招投标过程中&#xff0c;企业需要全面了解招标公告中的相关信息&#xff0c;在遵守招投标各种规范和制度的基础上&#xff0c;选择有效的竞争策…

新手教学系列——【Python开发】不同系统更换pip源的方法

在使用Python进行开发时,你可能会发现使用pip安装包的速度较慢,尤其是在国内进行操作时。为了提高安装速度,我们可以将pip的默认源更换为国内的一些镜像源。本文将详细介绍如何在不同操作系统上进行这一操作,并给出常用的国内镜像源。 为什么要换源 pip默认使用的是官方的…

vector::C++

在 C 标准库中&#xff0c;std::vector 是一个动态数组容器&#xff0c;提供了类似于数组的功能&#xff0c;但具有自动调整大小的能力。它是 C 标准模板库&#xff08;STL&#xff09;的一部分&#xff0c;广泛用于存储和管理一组动态大小的元素。 std::vector 的特点 动态大…

axios源码打包关于rollup.config.js文件分析

axios 项目下的rollup.config.js文件 const lib require("./package.json"); const outputFileName "axios"; const name "axios"; const namedInput "./index.js"; const defaultInput "./lib/axios.js";export defa…

怎么彻底关闭Nacos?解决启动时Spring连接Nacos报错

Nacos Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是阿里巴巴开源的一个项目,旨在帮助您发现、配置和管理微服务。Nacos提供了一系列丰富的特性集合,支持服务发现和服务健康监测、动态配置服务、服务元数据和流量管理等功能。 主要功能 服务…