Makefile 和 Shell 脚本的区别与联系
以下内容转载于博客Makefile 和 shell 脚本的区别与联系,有删改与内容添加。
参考内容:初学Makefile指南
一、什么是 Makefile?
Makefile 描述了整个工程的编译、链接规则。当源码文件比较多的时候就不适合通过输入 gcc 命令来编译,Makefile 文件描述了编译哪些源码文件、如何编译,每次需要编译工程时只需要使用这个文件就行了。
(1)Makefile的规则中,命令行必须以Tab键开始,不能用几个空格表示。
(2)Makefile中只能使用#进行注释,不能使用//进行注释,而且只能一行一行地注释。
(3)在命令行中输入“make”,make 命令会在当前目录下查找是否存在 Makefile 文件。
二、什么是 shell 脚本?
我们可以直接在shell窗口中输入很多命令来完成某个需求,但是每次用到相同需求时都需要重新输入这些命令,效率比较低下,为此我们可以把这些命令记录在一个文档中,然后去执行这个文档中的命令,这样就能一步操作完成。记录着这些命令的文档,就是shell脚本。换言之,shell脚本就是一些命令的集合,它是一个纯文本文件。
(1)shell 脚本中,命令是从上到下,从左到右,一行行、一句句地开始执行的。
(2)shell 脚本提供数组、循环、条件判断等功能。
(3)shell 脚本扩展名为 .sh,但其实扩展名并不影响脚本执行,见名知意就好。
(4)shell 脚本第一行一般为“#!/bin/bash”,这表示使用bash这个shell程序。
(5)执行shell脚本的方法,其中一种是“./xxx.sh”(首先要给xxx.sh添加可执行权限),另外一种方法是“bash xxx.sh”,或者“. xxx.sh”,或者“source xxx.sh”。它们的区别见博客https://xiefor100.blog.csdn.net/article/details/125584203。
三、Makefile 和 shell 脚本的区别
1、在Makefile中可以调用shell命令。
(1)比如Makefile规则中的命令行就是由shell命令组成的。
x210_sd_config : unconfig@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
(2)比如xxx = $(shell 紧接着的是shell代码)。
xjh@ubuntu:~/iot/tmp$ cat Makefile
usr_num = $(shell who | wc -l)all:@echo "用户数目是${usr_num}"xjh@ubuntu:~/iot/tmp$ make
用户数目是2
xjh@ubuntu:~/iot/tmp$
(3)执行 Makefile 规则中的命令时,通过创建一个进程来执行一行的内容,即每一行命令对应着一个进程,不同命令行对应着不同进程,因此不同命令行之间的变量不能传递。有时候一行的命令很长,为了确保一行的shell命令都在同一个进程中执行,我们需要在末尾添加“\”。另外,一行的命令中,不同的命令语句之间用分号进行连接。
MPC8360ERDK_33_config \
MPC8360ERDK_66_config \
MPC8360ERDK_config: unconfig@mkdir -p $(obj)include@if [ "$(findstring _33_,$@)" ] ; then \$(XECHO) -n "... CLKIN 33MHz " ; \echo "#define CONFIG_CLKIN_33MHZ" >>$(obj)include/config.h ;\fi ;@$(MKCONFIG) -a MPC8360ERDK ppc mpc83xx mpc8360erdk freescale
2、在shell中通配符是“*”,在Makefile中通配符是“ %”。
3、在shell中不允许 “=” 号两边有空格,在Makefile中允许变量赋值时,“=” 号两边有空格。
4、在shell中,$() 放命令,${} 放变量;在Makefile中,$() 和 ${} 都能引用变量,如果不加()或者{},则$会与$后面字符串的第一个字符组合,比如下面代码的$PATH,其实是${P}ATH,因为变量P没有定义,则${P}为空。
xjh@ubuntu:~/iot/tmp$ cat Makefile
VAR = valueall:@echo $VAR@echo ${VAR}@echo $(VAR)xjh@ubuntu:~/iot/tmp$ make
AR
value
value
xjh@ubuntu:~/iot/tmp$
5、如果在Makefile中定义了一个变量,而Makefile中所调用的shell命令也定义了一个同名的变量,在使用变量的时候,如何区分它是引用shell的变量还是Makefiel中的变量呢?Makefile规定,如果在Makfile中引用shell变量,那么该shell变量前应该添加两个$$符号。比如下面代码,$$subdir表示引用shell中的变量subdir, 而${subdir}表示引用Makefile中的变量subdir。
xjh@ubuntu:~/iot/tmp$ cat Makefile
SUBDIR = src example
subdir = xxxall:@for subdir in $(SUBDIR);\do\echo "building " $$subdir $${subdir};\ #$$(subdir)实测不行echo ${subdir} $(subdir);\donexjh@ubuntu:~/iot/tmp$ make
building src src
xxx xxx
building example example
xxx xxx
xjh@ubuntu:~/iot/tmp$
6、在Makefile中,shell命令需要放在规则的命令中,直接放在规则之外是不允许的。
xjh@ubuntu:~/iot/tmp$ cat Makefile
VAR = Hello
echo ${VAR} #这一条shell命令直接放在规则之外是不允许的all:echo ${VAR}
xjh@ubuntu:~/iot/tmp$ make
Makefile:2: *** missing separator. Stop.
xjh@ubuntu:~/iot/tmp$
如果想把shell命令放在规则之外,需要使用 xxx = $(shell shell命令列表)的形式。
xjh@ubuntu:~/iot/tmp$ cat Makefile
VAR = Hello
print_string=$(shell echo ${VAR})all:@echo ${VAR}@echo ${print_string}xjh@ubuntu:~/iot/tmp$ make
Hello
Hello
xjh@ubuntu:~/iot/tmp$
7、shell中执行命令时没有回显,执行Makefile中规则的命令行时,如果命令行之前没有@符号,则一般会先打印出要执行的命令,然后执行命令。
未完待续!
相关文章:
Makefile 和 Shell 脚本的区别与联系
以下内容转载于博客Makefile 和 shell 脚本的区别与联系,有删改与内容添加。 参考内容:初学Makefile指南 一、什么是 Makefile? Makefile 描述了整个工程的编译、链接规则。当源码文件比较多的时候就不适合通过输入 gcc 命令来编译…...

java25种设计模式之工厂模式
Java设计模式 - 工厂模式 工厂模式是一种创建模式,因为此模式提供了更好的方法来创建对象。 在工厂模式中,我们创建对象而不将创建逻辑暴露给客户端。 例子 在以下部分中,我们将展示如何使用工厂模式创建对象。 由工厂模式创建的对象将是…...

力扣-2020年最后一次登录
大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:1890. 2020年最后一次登录二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.…...

[蓝桥杯] 数学与简单DP问题
文章目录 一、简单数学问题习题练习 1、1 买不到的数目 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 饮料换购 1、2、1 题目描述 1、2、2 题解关键思路与解答 二、DP问题习题练习 2、1 背包问题 2、1、1 题目描述 2、1、2 题解关键思路与解答 2、2 摘花生 2、2、1 题目…...

浏览器的渲染过程解析
文章目录浏览器渲染进程有哪些?浏览器的渲染过程浏览器渲染进程有哪些? GUI线程:负责渲染浏览器页面,解析html,css,构建DOM树,CSS规则树,渲染树和绘制页面,当界面需要重…...
【C++容器】std::fstream读写文件错误【2023.03.03】
std::fstream使用细节 1.文件不存不支持时打开文件模式不得有ios::in • 如果文件不存在且打开时包括了ios::in模式则打开文件会失败。 fstream m_f;m_f.open("d://123.csv", ios::in | ios::out | ios::binary);//文件不存在则会打开失败• 我这边尝试行得通的做…...

UVM实战--带有寄存器的加法器
一.整体的设计结构图 这里将DUT换成加法器,可以理解为之前UVM加法器加上寄存器,这里总线的功能不做修改,目的看代码的移植那些部分需要修改。 二.各个组件代码详解 2.1 DUT module dut( input clk, input rst_n, input…...

笔记--学习mini3d代码
主要是记录学习mini3d代码时,查的资料; 从github下载的代码: GitHub - skywind3000/mini3d: 3D Software Renderer in 700 Lines !!3D Software Renderer in 700 Lines !! Contribute to skywind3000/mini3d development by creating an a…...

图片服务器
文章目录一、项目简介二、功能及场景三、业务设计四、数据库设计准备图片表准备实体类五、API设计常用功能封装文件上传文件上传获取图片列表接口获取图片内容删除图片接口六、项目优化七、测试自动化测试测试用例一、项目简介 图片服务器:解决项目中插入图片的问题…...

【JAVA程序设计】【C00110】基于SSM(非maven)的车辆维修管理系统
基于SSM(非maven)的车辆维修管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架非maven开发的车辆维修管理系统共分为三个角色:管理员、用户 管理员角色包含以下功能: 查看用户、添加用户、查看车辆信息、故…...
微积分小课堂:用动态的眼光去找问题的最优解(最大值/最小值)【中学里的解题技巧】
文章目录 引言I 最优化问题1.1 不同形式的最优化1.2 用动态的眼光去找问题的最优解引言 把比较数大小的问题,变成了寻找函数变化拐点的问题,将这两个问题等同起来,需要发明一种工具,叫做导数。有了导数这个工具,求最大值问题就变成了解方程的问题。 用变化的眼光找到最优…...
网络爬虫和相关工具
在理想的状态下,所有ICP(Internet Content Provider)都应该为自己的网站提供API接口来共享它们允许其他程序获取的数据,在这种情况下爬虫就不是必需品,国内比较有名的电商平台(如淘宝、京东等)、…...

OSSFs挂载工具简介
OSSFs挂载工具 OSSFs挂载工具简介 ossfs允许您在Linux系统中将对象存储OSS的存储空间(Bucket)挂载到本地文件系统。挂载完成后,您能够像操作本地文件一样操作OSS的对象(Object),从而实现数据共享。 …...

Spring 容器创建初始化,获取bean流程分析
Spring 容器创建初始化,获取bean流程分析 Spring 容器创建初始化 流程分析 1、首先读取bean.xml 文件 2、扫描指定的包 com.hspedu.spring.component 2.1、扫描包,得到bean的class对象,排除包下不是bean的 2.2、扫描将bean信息封装BeanDef…...

无聊小知识.03 Springboot starter配置自动提示
1、前言Springboot项目配置properties或yaml文件时候,会有很多spring相关的配置提示。这个是如何实现的?如果我们自己的配置属性,能否也自动提示?2、Springboot配置自动提示其实IDE是通过读取配置信息的元数据而实现自动提示的。S…...
2023-03-03 mysql-join类别-分析
目录 摘要: mysql版本: DDL: 表结构: 插入数据: JOIN: 一. SELECT 二. INNER JOIN...

Saleen 系列来袭!
由 Ghostopunch 创作👻🥊 Ghostpunch 将 Saleen Automotive 带入 The Sandbox 元宇宙! 是 Saleen Automotive 于 1984 年由汽车界的梦想家 Steve Saleen 创立,目标是将经过比赛验证的性能带入大街小巷和元宇宙……😉 5…...
如何优雅地处理Java中的null值?使用Optional类来实现!
当我们在Java编程时,经常会遇到处理null值的问题。在Java 8中,引入了一个Optional类来解决这个问题。Optional类可以看作是一个容器,用于包装一个可能为null的值。它提供了一些方便的方法,以优雅地处理null值的情况。 下面我将详…...

巾帼绽芬芳 一起向未来(中篇)
编者按:为了隆重纪念纪念“三八”国际妇女节113周年,快来与你全方位、多层次分享交流“三八”国际妇女节的前世今生。分上篇(节日简介、节日发展和节日意义)、中篇(节日活动宗旨和世界各国庆祝方式)和下篇&…...
espnet training
from:ESPnet2 — ESPnet 202301 documentation from :Change the configuration for training — ESPnet 202301 documentation 训练完之后微调的命令: ./run.sh --stage 11 --ngpu 1 --asr_args "--max_epoch 205 --optim_conf lr=0.1 --resume true" --asr_exp…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...