Makefile shell subst $(1)

2023-05-16

MAKE_3_80_realpath    = $(shell $(top_srcdir)/scripts/realpath.sh '$(subst $(SQUOTE),\\$(SQUOTE),$(1))')

以上Makefile思考好几天不得要领:

今天想通了,是为记。

 

include $(top_srcdir)/include/mk/functions.mk

functions.mk的内容如下:

SQUOTE            := '

# ' # to keep colorized editors from going nuts

MAKE_3_80_realpath    = $(shell $(top_srcdir)/scripts/realpath.sh '$(subst $(SQUOTE),\\$(SQUOTE),$(1))')

MAKE_3_80_abspath    = $(shell $(top_srcdir)/scripts/abspath.sh '$(subst $(SQUOTE),\\$(SQUOTE),$(1))')

几个要点:

1.'不能单独出现,所以巧妙匹配# '

2.$(1)百思不得其解,后来在source insight中搜索对MAKE_3_80_realpath 的引用 发现:

abs_top_builddir        := $(call MAKE_3_80_abspath,$(top_builddir))

$(1)是call函数中的参数

'$(subst $(SQUOTE),\\$(SQUOTE),$(1))'先对参数进行字符替换,里面有个小trick,‘替换为\'

\\第一个为转义字符

 

$(top_srcdir)/scripts/realpath.sh
############## realpath.sh ############
. "${0%/*}/lib/file_functions.sh"

######### file_functions.sh ###########
_abspath() {
    echo "$@" | awk -v PWD=$(pwd) '{
    sub(/^[[:space:]]+/, ""); sub(/[[:space:]]+$/, ""); # 1.
    if ($0 == "") {
        print PWD
    } else {
        if (!($0 ~ /^\//)) { # i.
            $0 = PWD "/" $0
        }
        while (gsub(/\/\//, "/")) { }; # ii.
        while (sub(/\/[^\/]+\/\.\.\/?/, "/")) { }; # iii.
        while (sub(/\/\.\//, "/")) { }; # iv.
        sub(/(\/\.)?\/$/, "");
        sub(/^\.\//, "/");
        sub(/\/\.$/, "");
        if ($0 == "") {
            print "/"
        } else {
            if ($0 == ".") {
                print PWD
            } else {
                print
            }
        }
    }
}'
}

_realpath() {
    readlink -f "$@"
}
######### end of file_functions.sh ####
while [ $# -gt 0 ] ; do
    echo -n $(_realpath "$1")
    [ $# -gt 1 ] && echo -n " "
    shift
done
######### end of realpath.sh ##########

 

. "${0%/*}/lib/file_functions.sh"   ${0%/*}见下面解释,%/* 表示从右边开始,删除第一个 / 号及右边的字符 第一个.号表示source 导入的意思。

MAKE_3_80_realpath    = $(shell $(top_srcdir)/scripts/realpath.sh '$(subst $(SQUOTE),\\$(SQUOTE),$(1))')

MAKE_3_80_abspath    = $(shell $(top_srcdir)/scripts/abspath.sh '$(subst $(SQUOTE),\\$(SQUOTE),$(1))')

_abspath 不想去细究了,直接试一下

 ttt -> safe_rm.sh

./abspath.sh ttt

/home/zhangyi/work/ltp-ddt-fmsh-psoc-test/scripts/ttt

./realpath.sh ttt
/home/zhangyi/work/ltp-ddt-fmsh-psoc-test/scripts/safe_rm.sh

 

 

 

${0##*/} ${0#*/} ${0%/*} ${0%%/*}

 

 

Linux 的字符串截取很有用。有八种方法。

假设有变量 var=http://www.aaa.com/123.htm.

1 . # 号截取,删除左边字符,保留右边字符。

复制代码 代码如下:

echo ${var#*//}
  • 1

其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符,即删除 http://
结果是 :www.aaa.com/123.htm

2 . ## 号截取

复制代码 代码如下:

echo ${var##*/}
  • 1

##*/ 表示从右边开始删除第一个 / 号及左边的所有字符,即删除 http://www.aaa.com/
结果是 123.htm

3 . %号截取,删除右边字符,保留左边字符

复制代码 代码如下:

echo ${var%/*}
  • 1

%/* 表示从右边开始,删除第一个 / 号及右边的字符

结果是:http://www.aaa.com

4 . %% 号截取,删除右边字符,保留左边字符

复制代码 代码如下:

echo ${var%%/*}
  • 1

%%/* 表示左边开始,删除第一个 / 号及右边的字符
结果是:http:

5 . 从左边第几个字符开始,及字符的个数

复制代码 代码如下:

echo ${var:0:5}
  • 1

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:

6 . 从左边第几个字符开始,一直到结束。

复制代码 代码如下:

echo ${var:7}
  • 1

其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm

7 . 从右边第几个字符开始,及字符的个数
复制代码 代码如下:

echo ${var:0-7:3}
  • 1

其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123

8 . 从右边第几个字符开始,一直到结束。

复制代码 代码如下:

echo ${var:0-7}
  • 1

表示从右边第七个字符开始,一直到结束。
结果是:123.htm

注:左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示

转载于:https://www.cnblogs.com/idyllcheung/p/10419010.html

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

Makefile shell subst $(1) 的相关文章

  • Makefiles:从一个目录获取.cpp,并将编译后的.o放在另一个目录中

    我正在开发适用于移动设备 Windows Mobile 6 和 Android 的跨平台 2D 引擎 我的 Windows 版本已基本准备就绪 但我仍需要确保 Android 上也提供相同的功能 我想要的是一个Makefile在项目的根目录
  • 用于解析文件( csv )并逐行处理的 Shell 脚本[重复]

    这个问题在这里已经有答案了 您好 需要一个 shell 脚本来解析 csv 文件 逐行解析 然后逐个字段 该文件将如下所示 X1 X2 X3 X4 Y1 Y2 Y3 Y4 我需要提取这些 X1 X2 我写了一个脚本 但如果行超过一行 它就会
  • VIM:有没有一种简单的方法可以从 Vim 管理 Visual Studio 解决方案/makefile 项目? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我尝试使用 Visual Studio 而不是 VIM 插件 但说实话 VS 相对于 VIM 的唯一优势是它能够自动管理我的项目 我知道 VS
  • 使用 sed 和 pstree 显示正在使用的终端类型

    我一直在尝试仅显示用作名称的终端类型 例如 如果我使用 konsole 它会显示 konsole 到目前为止我一直在使用这个命令 pstree A s 输出这个 systemd konsole bash pstree 我有以下内容可以从该行
  • 如何在 linux bash shell 中对字符串数组进行排序? [复制]

    这个问题在这里已经有答案了 例如 数组是 link2 pathname link1 pathname link3 pathname 我怎样才能得到像下面这样的数组 link1 pathname link2 pathname link3 pa
  • 在 PATH 中找不到程序“make”

    我在 Eclipse 中遇到 程序 make 未在 PATH 中找到 错误 我检查了路径变量 C cygwin bin JAVA HOME bin ANT HOME bin ANDROID SDK tools ANDROID SDK pla
  • 如何找到某个命令的目录?

    我知道 当您使用 shell 时 唯一可以使用的命令是可以在 PATH 上设置的某些目录中找到的命令 即使我不知道如何查看 PATH 变量上的目录 这是另一个可以回答的好问题 我想知道的是 我来到 shell 并写道 lshw 我想知道 s
  • Shell 脚本 - 迭代空格分隔的单词/字符(在 zsh 中)

    我在弄清楚如何在 shell 脚本中迭代空格分隔的单词 字符时遇到一些麻烦 例如 我想迭代一个包含字母表中由空格分隔的字符的变量 注意 即使字母表变量包含空格分隔的字符串而不是字符 结果也应该是相同的 即 aa bb cc 而不是 a b
  • 传递到 mvn exec:java 时保留参数间距等

    我有一个启动 Maven exec java 进程的 shell 脚本 exec mvn exec java Dexec mainClass Dexec args 现在可悲的是如果我跑步 myMagicShellScript arg1 ar
  • Emacs 退出终端

    在 Emacs 中运行终端模式时使用M x term using C x C o我无法切换到另一个缓冲区来继续处理事情 我知道这是可能的M x shell但使用此命令时 shell 的某些方面不起作用 less more 手册页等 我想知道
  • 如何通过管道将输入和输出传送到交互式 shell?

    我正在尝试构建一个应用程序 使用户能够与命令行交互式 shell 例如 IRB 或 Python 进行交互 这意味着我需要将用户输入通过管道传输到 shell 并将 shell 的输出返回给用户 我希望这会像管道 STDIN STDOUT
  • 如何在 makefile 中针对特定目标使用 include 指令

    我只想将 include 指令用于特定目标 当不需要目标时 我不想运行其他 makefile 因为这意味着 makefile 是不必要生成的 那么有没有一种方法可以有条件地使用 include 指令 该指令以目标为条件 或者以某种方式使 i
  • 如何在c#中使用net user

    我正在尝试将 net user 与 c 一起使用 System Diagnostics ProcessStartInfo proccessStartInfo new System Diagnostics ProcessStartInfo n
  • 将 stdout 和 stderr 捕获到不同的变量中

    是否可以存储或捕获 stdout 和 stderr不同的变量 不使用临时文件 现在我这样做是为了获得标准输出out和标准错误err跑步时some command 但我会 喜欢避免临时文件 error file mktemp out some
  • 从命令行获取设备的 Android SDK 版本

    我计划构建一个自动化系统 用于将 Android 版本部署到各种设备 以便使多平台开发更加轻松 有没有办法通过android shell或adb获取连接设备的sdk版本 将有一台计算机连接多个测试设备 我计划编写一个脚本 该脚本将从构建服务
  • bash while 循环线程

    我有一个 while 循环读取来自 a 的行 hosts while read line do ip line check done lt hosts 我的问题是我可以使用某种方法来加快速度 或者一次在 10 个主机上运行检查 每个检查都在
  • mingw32-make 的目录更改错误

    我正在MinGW32下构建POCO库1 6 0 环境 Windows 7 Ultimate 32位 shell MSYS 执行成功 配置 configure Configured for MinGW config make的内容 POCO
  • 检查 makefile 中的文件大小,如果文件太短则停止

    有没有办法检查特定文件的大小是否小于某个常量 我在 makefile 中假设有关大小的事情 并希望确保如果不满足我的假设 我会收到错误 类似于断言 但在 makefile 中 if filesize file gt C then error
  • 是否可以将 CFLAGS 设置为 Linux 内核模块 Makefile?

    例如 常见设备模块的Makefile obj m jc o default MAKE C lib modules shell uname r build M shell pwd modules clean MAKE C lib module
  • 使用 Shell 脚本提供密码

    我已将客户端和服务器设置为无密码登录 就像无密码登录一样 通过将服务器的 RSA 密钥复制到所有客户端的 root ssh id rsa pub 来实现 但这是我手动完成的 我喜欢使用 shell 脚本自动执行此过程 并通过脚本向计算机提供

随机推荐

  • springboot启动报错:Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualif...

    Caused by org springframework beans factory NoSuchBeanDefinitionException No qualifying bean of type 39 com zxkj lockser
  • 例解 Linux 下 Make 命令

    Linux 下 make 命令是系统管理员和程序员用的最频繁的命令之一 管理员用它通过命令行来编译和安装很多开源的工具 xff0c 程序员用它来管理他们大型复杂的项目编译问题 本文我们将用一些实例来讨论 make 命令背后的工作机制 Mak
  • 颜色代码对应表

    颜色代码表 http www knowsky com tools advancedColorPicker swf width 61 900 height 61 500 先用鼠标左键在左边大的方框内移动获取颜色 xff08 黑色三角上下移动调
  • 小草1.3.0

    VERSION 转载于 https www cnblogs com llw87 p 10149903 html
  • go gorm获取数据库报错:goexit: BYTE $0x90 // NOP

    报错内容很多 xff0c 其实看下来有用的其实就几条 runtime error invalid memory address or nil pointer dereference goexit BYTE 0x90 NOP 我按照官方示例和
  • chrome浏览器开发者工具F12中某网站的sources下的源码如何批量保存?

    目录 chrome浏览器 开发者工具F12中某网站的sources下的源码如何批量保存1 常用保存Sources源码的两种方法 1 1单个文件1 2 单个页面2 问题3 解决方案 chrome浏览器 开发者工具F12中某网站的sources
  • GlobalExceptionHandler 捕获抛出的异常,返回特定值给前端

    64 author hhh 64 date 2019 1 17 16 28 64 Despriction 64 ResponseBody 64 ControllerAdvice 64 Log4j2 public class GlobalEx
  • 获取百度地图POI数据一(详解百度返回的POI数据)

    POI是一切可以抽象为空间点的现实世界的实体 xff0c 比如餐馆 xff0c 酒店 xff0c 车站 xff0c 停车场等 POI数据具有空间坐标和各种属性 xff0c 是各种地图查询软件的基础数据之一 百度地图作为国内顶尖的地图企业 x
  • c/c++ linux epoll系列3 利用epoll_wait设置timeout时间长度

    linux epoll系列3 利用epoll wait设置timeout时间长度 epoll wait函数的第四个参数可以设置 xff0c epoll wait函数的等待时间 xff08 timeout时间长度 xff09 例子1 xff0
  • socket编程原理

    socket编程原理 1 问题的引入 1 普通的I O操作过程 UNIX系统的I O命令集 xff0c 是从Maltics和早期系统中的命令演变出来的 xff0c 其模式为打开一读 写一关闭 xff08 open write read cl
  • linux考试题答案2016,2016年4月全国自主考试(网络操作系统)真题

    2016年4月全国自主考试 网络操作系统 真题及答案解析 2016年4月全国自主考试 网络操作系统 真题及答案 xff0c 计算机网络自主考试历年真题 一 单项选择题 本大题共20小题 xff0c 每小题2分 xff0c 共40分 在每小题
  • (14)嵌入式软件开发工程师技能要求总结

    找准一个行业方向 xff1a 音视频 人工智能 深度学习 视觉识别 机器学习 嵌入式软件开发工程师 xff1a 技能要求 xff1a 熟悉 Linux操作系统 shell 脚本语言 mysql 的开发 xff0c 部署 xff0c 优化优先
  • 原来bug解决了,是这样的感觉

    终于过了 xff0c 感觉好想哭啊 xff0c 又莫名其妙的爽 xff0c 原来这就是bug 转载于 https www cnblogs com allison aichipingguo p 10018117 html
  • 闲话handle和handler

    虽然handle和handler只有一个字符之差 xff0c 但在计算机的世界里 xff0c 含义却大相径庭 1 先说说handle 北京话说 34 一边儿玩儿去 xff0c 玩勺子把儿去 34 xff0c 34 勺子把儿 34 说的就是h
  • 大数据发展前沿 期末总结复习

    其实就是简单的在网上搜了一下每个重要词条的基本概念 1 对抗学习 xff08 含Pytorch最简单的深度学习命令 xff09 生成对抗网络 xff08 GAN xff09 是非监督式学习的一种方法 xff0c 透过两个神经网络相互博弈的方
  • 出租车Jt/T 905协议与部标1078协议融合的网约车视频监控平台

    出租车 jt t 905协议 xff0c 是 jt t 808 协议的一个变种 xff0c 设计者将部标 808 协议拿过来 xff0c 并不是单纯的增加网约车相关的指令集 xff0c 而且对原有的指令如定位 0 0200 指令也进行了修改
  • 几款Git GUI客户端工具

    工欲善其事 xff0c 必先利其器 作为一名开发人员 xff0c 你不可能不知道git xff0c 无论你是开发自己的开源项目还是和团队一起进行大规模产品的开发 xff0c git都已经是源代码管理工具的首选 当然 xff0c 那些hard
  • 毕设(一)C#的百度api调用

    这个学期就要毕业了 xff0c 选了一个无人机地面站软件设计的题目 xff0c 这几天也开始着手做 xff0c 首先做了一个百度地图的调用 xff0c 这里因为是上位机的开发 xff0c 所有就不介绍Javascript的 调用方法 xff
  • tf-ros

    http wiki ros org cn tf Tutorials https www ncnynl com archives 201708 1881 html 1 广播变换 发布坐标之间的坐标关系 include lt ros ros h
  • Makefile shell subst $(1)

    MAKE 3 80 realpath 61 shell top srcdir scripts realpath sh 39 subst SQUOTE SQUOTE 1 39 以上Makefile思考好几天不得要领 xff1a 今天想通了 x