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. [py]Python使用UUID库生成唯一ID(uuid模块)

    https://www.cnblogs.com/dkblog/archive/2011/10/10/2205200.html uuid介绍 UUID是128位的全局唯一标识符,通常由32字节的字符串表 ...

  2. 96A

    #include <iostream> #include <string> #include <cctype> using namespace std; int m ...

  3. CentOS下samba配置心得(smb和nmb都要启动)

    印象中以前多次配置成功过,重新配置就把以前的资料找出来: yum安装 samba samba-client samba-swat,然后配置参见:http://www.cnblogs.com/mchin ...

  4. .Net拾忆:HttpWebRequest/WebClient两种方式模拟Post

    一.代码 1.HttpWebRequest public static string DoPost( string target, string content ) { try { string pa ...

  5. MVC5 您不能调用控制器“xx”上的操作方法“xx”,因为该方法是一种泛型方法

    在 MVC5 中当使用   routes.MapMvcAttributeRoutes() 添加路由属性是导致在控制器创建的泛型方法调用错误: Cannot call action method 'Sy ...

  6. MYSQL导入数据时,出现错误:Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1

    Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1 这个问题,原因是UTF-8编码有可能是两个.三个.四个字节.Emoji表 ...

  7. <5>Lua多返回值和require模块

    1.多返回值 --1: 一个lua函数可以返回多个返回值: --2: 定义多个变量来接受多返回值 --3: lua的unpack函数,解开表里的单个的值; 结果 2.require模块 --1: 第一 ...

  8. Web API 跨域问题

    解决办法: 1.web.config <system.webServer> <handlers> <remove name="ExtensionlessUrlH ...

  9. 20155228 2016-2017-2 《Java程序设计》第2周学习总结

    20155228 2006-2007-2 <Java程序设计>第2周学习总结 教材学习内容总结 类型 Java可以区分为基本类型和类类型(或称参考类型).对于基本类型,使用时得考虑一下数据 ...

  10. MySql获取两个日期间的时间差

    [1]MySql 语言获取两个日期间的时间差 DATEDIFF 函数可以获得两个日期之间的时间差.但是,这个函数得出的结果是天数. 需要直接获取秒数可使用TIMESTAMPDIFF函数.应用示例如下: ...