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)的更多相关文章

  1. Makefile Shell 脚本;sed命令

    1. 在Makefile中想使用shell脚本,需要添加"@"符号,例如: @if [ -d xxx ]; then \                        //-d 判 ...

  2. Makefile,Shell command,Shell Language 之间的联系

    1. Makefile 首先要知道Makefile 是什么东西,Makefile 是一个指令文件,里面存储着自定义的命令(可以借助已有的命令创造而来)在不同的系统下对Makefile 的区别不一样,L ...

  3. 内核驱动编译之Makefile shell pwd路径问题

    一般我们在写Makefile的时候为了获取到当前Makefile所在的文件夹路径,会使用TopDIR ?= $(shell pwd)来定义,后续的文件路径都是基于此TopDIR基础上使用. 今天在移植 ...

  4. Linux 内核模块编译 Makefile

    驱动编译分为静态编译和动态编译:静态编译即为将驱动直接编译进内核,动态编译即为将驱动编译成模块. 而动态编译又分为两种: a -- 内部编译 在内核源码目录内编译 b -- 外部编译 在内核源码的目录 ...

  5. Makefile 实际用例分析(一) ------- 比较通用的一种架构

    这里不再说Makefile的基本知识,如果需要学习,那么请参考: 下载:makefile 中文手册 或者 点击打开链接 或者 跟我一起写Makefile( 陈皓 ) 这里说的是一般的实际的一个工程应该 ...

  6. C语言操作mysql

    php中 mysqli, pdo 可以用 mysqlnd 或 libmysqlclient 实现 前者 从 php 5.3.0起已内置到php中, 并且支持更多的特性,推荐用 mysqlnd mysq ...

  7. Linux下c/c++项目代码覆盖率的产生方法

    最近做了一系列的单元测试相关的工作,除了各种规范及测试框架以外,讨论比较多的就是关于代码覆盖率的产生,c/c++与其他的一些高级语言或者脚本语言相比较而言,例如 Java..Net和php/pytho ...

  8. Hadoop流程---从tpch到hive

    刚接触Hadoop,看了一周的Hadoop及其相应的组件,感觉效果不是很明显,于是将找个例子练一下手,跑一个流程,加深对hadoop的理解. 设计的流程如下: TPC_H--->HdFS---- ...

  9. 使用gcc命令编译多个文件

    使用g++命令直接一次性编译多个文件 这里以简单的HelloWorld程序为例,假设我们一共有三个文件:main.cpp,HelloWorld.cpp和HelloWorld.h. 其中HelloWor ...

随机推荐

  1. vuex 子组件传值

    以下是基础的使用方法,详细且深入使用方法详细见博客:https://segmentfault.com/a/1190000015782272 Vuex官网地址:https://vuex.vuejs.or ...

  2. HyperlinkedIdentityField

    1.简介 其实就是创建一个链接,把查询到对象放到链接上,点链接可以查看.实际上用的很少. 2. views代码 查找的是一个对象的所有数据,link只是放在这个对象其中一个字段上的数据. from d ...

  3. [py]python __file__ 与argv[0]

    http://andylin02.iteye.com/blog/933237 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__ ...

  4. Let Encrypt延期(转自虞大胆的叽叽喳喳)

    前几天发现我的 letsencrypt 通配符证书快过期了,想为这两张证书续期(renew). 首先运行命令查看我的所有证书: $ certbot-auto certificates 其中证书名 si ...

  5. fullPage最后一屏自适应

    fullpage最后一屏可以有多少内容展示多少内容 1.需要引用一个滚动条 插件:jquery.slimscroll.js 2.引用一个属性   'scrollOverflow': true, 备注: ...

  6. [Java in NetBeans] Lesson 00. Getting Set-up for Learning Java

    这个课程的参考视频在youtube. 主要学到的知识点有: set up needs Java SE JDK, NetBeans IDE class name should be the same l ...

  7. 20165321 实验三 敏捷开发与XP实践

    任务1: 要求: 参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD 安装alibaba 插件,解决代码中的规范问题. 在I ...

  8. end to end

    深度学习中的end to end是什么意思? 端到端就是输入一个数据进入模型,然后模型直接可以输出你想要的结果,也就是一体性. 简单讲就是,Input--->系统(这里指神经网络)---> ...

  9. antlr安装

    安装java环境,环境变量设置如下: ANTLR 简介 ANTLR—Another Tool for Language Recognition,Antlr 本身是使用 Java 开发的,它为包括Jav ...

  10. PHP开启mysqli扩展

    Call to undefined function mysqli_connect()解决这个问题需要开启mysqli扩展开启mysqli扩展需要这两个步骤缺一不可1.在php.ini中搜索php_m ...