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…...
如何让老款Mac焕发新生:终极硬件限制破解与macOS兼容工具指南
如何让老款Mac焕发新生:终极硬件限制破解与macOS兼容工具指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为苹果官方停止支持的老款Mac无…...
为什么选择Minimal:GitHub Pages最简洁主题的深度解析与快速入门指南
为什么选择Minimal:GitHub Pages最简洁主题的深度解析与快速入门指南 【免费下载链接】minimal Minimal is a Jekyll theme for GitHub Pages 项目地址: https://gitcode.com/gh_mirrors/mini/minimal Minimal主题是GitHub Pages平台上最受欢迎、最简洁的Jek…...
魔兽争霸III终极优化指南:5大功能彻底解决现代系统兼容性问题
魔兽争霸III终极优化指南:5大功能彻底解决现代系统兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III在现代电脑…...
Oracle替代之路:企业去O过程中常见的坑与避坑指南
📌 关键词:Oracle替代、国产数据库、去O、数据库迁移、信创、兼容性、高可用大家好!我是数据库小学妹 👋 最近发现一个有意思的现象:不管是金融、运营商还是政务单位,聊到数据库规划,三句话不离…...
ABAP云迁移中SAML Bearer断言实战指南
1. 这不是“配置一下就能用”的流程——SAML Bearer Assertion 在 ABAP 云迁移中到底在替谁干活?你刚接手一个 SAP S/4HANA Cloud 扩展项目,客户要求“把本地 ABAP 系统里的用户身份,安全地透传到新上线的 Node.js 微服务里”。运维同事甩来一…...
集团总部失控(二):谁制造了“诸侯”?
集团管控失灵,常见的归因是子公司“不听话”“各自为政”“挑战规则”。这些现象确实存在,但若深究其根源,往往会发现:子公司的问题只是表层,更深层的原因埋藏在总部自身的治理逻辑与管理方式中。 一、历史形成的权威…...
告别虚拟机!用WSL2自带的SSH服务连接VSCode远程开发(附端口冲突解决)
告别虚拟机!用WSL2自带的SSH服务连接VSCode远程开发(附端口冲突解决) 在Windows系统上进行Linux开发时,传统虚拟机方案往往显得笨重且资源占用高。WSL2的出现彻底改变了这一局面,它提供了近乎原生的Linux内核体验&…...
告别串口助手:用Python脚本实现YMODEM协议自动升级嵌入式固件(附源码)
告别串口助手:用Python脚本实现YMODEM协议自动升级嵌入式固件(附源码) 在嵌入式设备量产测试和远程维护场景中,传统的手动串口工具操作已成为效率瓶颈。每次固件升级都需要人工介入,不仅耗时费力,还容易因…...
UPS、EPS蓄电池更换周期及更换判定标准详解
在机房后备供电、工业不间断供电、消防应急供电体系中,UPS不间断电源与EPS应急电源的核心储能载体均为蓄电池。蓄电池的健康状态,直接决定整套应急供电系统的可靠性,是电气运维、机房维保、消防设施巡检的重点工作内容。在实际运维工作中&…...
Agent Skills 万千应用 · 第04篇 Excel 分析 Skill:让 Agent 会整理表格、建公式、画图表
Agent Skills 万千应用 第04篇 Excel 分析 Skill:让 Agent 会整理表格、建公式、画图表01|场景痛点开场📊 周一早上,老板丢过来一份 Excel:销售流水 8000 行、客户名称有重复、日期格式不统一、金额里还混着“元”和空…...
