#!/bin/bash

#build/tools/findleaves.sh

set-onounset#failwhendereferencingunsetvariables

#扩展一个未设置的变量时显示一个错误信息

set-oerrexit#failifanysubcommandfails

#当命令返回一个非零退出状态(失败)时退出

progName=`basename$0`

#``之间是执行的shell命令,basename-用于去掉文件名的目录和后缀

functionwarn(){

echo"$progName:[email protected]">&2

}

#输出警告信息到错误终端

functiontrace(){

echo"$progName:[email protected]"

}

functionusage(){

if[[$#>0]] #$#表示shell参数个数,$0表示shell后跟的第一个参数

then

warn[email protected]

fi

cat<<-EOF

Usage:$progName[<options>]<dirlist><filename>

Options:

--mindepth=<mindepth>

--maxdepth=<maxdepth>

Bothbehaveinthesamewayastheirfind(1)equivalents.

--prune=<glob>

Avoidsreturningresultsfromanypathmatchingthegivenglob-style

pattern(e.g.,"*/out/*").Maybeusedmultipletimes.

#--prune表示忽略一些目录,不需要在这些目录中查找目标文件

EOF

exit1

}

functionfail(){

warn[email protected]

exit1

}

if[$#-lt2] #如果参数总个数小于2

then

usage

fi

findargs=""

while[["${1:0:2}"=="--"]]#参数解析

#取第二个参数字符串的前两个字符,${1:0:2}1表示第二个参数,0表示第一个参数的起

#始下标,2表示需要截取的字符个数

do

arg=${1:2}

name=${arg%%=*}

value=${arg##*=}#获取参数名字和值

if[["$name"=="mindepth"||"$name"=="maxdepth"]]

then

#Addtobeginningoffindargs;thesemustcomebeforetheexpression.

findargs="-$name$value$findargs"

elif[["$name"=="prune"]]

then

#Addtoendoffindargs;thesearepartoftheexpression.

findargs="$findargs-path$value-prune-or"

fi

Shift

#linuxfind命令可以加上参数:

#-mindepthvalue-maxdepthvalue-path*/out/*-prune-or

done

nargs=$#

#Thefilenameisthelastargument

filename="${!nargs}"

find"${@:0:$nargs}"$findargs-typef-name"$filename"-print|

#Onlypassalongthedirectoryofeachmatch.

sed-e's///[^//]*$////'|

#关于sed的用法参考后面网址,这里只要是接收前面find后的结果。

#/在命令行中是分隔符,如果引用真正的/话,那么需要利用转义字符/,//

#通配符“*”表示在它之前的字符重复任意次,“.”则表示任意字符,^$表示空行

#$锚定行的结束如:/sed$/匹配所有以sed结尾的行

#对结果中的符号进行规则化

LC_ALL=Csort|

#排序后输出

awk-v"filename=$filename"'

(NR==1)||(index($0,last)!=1){

last=$0;

printf("%s%s/n",$0,filename);

}

'

Android编译系统中,该脚本findleaves.sh典型应用如下:

main.mk中调用了findleaves.sh,得到所有子目录下Android.mk文件的路径。

subdir_makefiles:=/
$(shellbuild/tools/findleaves.sh--prune=out--prune=.repo--prune=.git--prune=.svn$(subdirs)Android.mk)

$(subdirs)一般编译中取值$(TOP)

该语句依次选取$(subdirs)中的目录,然后遍历所有子目录查找Android.mk文件,如果有,则将其路径加入到返回列表中。


makefile的模式规则和自动化变量

模式规则中,至少在规则的目标定义中要包含"%",否则,就是一般的规则。目标中的"%"定义表示对文件名的匹配,"%"表示长度任意的非空字符串。

如果"%"定义在目标中,那么,目标中的"%"的值决定了依赖目标中的"%"的值,也就是说,目标中的模式的"%"决定了依赖目标中"%"的样子。例如有一个模式规则如下:

%.o:%.c

<command......>

其含义是,指出了怎么从所有的[.c]文件生成相应的[.o]文件的规则。如果要生成的目标是"a.ob.o",那么"%c"就是"a.cb.c"。一旦依赖目标中的"%"模式被确定,那么,make会被要求去匹配当前目录下所有的文件名

下面这个例子表示了,把所有的[.c]文件都编译成[.o]文件.

%.o:%.c

$(CC)-c$(CFLAGS)$(CPPFLAGS)$<-o[email protected]

其中,"[email protected]"表示所有的目标的挨个值,"$<"表示了所有依赖目标的挨个值。这些奇怪的变量我们叫"自动化变量"

[email protected]
表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"[email protected]"就是匹配于目标中模式定义的集合。
$<
依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。


参考:

1.http://hi.baidu.com/zhupan19851230/blog/item/8f2dcefefaf2e551d7887d8f.html

makefile自动化变量及其说明

2. http://md20040208.blog.163.com/blog/static/30069427201082873938698/

linuxsed用法

3.http://linux.chinaunix.net/techdoc/system/2007/05/01/956819.shtml

sed命令使用详解

更多相关文章

  1. Android消息提示框
  2. Android(安卓)WebView Authorization认证 (解决不认证报401的问
  3. Android(安卓)-- android activity 各种布局方式以及相关参数
  4. OkHttp的初步使用(get、post之{RequestBody、FormBody、Multipar
  5. Android(安卓)开发中uboot传给Kernel 的androidboot.xxx命令行参
  6. Android(安卓)解决静态广播收不到的问题
  7. android 2.2 视频和图片的缩略图处理
  8. Android中Message传递参数【安卓进化十六】
  9. Android(安卓)http get/post传递参数

随机推荐

  1. Dex2Oat源码流程(1)——Android6.0
  2. Android(安卓)判断手机厂商rom
  3. android View移动总结
  4. Android(安卓)NDK 异常 Error:No toolcha
  5. Android用代码测试Activity的生命周期
  6. Android通知栏点击无法启动Activity的问
  7. 最简便实现Android(安卓)ListView选中ite
  8. Android(安卓)Studio中使用开源库volley
  9. Android(安卓)设计模式之原型模式
  10. Android中实现长按照片弹出右键菜单