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
其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符,即删除 http://
结果是 :www.aaa.com/123.htm
2 . ## 号截取
复制代码 代码如下:
echo ${var
##*/ 表示从右边开始删除第一个 / 号及左边的所有字符,即删除 http://www.aaa.com/
结果是 123.htm
3 . %号截取,删除右边字符,保留左边字符
复制代码 代码如下:
echo ${var%/*}
%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:http://www.aaa.com
4 . %% 号截取,删除右边字符,保留左边字符
复制代码 代码如下:
echo ${var%%/*}
%%/* 表示左边开始,删除第一个 / 号及右边的字符
结果是:http:
5 . 从左边第几个字符开始,及字符的个数
复制代码 代码如下:
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:
6 . 从左边第几个字符开始,一直到结束。
复制代码 代码如下:
echo ${var:7}
其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm
7 . 从右边第几个字符开始,及字符的个数
复制代码 代码如下:
echo ${var:0-7:3}
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123
8 . 从右边第几个字符开始,一直到结束。
复制代码 代码如下:
echo ${var:0-7}
表示从右边第七个字符开始,一直到结束。
结果是:123.htm
注:左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示