Linux专题-Makefile(2)

本文主要分析Uboot的主Makefile

1.版本号

VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h

这里需要注意最后一行,使用$(obj)解引用obj这个值,上面明明没有obj变量,怎么去用呢?不要忘了我们在上一篇中说到的Makefile中的幅值符号“=”,是找最后一次赋值的结果,也就是说这个“obj”需要往下找;这里的include是uboot文件夹目录下的include文件夹;后面的头文件是自动生成的。

2.HOSTARCH和HOSTOS

HOSTARCH := $(shell uname -m | \sed -e s/i.86/i386/ \-e s/sun4u/sparc64/ \-e s/arm.*/arm/ \-e s/sa110/arm/ \-e s/powerpc/ppc/ \-e s/ppc64/ppc/ \-e s/macppc/ppc/)HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \sed -e 's/\(cygwin\).*/cygwin/')export	HOSTARCH HOSTOS

这里的两个值是环境变量,为啥?因为下面用到了export,有export的就一定是环境变量。直接在shell中执行uname -m得到i686,得到的值其实你当前执行这个命令的电脑的CPU的版本号;“|”这个符号是管道,管道的作用就是把管道前面一个运算式的输出作为后面一个的输入再去做处理,最终的输出才是我们整个式子的输出,我们看到sed -e s/i.86/i386/这个就是前面那句识别到CPU的版本,比如是i686,在这里进行匹配i686能和i.86匹配上,能匹配上就将它替换成i386!下面几行就是其他型号的CPU的,大部分应该都是i386这种。
uname -s是Linux;但是执行完整句代码后导出的是linux,即小写。

3.静默编译

# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif

平时默认编译时命令行会打印出来很多编译信息。但是有时候我们不希望看到这些编译信息,就后台编译即可。这就叫静默编译。使用方法就是编译时make -s,-s会作为MAKEFLAGS传给Makefile,上述这段代码作用下XECHO变量就会被变成空(默认等于echo),于是实现了静默编译。

4.设置编译结果输出目录

ifdef O
ifeq ("$(origin O)", "command line")
BUILD_DIR := $(O)
endif
endififneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)

以上代码列出一小部分,作用是在执行make o=xxx时,将编译生成的.o等文件输出到XXX这个路径下,而不是完全放在源文件目录下,为了保证文件的干净。
上述代码中使用ifeq来判断"$(origin O)""command line"是否相等。这里用到了Makefile中的origin函数。这个函数不操作变量的值,而是用于告诉你变量是从哪里来的。比如这里的$(origin O),表示的就是变量O的来源。如果O是在命令行定义的那么它的来源就是"command line"。也就是在命令行输入了make o=XXX命令。这样这两个就相等了,那么接下来就会让BUILD_DIR的值赋为XXX。 其他命令类似分析。

5.设置目标架构、交叉编译器

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- atk_7020_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8

上面所述的语句即是编译uboot的语句;第一句是清除工程;第二句是配置uboot;第三句是使用8核来编译uboot。在语句中我们使用的完整的命令。
ARCH=arm是设置目标为arm架构,也就是需要运行此uboot的平台,开发板的话一般即是arm,注意这里千万不要和上面的HOSTARCH 混淆,那个是指的电脑的架构!
CROSS_COMPILE=arm-linux-gnueabihf-指定所使用的交叉编译器,只需要指明编译器前缀就可以了。
从Makefile中例举一小段

ifndef CROSS_COMPILE
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE =
else
ifeq ($(ARCH),ppc)
CROSS_COMPILE = ppc_8xx-
endif
ifeq ($(ARCH),arm)
#CROSS_COMPILE = arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
endif

第一句判断如果外部没有定义CROSS_COMPILE(所谓外部没有定义,就是在make命令中输入的不是完整的make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean这种,而是简单的make distclean),则判断HOSTARCH和ARCH是否相等,即当前的编译的那台主机与将来要运行的平台的架构是否一样,如果一样,那么就不需要使用交叉编译工具;如果不相等,则镜像下面的判断,比如下面的ARCH=arm,那么CROSS_COMPILE 则定义成自己安装的交叉编译工具。
需要注意的一点是:在编译时传参使用的命令:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean传入Makefile的CROSS_COMPILE值是可以覆盖Makefile中原来的CROSS_COMPILE的值的。

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

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

相关文章

跨平台移动应用开发指南:打造跨越iOS和Android的移动应用

跨平台移动应用开发已经成为许多开发者的首选,因为它可以节省时间、成本和精力,同时使得应用能够覆盖更广泛的用户群体。本指南将介绍跨平台移动应用开发的基本概念、流行的跨平台框架以及一些最佳实践,帮助您快速入门并打造出高质量的跨平台…

文本三剑客grep与正则表达式、元字符

正则表达式 正则表达式又称为正规表达式、常规表达式、在代码中常简写为regex、regex或RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查…

JetsonNano —— 2、对Nano板卡刷机后进行基础配置

说明 在完成上一节 “JetsonNano —— 1、Windows下对Nano板卡烧录刷机(官方教程)” 后,对新系统进行一些基础配置,以便使用更得心应手么。 基础配置 1、通过SSH连接Nano SSH是一种网络协议(默认的端口号为22&#xff…

测试用例设计方法之因果图详解

一、因果图概述 因果图是从需求中找出因(输入条件)和果(输出或程序状态的改变),通过分析输入条件之间的关系(组合关系、约束关系等)及输入和输出之间的关系绘制出因果图,再转化成判…

C++中的异常处理方式

目录 一、异常 二、C语言中对错误的处理 三、C中的异常处理 四、异常的抛出和捕获 五、异常的重新抛出 六、C标准库中的异常体系 七、异常的规范 一、异常 在C中,异常是程序运行期间发生的意外或错误情况。这些情况可能会导致程序无法继续正常执行,…

二维视觉尺寸测量简单流程

代码示例:opencv实战---物体尺寸测量_opencv尺寸测量精度-CSDN博客 灰度化 简化图像处理:灰度图像只包含亮度信息,不包含颜色信息,因此数据量比彩色图像小,处理起来更加简单和快速。这对于需要实时处理大量图像数据的场…

XTuner笔记

为什么要微调: 1. 模型不具备一些私人定制的知识 2。模型回答问题的套路你不满意。 对应衍生出来两种概念 增量预训练微调: 使用场景:让基座模型学习到一些新知识,如某个垂类领域的常识训练数据:文章、书籍、代码等…

Mac电脑安装打开APP显示问题已损坏 问题解决

当MAC电脑安装完软件打开时,显示文件已损坏,无法打开。搜了很多教程终于找到解决方案,记录下方便以后再用。 我的mac电脑是intel芯片的,如果你遇到这个问题,可以参考我的这个方案。 1.首先当打开软件后出现 “xx软件已…

Python 框架安全:SSTI 模板注入漏洞测试.

什么是 SSTI 模板注入 SSTI (Server-Side Template Injection) 是一种Web应用程序安全漏洞,它发生在应用程序使用模板引擎渲染用户输入时。当应用程序将用户输入直接插入到模板中而不进行充分的过滤和验证时,就可能导致SSTI漏洞。攻击者可以利用这个漏洞…

Selenium 保存会话信息避免重复登录实战!

前言 • 在一些实际开发场景中,我们在使用 Selenium 做自动化测试时需要保留用户的会话信息,从而避免重复登录,今天这篇文章就带大家实战如何使用 Selenium 保存会话信息。 版本 • Python 3.x 整体思路 • 当我们打开页面时,…

Colab/PyTorch - 002 Pre Trained Models for Image Classification

Colab/PyTorch - 002 Pre Trained Models for Image Classification 1. 源由2. 图像分类的预训练模型3. 示例 - AlexNet/ResNet1013.1 模型推断过程3.2 使用TorchVision加载预训练网络3.3 使用AlexNet进行图像分类3.3.1 Step1:加载预训练模型3.3.2 Step2&#xff1a…

1.分布式-理论

目录 一、什么是分布式系统 二、CAP理论 1.一致性Consisency 2.可用性(Availability) 3.分区容错性(Partition tolrance) 三、BASE理论 1.Basically Available(基本可用) 2.Soft state(软状态) 3.Eventually consistent(最终一致性&a…

【JavaSE】/*初识Java*/

目录 一、了解 Java 语言 二、Java 语言的重要性 2.1 使用程度 2.2 工作领域 三、Java 语言的特性 四、Java 的基础语法 五、可能遇到的错误 六、第一个 java 程序代码解析 七、Java 注释 八、Java 标识符 九、Java 关键字 一、了解 Java 语言 Java 是由 Sun Micr…

15. 三数之和(双指针+去重优化)

文章目录 前言一、题目描述二、代码原理1.暴力解法2.双指针优化 三.代码编写总结 前言 在本篇文章中,我们将会讲到leetcode中15. 三数之和,我们将会用到双指针的方式解决这道问题,同时注意掌握算法原理的去重操作。 一、题目描述 给你一个…

PHP高级教程

🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:PHP 📚参考教程:菜鸟\编程网❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、PHP 多维数组 二、PHP date(&#…

免费获取!图论+灰色系统+混合优化算法程序代码!

前言 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。算法优化是指对算法的有关性能进行优化,如时间复杂度、空间复杂度、正确性、健壮性…

MongoDB聚合运算符:$toLower

MongoDB聚合运算符&#xff1a;$toLower 文章目录 MongoDB聚合运算符&#xff1a;$toLower语法使用举例角度的双曲正切 $toLower聚合运算符用于将字符串转换为小写。 语法 { $toLower: <expression> }<expression>为可被解析为字符串的表达式。如果参数解析为null…

安卓实现连接wesokcet

在build.gradle里引入依赖&#xff1a; implementation org.java-websocket:Java-WebSocket:1.5.2 在Androidmanifest.xml 文件里加入网络权限&#xff1a; <uses-permission android:name"android.permission.INTERNET" /> 代码&#xff1a; package com.x…

Vue与Java使用AES加密与解密

CBC模式&#xff08;通过偏移值进行加密&#xff0c;更具安全性&#xff09; 一、VUE&#xff1a; 1、安装 npm install crypto-js 2、编写公用js&#xff08;在common文件夹下创建一个crypto.js&#xff09; 注意&#xff1a;key最少要有16个字符&#xff0c;iv最少6个字符…

Java | Leetcode Java题解之第79题单词搜索

题目&#xff1a; 题解&#xff1a; class Solution {public boolean exist(char[][] board, String word) {char[] words word.toCharArray();for(int i 0; i < board.length; i) {for(int j 0; j < board[0].length; j) {if (dfs(board, words, i, j, 0)) return t…