ARM Makefile 基础

news2024/11/26 13:35:12

一、Makefile 的作用和意义

(1) 工程项目中 c 文件太多管理不方便,因此用 Makefile 来做项目管理,方便编译链接过程。

(2) uboot 和 linux kernel本质上都是 C 语言的项目,都由很多个文件组成,因此都需要通过 Makefile 来管理。所以要分析 uboot 必须对 Makefile 有所了解。


二、目标、依赖、命令

(1) 目标就是我们要去 make xxx 的那个 xxx,就是我们最终要生成的东西。

(2) 依赖是用来生成目录的原材料。

(3) 命令就是加工方法,所以 make xxx 的过程,其实就是使用命令将依赖加工成目标的过程。


三、通配符 % 和 Makefile 自动推导(规则)

(1) % 是 Makefile 中的通配符,代表一个或几个字母。 也就是说, %.o 就代表所有以 .o 为结尾的文件。

(2) 所谓自动推导,其实就是 Makefile 的规则。当 Makefile 需要某一个目标时,他会把这个目标去套规则说明,一旦套上了某个规则说明,则 Makefile 会试图寻找这个规则中的依赖,如果能找到则会执行这个规则用依赖生成目标。


四、Makefile 中定义和使用变量

(1) Makefile 中定义和使用变量,和 shell 脚本中非常相似。相似是说:都没有变量类型,直接定义使用,引用变量时用 $var。


五、伪目标(.PHONY)

(1) 伪目标,意思是这个目标本身不代表一个文件,执行这个目标不是为了得到某个文件或东西,而是单纯为了执行这个目标下面的命令。

(2) 伪目标一般都没有依赖,因为执行伪目标就是为了执行目标下面的命令。既然一定要执行命令了那就不必加依赖,因为不加依赖意思就是无条件执行。

(3) 伪目标可以直接写,不影响使用;但是有时候为了明确声明这个目标是伪目标,会在伪目标的前面用 .PHONY 来明确声明它是伪目标。


六、Makefile 的文件名

(1) Makefile 的文件名合法的一般有 2 个:Makefile 或者makefile。


七、Makfile 中引用其他 Makefile(include 指令)

(1) 有时候 Makefile 总体比较复杂,因此分成好几个 Makefile 来写。然后在主 Makefile 中引用其他的,用 include 指令来引用。引用的效果也是原地展开,和 C 语言中的头文件包含非常相似。


八、Mafile 补充学习1

1、Makefile 中的注释用

(1) Makefile中注释使用 #,和 shell 一样。

在这里插入图片描述


2、命令前面的 @ 用来静默执行

(1) 在 makefile 的命令行中前面的 @ 表示静默执行。

(2) Makefile 中默认情况下在执行一行命令前会先把这行命令给打印出来,然后再执行这行命令。

(3) 如果你不想看到命令本身,只想看到命令执行就静默执行即可。

root@ubuntu:/home/aston/workspace# cat Makefile
all:
	echo hello world
root@ubuntu:/home/aston/workspace# make
echo hello world
hello world
root@ubuntu:/home/aston/workspace# 
root@ubuntu:/home/aston/workspace# 
root@ubuntu:/home/aston/workspace# vim Makefile 
root@ubuntu:/home/aston/workspace# cat Makefile
all:
	@echo hello world
root@ubuntu:/home/aston/workspace# make
hello world
root@ubuntu:/home/aston/workspace# 

3、Makefile 中几种变量赋值运算符

(1) = 最简单的赋值
(2) := 一般也是赋值

以上这两个大部分情况下效果是一样的,但是有时候不一样。
= 赋值的变量,在被解析时他的值取决于最后一次赋值时的值,所以你看变量引用的值时不能只往前面看,还要往后面看。
:= 来赋值的,则是就地直接解析,只用往前看即可。

root@ubuntu:/home/aston/workspace# cat Makefile 
str1 = ABC
str2 := $(str1)123
str1 = DEF


all:
	echo $(str1)
	echo $(str2)
root@ubuntu:/home/aston/workspace# make
echo DEF
DEF
echo ABC123
ABC123
root@ubuntu:/home/aston/workspace# 

(3) ?= 如果变量前面并没有赋值过则执行这条赋值,如果前面已经赋值过了则本行被忽略。(实验可以看出:所谓的没有赋值过,其实就是这个变量没有被定义过)

root@ubuntu:/home/aston/workspace# cat Makefile 
str1 = ABC
str2 := $(str1)123
str1 = DEF

str3 = hello
str3 ?= world
all:
	echo $(str1)
	echo $(str2)
	echo $(str3)
root@ubuntu:/home/aston/workspace# make
echo DEF
DEF
echo ABC123
ABC123
echo hello
hello
root@ubuntu:/home/aston/workspace# vim Makefile 
root@ubuntu:/home/aston/workspace# cat Makefile 
str1 = ABC
str2 := $(str1)123
str1 = DEF

str3 =
str3 ?= world
all:
	echo $(str1)
	echo $(str2)
	echo $(str3)
root@ubuntu:/home/aston/workspace# 
root@ubuntu:/home/aston/workspace# make
echo DEF
DEF
echo ABC123
ABC123
echo 

root@ubuntu:/home/aston/workspace# 

(4) += 用来给一个已经赋值的变量接续赋值,意思就是把这次的值加到原来的值的后面,有点类似于 strcat。(在 shell makefile 等文件中,可以认为所有变量都是字符串,+= 就相当于给字符串 strcat 接续内容)(注意一个细节,+= 续接的内容和原来的内容之间会自动加一个空格隔开)

root@ubuntu:/home/aston/workspace# cat Makefile 
str1 = ABC
str2 := $(str1)123
str1 = DEF

str3 = hello
str3 ?= world
str3 +="linux"
all:
	echo $(str1)
	echo $(str2)
	echo $(str3)
root@ubuntu:/home/aston/workspace# make
echo DEF
DEF
echo ABC123
ABC123
echo hello "linux"
hello linux
root@ubuntu:/home/aston/workspace# 

注意:Makefile 中并不要求赋值运算符两边一定要有空格或者无空格,这一点比 shell 的格式要求要松一些。


4、Makefile 的环境变量

(1) makefile 中用 export 导出的就是环境变量。一般情况下要求环境变量名用大写,普通变量名用小写。

(2) 环境变量和普通变量不同,可以这样理解:环境变量类似于整个工程中所有 Makefile 之间可以共享的全局变量,而普通变量只是当前本 Makefile 中使用的局部变量。所以要注意:定义了一个环境变量会影响到工程中别的 Makefile 文件,因此要小心。

(3) Makefile 中可能有一些环境变量,可能是 makefile 本身自己定义的内部的环境变量,或者是当前的执行环境提供的环境变量(譬如我们在 make 执行时给 makefile 传参。make CC=arm-linux-gcc,其实就是给当前 Makefile 传了一个环境变量 CC,值是 arm-linux-gcc我们在make 时给 makefile 传的环境变量值优先级最高的,可以覆盖 makefile 中的赋值)。这就好像 C 语言中编译器预定义的宏 _LINE_ 、 _FUNCTION_ 等一样。


九、Makefile补充学习2

1、Makefile 中使用通配符

(1) * 若干个任意字符
(2) ? 1个任意字符
(3) [][ ] 中的字符依次去和外面的结合匹配

还有个 %,也是通配符,表示任意多个字符,和 * 很相似,但是 % 一般只用于规则描述中,又叫做规则通配符。

关于通配符,Makefile还有一些 wildcard 等比较复杂的通配符用法,具体参考《跟我一起学Makefile》即可。


2、Makefile 的自动变量

(1) 为什么使用自动变量。在有些情况下文件集合中文件非常多,描述的时候很麻烦,所以我们 Makefile 就用一些特殊的符号来替代符合某种条件的文件集,这就形成了自动变量。

(2) 自动变量的含义:预定义的特殊意义的符号。就类似于 C 语言编译器中预制的那些宏__FILE__一样。

(3) 常见自动变量:
$@ 规则的目标文件名
$< 规则的依赖文件名
$^ 依赖的文件集合


源自朱有鹏老师.

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

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

相关文章

nodejs小区物业管理系统vue前端

目 录 1 概述 1 1.1课题背景及意义 1 1.2 国内外研究现状 1 1.3 本课题主要工作 2 2 系统开发环境 3 前端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn install产生) 这文件夹就是…

STM32-Modbus-RTU-01-05-15功能码补充-波特率在线修改-断电数据保护

文章目录一、本文主要内容二、使用modbus通信协议在线修改STM32波特率&#xff08;一&#xff09;STM32标准库在线修改串口波特率&#xff08;二&#xff09;STM32HAL库-485-modbus-rtu通信在线修改串口波特率1、STM32F103ZET6芯片(1)HAL库下参考标准库形式修改波特率(2)直接修…

SNARK+深度神经网络

1. 引言 SNARK深度神经网络&#xff0c;相关开源实现有&#xff1a; 1&#xff09;Ezkl&#xff08;Rust&#xff09;&#xff1a;借助Halo2证明系统&#xff0c;实现了50层的MobileNetV2的执行证明。具体见Daniel Kang等人2022年论文Scaling up Trustless DNN Inference with…

4种I/O模型简介

目录 1、同步阻塞IO(BIO) 2、同步非阻塞IO(NIO) 3、多路复用IO 3.1、select(轮询) 3.2、poll(轮询) 3.3、epoll(事件驱动) 3.4、select、poll、epoll总结 4、异步IO模型(AIO) 网络IO涉及的两个对象&#xff1a;用户线程 系统内核。 当一个read发生时&#xff0c;会经…

Kotlin中嵌套类、数据类、枚举类和密封类的详解

博主前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住也分享一下给大家 &#x1f449;点击跳转到教程 一、嵌套类 如果一个类只对另一个类有用&#xff0c;那么将其嵌入到该类中并使这两个类保持在一起是合乎逻辑的&#xf…

【Deepstream学习】TX1 跑demo

大家好&#xff0c;我是虎哥&#xff0c;使用NVIDIA Jeston TX1 也有很长一段时间了&#xff0c;由于这是基本停产的一个模块&#xff0c;其实自己也担心有很多官方的demo无法适配跑起来了&#xff0c;所以花了点时间&#xff0c;进一步研究发挥其GPU性能&#xff0c;使用各种硬…

STM8S207时钟管理库函数

STM8S207时钟树 //STM8S207时钟管理库函数 //CLK_DeInit();//将相关的时钟寄存器恢复到默认值 //CLK_HSECmd(ENABLE);//启用外部高速振荡器HSE //CLK_HSECmd(DISABLE);//关闭外部高速振荡器HSE //CLK_HSICmd(ENABLE);//启用内部高速振荡器HSI //CLK_HSICmd(DISABLE)//关闭内部高…

Spring Cloud Sentinel(限流、熔断、降级)、SpringBoot整合Sentinel、Sentinel的使用-60

一&#xff1a;Sentinel简介 Sentinel就是分布式系统的流量防卫兵 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 1.1 官方文档 官方文档&#…

哪里可以找到电子版的大学课本?

第一个&#xff1a;中国高校课件下载网站网址&#xff1a;http://download.cucdc.com/这是一个可以下载各个大学课本的网站&#xff0c;基本上所有的大学课本都能在这里找到PDF版本。可以按学校学科搜。 第二个&#xff1a;淘链客网址&#xff1a;https://www.toplinks.cc/s/PD…

MySQL_存储引擎

存储引擎 MySQL体系结构 连接层 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层 第二层架构主要完成大多数的核心服务功能&#xff0c;如SQL接口&…

读书:《如何想到又做到》

全书最有用的内容是下面这张图&#xff1a;持久改变的SCIENCE模型。 作者为了方便读者记忆&#xff0c;找了7个单词&#xff0c;首字母拼在一起就是SCIENCE&#xff0c;对应着7种武器&#xff1a; S 阶梯&#xff08;Stepladders&#xff09;&#xff1a;小而又小的迭代 C 社群…

高性能零售IT系统的建设09-Spring Boot2.4.2+Spring Cloud+Nacos+Feign+Hystrix的生产级应用实例

开篇 通过前面8篇我们已经感受到了我接手时这个项目有多“烂”&#xff0c;当然喽如果只是一味的承认它的烂这不是积极乐观主义。 我在接触管理早期听过一次四大厂的报告&#xff0c;报告中说到&#xff1a;从来没有屎一样的团队只有屎一样的“带队”。 这也符合我们一直接受的…

SpringMVC @RequestHeader @CookieValue 处理获取请求参数的乱码问题

SpringMVC RequestHeader CookieValue 处理获取请求参数的乱码问题RequestHeaderCookieValue什么是cookie通过POJO获取请求参数通过CharacterEncodingFilter处理获取请求参数的乱码问题get请求的乱码post请求乱码处理获取请求参数的乱码问题)RequestHeader 1.RequestHeader是将…

实时计算业务介绍实时日志分析

4.1 实时计算业务介绍 学习目标 目标 了解实时计算的业务需求知道实时计算的作用应用 无 4.1.1 实时计算业务需求 实时&#xff08;在线&#xff09;计算&#xff1a; 解决用户冷启动问题实时计算能够根据用户的点击实时反馈&#xff0c;快速跟踪用户的喜好 4.1.2 实时计算…

编译与优化

第10章 前端编译与优化 10.2.1 Javac的源码与调试 从Javac代码的总体结构来看&#xff0c;编译过程大致可以分为1个准备过程和3个处理过程&#xff0c;它们分别如下 所示。 1&#xff09;准备过程&#xff1a;初始化插入式注解处理器。 2&#xff09;解析与填充符号表过程&…

【C++】异常

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;C语言传统…

精神财富 物质财富

今天聊到别的家庭每天都制定好计划的&#xff0c;补习班 party 冬令营什么之类的&#xff0c;这个是我们达不到的。有人提前开启了认知&#xff0c;赚到了人生的第一桶金。懂得付出&#xff0c;和执行输出差了好多数量级。 今天看了杂技表演&#xff0c;男人和女人配合的好好 …

C++ 初阶 :stackqueue

文章目录1 stack的介绍2 stack的模拟实现3 queue的介绍4 queue的模拟实现5 priority_queue(优先级队列)介绍6 priority_queue 模拟实现7 仿函数8 deque的简单介绍8.1 deque与vector list的比较8.2 为什么选择deque作为stack和queue的底层默认容器1 stack的介绍 ①stack是一种容…

Springboot校园食堂外卖点餐系统357

目 录 1 概述 1 1.1课题背景及意义 1 1.2 国内外研究现状 1 1.3 本课题主要工作 2 2 系统开发环境 3 2.1 java简介 3 2.2 Mysql数据库 3 2.3 B/S结构 4 2.4 JSP技术介绍 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2操作…

javaEE 初阶 — Socket 套接字与 UDP 数据报套接字编程

文章目录1. Socket 套接字1.1 有连接与无连接1.2 可靠与不可靠传输1.3 面向字节流与面向数据报1.4 全双工与半双工2. UDP数据报套接字编程2.1 DatagramSocket API2.2 DatagramPacket API2.3 InetSocketAddress API3. UDP 版本的客户端服务器程序3.1 服务器实现3.2 客户端实现3.…