基于cygwin构建u-boot(五)结尾:shell 工具
结尾,基于cygwin对u-boot的处理,很大一部分都是再处理 路径等相关的问题,只有一个涉及到gcc的参数配置。
为了达到顺利编译的目的,使用shell下的部分工具进行处理。
1、sed
sed简单说,是一种按照特定处理方式,对指定文件 逐行处理 的脚本程序。
1 $ sed --help 2 用法: sed [选项]... {脚本(如果没有其他脚本)} [输入文件]... 3 4 -n, --quiet, --silent 5 取消自动打印模式空间 6 -e 脚本, --expression=脚本 7 添加“脚本”到程序的运行列表 8 -f 脚本文件, --file=脚本文件 9 添加“脚本文件”到程序的运行列表 10 --follow-symlinks 11 直接修改文件时跟随软链接 12 -i[SUFFIX], --in-place[=SUFFIX] 13 edit files in place (makes backup if SUFFIX supplied) 14 -b, --binary 15 以二进制方式打开文件 (回车加换行不做特殊处理) 16 -l N, --line-length=N 17 指定“l”命令的换行期望长度 18 --posix 19 关闭所有 GNU 扩展 20 -r, --regexp-extended 21 在脚本中使用扩展正则表达式 22 -s, --separate 23 将输入文件视为各个独立的文件而不是一个长的连续输入 24 -u, --unbuffered 25 从输入文件读取最少的数据,更频繁的刷新输出 26 -z, --null-data 27 separate lines by NUL characters 28 --help 打印帮助并退出 29 --version 输出版本信息并退出 30 31 如果没有 -e, --expression, -f 或 --file 选项,那么第一个非选项参数被视为 32 sed脚本。其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准 33 输入读取数据。
脚本中,替换功能为 's/string1/string2/g'
其中:
1、s开头表示字符串替换;
2、string1 被 string2 替换; 其中 string如果带特殊字符需要用 \ 开始转义(例如 / 需要写为 \/ )
3、结尾的g表示全局替换,不添加表示只替换首个。
下面说明 rules.mk中 sed -e 's/\(.*\)\.\w/\1.o/的含义
-e表示特性脚本, s表示 字符串替换,
string1 = \(.*\)\.\w , \( 和 \)表示引用,被后面的 \1引用。 \w表示任意word(单词)
string2 =\1.o
相当于 将文件名 和 文件名后缀分开,将后缀名替换为o, 例如 hello.c 替换为 hello.o。
2、if
1 $ help if 2 if: if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
shell下提供 if then elif else 进行判断,可以解决 之前 .depend不存在时的处理,但还需要识别文件是否存在的功能,这就需要test函数。
3、test
1 $ help test 2 test: test [expr] 3 Evaluate conditional expression. 4 5 Exits with a status of 0 (true) or 1 (false) depending on 6 the evaluation of EXPR. Expressions may be unary or binary. Unary 7 expressions are often used to examine the status of a file. There 8 are string operators as well, and numeric comparison operators. 9 10 File operators: 11 12 -a FILE True if file exists. 13 -b FILE True if file is block special. 14 -c FILE True if file is character special. 15 -d FILE True if file is a directory. 16 -e FILE True if file exists. 17 -f FILE True if file exists and is a regular file. 18 -g FILE True if file is set-group-id. 19 -h FILE True if file is a symbolic link. 20 -L FILE True if file is a symbolic link. 21 -k FILE True if file has its `sticky' bit set. 22 -p FILE True if file is a named pipe. 23 -r FILE True if file is readable by you. 24 -s FILE True if file exists and is not empty. 25 -S FILE True if file is a socket. 26 -t FD True if FD is opened on a terminal. 27 -u FILE True if the file is set-user-id. 28 -w FILE True if the file is writable by you. 29 -x FILE True if the file is executable by you. 30 -O FILE True if the file is effectively owned by you. 31 -G FILE True if the file is effectively owned by your group. 32 -N FILE True if the file has been modified since it was last read. 33 34 FILE1 -nt FILE2 True if file1 is newer than file2 (according to 35 modification date). 36 37 FILE1 -ot FILE2 True if file1 is older than file2. 38 39 FILE1 -ef FILE2 True if file1 is a hard link to file2. 40 41 String operators: 42 43 -z STRING True if string is empty. 44 45 -n STRING 46 STRING True if string is not empty. 47 48 STRING1 = STRING2 49 True if the strings are equal. 50 STRING1 != STRING2 51 True if the strings are not equal. 52 STRING1 < STRING2 53 True if STRING1 sorts before STRING2 lexicographically. 54 STRING1 > STRING2 55 True if STRING1 sorts after STRING2 lexicographically. 56 57 Other operators: 58 59 -o OPTION True if the shell option OPTION is enabled. 60 ! EXPR True if expr is false. 61 EXPR1 -a EXPR2 True if both expr1 AND expr2 are true. 62 EXPR1 -o EXPR2 True if either expr1 OR expr2 is true. 63 64 arg1 OP arg2 Arithmetic tests. OP is one of -eq, -ne, 65 -lt, -le, -gt, or -ge. 66 67 Arithmetic binary operators return true if ARG1 is equal, not-equal, 68 less-than, less-than-or-equal, greater-than, or greater-than-or-equal 69 than ARG2. 70 71 Exit Status: 72 Returns success if EXPR evaluates to true; fails if EXPR evaluates to 73 false or an invalid argument is given.
其中 -e 或者 -f 参数用于判断文件是否存在。
判断 .depend 是否存在的功能就是
if test -e $@; then sed -i 's/d:\//\/cygdrive\/d\//g' $@; fi
更多精进的功能还需要更深入的熟悉linu shell。