Makefile shell subst $(1)
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 ##########
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
Makefile shell subst $(1)的更多相关文章
- Makefile Shell 脚本;sed命令
1. 在Makefile中想使用shell脚本,需要添加"@"符号,例如: @if [ -d xxx ]; then \ //-d 判 ...
- Makefile,Shell command,Shell Language 之间的联系
1. Makefile 首先要知道Makefile 是什么东西,Makefile 是一个指令文件,里面存储着自定义的命令(可以借助已有的命令创造而来)在不同的系统下对Makefile 的区别不一样,L ...
- 内核驱动编译之Makefile shell pwd路径问题
一般我们在写Makefile的时候为了获取到当前Makefile所在的文件夹路径,会使用TopDIR ?= $(shell pwd)来定义,后续的文件路径都是基于此TopDIR基础上使用. 今天在移植 ...
- Linux 内核模块编译 Makefile
驱动编译分为静态编译和动态编译:静态编译即为将驱动直接编译进内核,动态编译即为将驱动编译成模块. 而动态编译又分为两种: a -- 内部编译 在内核源码目录内编译 b -- 外部编译 在内核源码的目录 ...
- Makefile 实际用例分析(一) ------- 比较通用的一种架构
这里不再说Makefile的基本知识,如果需要学习,那么请参考: 下载:makefile 中文手册 或者 点击打开链接 或者 跟我一起写Makefile( 陈皓 ) 这里说的是一般的实际的一个工程应该 ...
- C语言操作mysql
php中 mysqli, pdo 可以用 mysqlnd 或 libmysqlclient 实现 前者 从 php 5.3.0起已内置到php中, 并且支持更多的特性,推荐用 mysqlnd mysq ...
- Linux下c/c++项目代码覆盖率的产生方法
最近做了一系列的单元测试相关的工作,除了各种规范及测试框架以外,讨论比较多的就是关于代码覆盖率的产生,c/c++与其他的一些高级语言或者脚本语言相比较而言,例如 Java..Net和php/pytho ...
- Hadoop流程---从tpch到hive
刚接触Hadoop,看了一周的Hadoop及其相应的组件,感觉效果不是很明显,于是将找个例子练一下手,跑一个流程,加深对hadoop的理解. 设计的流程如下: TPC_H--->HdFS---- ...
- 使用gcc命令编译多个文件
使用g++命令直接一次性编译多个文件 这里以简单的HelloWorld程序为例,假设我们一共有三个文件:main.cpp,HelloWorld.cpp和HelloWorld.h. 其中HelloWor ...
随机推荐
- axios的使用
一.首先要安装axios npm install axios 使用: -先在main中配置: import axios from 'axios' //要把axios放进一个全局变量中 //把axios ...
- ORM表操作
1.在python脚本中调用django环境 在根文件夹下,创建test.py文件 import os if __name__ == '__main__': os.environ.setdefault ...
- 多线程——Executor、ExecutorService、Executors三者的区别
Executor.ExecutorService.Executors三者的区别: 层次关系: public interface ExecutorService extends Executor {} ...
- [js]js中6种错误处理机制
js中6种错误 http://javascript.ruanyifeng.com/grammar/error.html#toc5 https://www.jianshu.com/p/467b9a145 ...
- mysql数据库字段类型详解
MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述. ...
- 使用VS2013自带的PreEmptive Dotfuscator and Analytis来混淆C#代码
1. 使用VS2013编译你要打包的程序,会在文件夹中的 ..\bin\Release中 2. 点击VS2013中的TOOLS -> PreEmptive Dotfuscator and Ana ...
- iOS UI布局-VFL语言
什么是VFL语言 VFL(Visual Format Language),“可视化格式语言”. VFL是苹果公司为了简化autolayout的编码而推出的抽象语言. 语法说明 H:[cancelBut ...
- cocos2d JS 错误异常抛出捕获和崩溃拦截
Error对象 一旦代码解析或运行时发生错误,JavaScript引擎就会自动产生并抛出一个Error对象的实例,然后整个程序就中断在发生错误的地方. Error对象的实例有三个最基本的属性: nam ...
- SwingBench 字符模式压测最佳实践
之前写过<使用SwingBench 对Oracle RAC DB性能 压力测试>,使用的是最基础直观的图形模式,已经可以满足大多数需求. 但是在有些场景下,图形模式可能本身消耗资源过大,尤 ...
- vue中解决跨域问题
方法1.后台更改header header('Access-Control-Allow-Origin:*');//允许所有来源访问 header('Access-Control-Allow-Metho ...