Makefile中使用Shell

2023-11-07

http://blog.csdn.net/zdl1016/article/details/6448989

http://blog.csdn.net/absurd/article/details/636418

MakefileShell的问题

 

大概只要知道Makefile的人,都知道Makefile可以调用Shell脚本。但是在实际使用时,并不那么简单,一些模棱两可的地方可能会让你抓狂。你若不信,可以先看几个例子,想象一下这些这些例子会打印什么内容,记下你想象的结果,然后在计算机上运行这些例子,对照看一下。

 

示例一:

if [ "$(BUILD)" = "debug" ]; then echo "build debug"; else echo "build release"; fi

all:

echo "done"

示例二:

all:

@CC=arm-linux-gcc

@echo $(CC)

示例三:

CC=arm-linux-gcc

all:

@echo $(CC)

示例四:

SUBDIR=src example

all:

@for subdir in $(SUBDIR); /

do/

echo "building " $(subdir); /

done

 

 

说明:

1. Shell脚本在target里才有效,其它地方都被忽略掉了。所以示例一中,”build debug”之类的字符串根本打印不出来。示例一的正确写法是:

示例一:

all:

if [ "$(BUILD)" = "debug" ]; then echo "build debug"; else echo "build release"; fi

echo "done"

 

2. make把每一行Shell脚本当作一个独立的单元,它们在单独的进程中运行。示例二中,两行Shell脚本在两个莫不相干的进程里运行,第一个进程把CC设置为arm-linux-gcc,第二个进程是不知道的,所以打印的结果自然不是arm-linux-gcc了。示例二的正确写法是:

示例二:

all:

@CC=arm-linux-gcc; echo $(CC)

或者:

all:

@CC=arm-linux-gcc; /

echo $(CC)

 

3. make在调用Shell之前先进行预处理,即展开所有Makefile的变量和函数。这些变量和函数都以$开头。示例三中,Shell拿的脚本实际上是echo arm-linux-gcc,所以打印结果正确。

 

4. make预处理时,所有以$开头的,它都不会放过。要想引用Shell自己的变量,应该以$$开头。另外要注意,Shell自己的变量是不需要括号的。示例四的正确写法是:

示例四:

SUBDIR=src example

all:

@for subdir in $(SUBDIR); /

do/

echo "building " $$subdir; /

done

 

在Makefile中写shell代码有点诡异,和不同的shell语法不太一样,如果不了解,看Makefile会莫名其妙。下面总结了一些。

1:尽在Makefile文件的目标项冒号后的另起一行的代码才是shell代码。
eg:
xx = xx1 // 这里时makefile代码
yy:xx = xx2 // 这是是makefile代码,makefile允许变量赋值时,'='号两边留空格
yy:
xx=xx3 // 只有这里是shell代码 ,shell不允许‘=’号两边有空格哦。
有一个例外:
xx=$(shell 这里的代码也是shell代码)

2:Makefile中的shell,每一行是一个进程,不同行之间变量值不能传递。所以,Makefile中的shell不管多长也要写在一行。
eg:

SUBDIR=src example

all:

@for subdir in $(SUBDIR); / // 这里往下是一行shell

do/

echo "building " $$subdir; /

done



3:Makefile中的变量以$开头, 所以,为了避免和shell的变量冲突,shell的变量以$$开头
eg1:从当前目录路径中提取出 /application  或 /base_class 之前的部分
PROJECT_ROOT_DIR = $(shell pwd | awk -F'/application|/base_class' '{print  $$1 }')
eg2:上例中 $$subdir就是shell中的变量, 而$(SUBDIR)是Makefile的中的变量

Makefile中的shell的更多知识参考:
Makefile与Shell的问题
http://blog.csdn.net/absurd/archive/2006/03/23/636418.aspx
文章摘要:

大概只要知道Makefile的人,都知道Makefile可以调用Shell脚本。但是在实际使用时,并不那么简单,一些模棱两可的地方可能会让你抓狂。你若不信,可以先看几个例子,想象一下这些这些例子会打印什么内容,记下你想象的结果,然后在计算机上运行这些例子,对照看一下。




FROM:  http://blog.sina.com.cn/s/blog_65839b2601018czr.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Makefile中使用Shell 的相关文章

随机推荐

  • odoo中视图继承的xpath写法以及隐藏原来字段

    父级试图 xpath找到元素继承时 xpath和爬虫时候的xpath的语法略微不同 odoo中xpath 如下 div class app settings block 1 sheet notebook 3 page group group
  • 【Django REST framework电商项目笔记】第10章 购物车, 订单和支付宝支付功能(上)

    购物车接口实现 在交易 trade 应用上 在商品详情页点击加入购物车 弹出提示框 去结算 继续购物 右上角会新增商品到购物车 这是从后台取出来的数据 可以显示商品 数量 总价等信息 添加商品 在商品数量上加一 直接更新数量即可 注意sho
  • 【无标题】尤破金11.24黄金还会跌吗?黄金原油今日价格走势分析及操作解套

    黄金最新行情解析 黄金消息面解析 周三 11月24日 亚洲时段 现货黄金小幅上涨 交投于1791附近 周二 11月23日 金价强势跌破1800关口 录得四连跌 因市场加码押注美联储转鹰 美债收益率与美元继续保持强势 但疫情反弹可能提升一些黄
  • 安装DevEco Studio跑鸿蒙第一个应用

    下载 安装 https hmxt org deveco studio 安装启动 双击安装以后重启电脑 启动程序 Node 修改环境 Start using DevEco Studio Next Next Accept 开始下载 Finish
  • Python测试框架 Pytest —— mock使用(pytest-mock)

    pytest mock 安装 pip install pytest mock 这里的mock和unittest的mock基本上都是一样的 唯一的区别在于pytest mock需要导入mock对象的详细路径 weateher r py cla
  • Python 实现完整的 RSA 算法

    参考资料 25行代码实现完整的RSA算法
  • 运维面试大全

    文章目录 第一阶段 平常怎么处理故障 思路是什么样的 公网和私网分类以及范围 本机地址 网络地址 广播地址 交换机的工作原理 ICMP是什么干什么用的 它有哪些命令 TCP和UDP协议的区别 tcp有哪些控制位 分别是什么意思 你是用过哪些
  • STM32——串口概念及应用

    目录 通讯接口背景知识 两种通讯方式对比 串口通讯 常见的串行通信接口 STM32串口通信基础 STM32的串口通信接口 UART异步通信方式引脚连接方法 UART异步通讯方式特点 串口通信过程 串口异步通讯需要定义的参数 STM32常用串
  • 使用Tensorflow2.0执行视觉显著性检测(Visual Saliency Detection)

    使用Tensorflow2 0执行视觉显著性检测 Visual Saliency Detection 上一篇博客介绍了如何使用Python OpenCV执行视觉显著性检测 Visual Saliency Detection 这篇博客将介绍如
  • HTTP服务器(一)HTTP服务器入门介绍

    一 简介 1 1 做项目的时候 要请求REST服务器 而FEST服务器还是用http基本原理 即阉割版 来请求 1 2 请求端口EndPoint 请求方法Method 请求内容格式ContentType 请求的数类型PostData 一般为
  • C++ 代码评审最终指南——第 2 部分

    在第 1 部分中 我们对代码评审做了一个广泛讨论 这一部分将重点讨论 C 提供一个代码评审清单和一些最佳实践 您可以按任何顺序阅读 但是我们建议您先返回去阅读一下我们之前的帖子 C 评审最终清单 代码评审清单从来都不是全面的 因为要检查的问
  • linux 安装dotnet sdk

    linux 安装dotnet sdk 以dotnet6 0为例 1 下载linux内核对应的dotnet6 0 sdk文件 进入https dotnet microsoft com en us download dotnet 6 0 找到l
  • stn32cubemx生成代码有问题的解决方法

    问题1 生成代码时 有显示你的生成目录还说一个问题的问题 就是环境没装好 要装一个java的环境 即使你本来已经装了这个环境 但是还是出现了同样的问题 那就装我这个版本 我刚才使用这个版本就成功了 问题2 就是要下相应的固件 manage
  • pycharm、idea插件代理设置,插件安装

    pycharm和idea都是intellij的 所以插件安装是设置代理方法相似 以pycharm举例 1 已经安装的插件列表 2 查找要安装的插件 没有 会给出下载插件的链接地址 3 打开链接地址 弹出如下 搜索在线插件 左下角是http代
  • 14-----关于error while loading shared libraries: xxx.so: cannot open shared object file: No such file

    一 linux找不到动态链接库 so文件的解决方法 关于这种问题 很明显是自己生成的动态库在被使用时 无法找到准确的路径而导致的 1 问题分析 首先运行可以执行程序 若出现上述错误 说明找不到动态库的路径 我们需要使用ldd去查看哪个动态库
  • 在Cisco设备上配置接口速度和双工

    默认情况下 思科交换机将自动协商速度和双工设置 将设备 交换机 路由器或工作站 连接到 Cisco 交换机上的端口时 将发生协商过程 设备将就传输参数达成一致 当今的大多数网络适配器都支持此功能 在本文中 您将了解如何使用 NCM 应用程序
  • FPGA UltraScale+ 利用ICAP原语实现Multiboot功能

    例程参考 https blog csdn net xiaomingzi55 article details 124365631 1 这个贴子说的很清楚 唯一一点就是它是ICAP2 这样写是没问题的 1 对于BPI模式来说 可以通过RS 1
  • python Excel处理

    Python 前言 我是一个菜鸡 写文章是为了记录自己成长的过程 如有错误 请各位大佬轻喷 欢迎大家指正 基础知识不做赘述 下文介绍Excel办公自动化 openpyxl导入 安装步骤 win R 输入cmd 然后打出pip install
  • 单片机上云流程(使用STM32和esp8266构建物联网体系)

    1 首先是给esp8266烧录MQTT固件 咳咳 首先当然是准备一个esp8266 01s和对应的烧录器啊qwq 选择好要烧录进去的固件 没有的话去安信可官网下载 然后配置好对应的选项 点击ERASE先进行擦除 再点击START进行烧录 这
  • Makefile中使用Shell

    http blog csdn net zdl1016 article details 6448989 http blog csdn net absurd article details 636418 Makefile与Shell的问题 大概