高中英语题目,小试牛刀,为什么?谢谢1、Having
morning,Mike ran as fast as
she could _to catch the bus.A.hope
B.to hope C.hoped D.hoping2、Please make my excuse at tomorrow's meeting -I have got too much work _.A.to do to come
B.doing coming
C.to do coming
D.doing to come 3、I am sorry,but I shouldn't have been so rude to you.-You _ your temper but that's OK.A.have lost B.had lost C.did lose D.were losing4、Can you give me the right answer .-Sorry,I _ .Would you repeat the question?A.hadn't listened B.haven't listened
C .don't listen D.wasn't listening 5、So the guard didn't let you in?-No,_ I
told him I came at the invitation of the headmaster.A.even if
Kouichi8276
1.D2.A3.C4.D5.C
1 b2a3c4d5c
为您推荐:
扫描下载二维码openwrt_meunconfig流程
openwrt_meunconfig流程
[摘要:Openwrt 应用make meunconfig敕令,发明menuconfig方针正在include/toplevel.mk文件中,以下: menuconfig:scripts/config/mconf prepare-tmpinfo FORCE if [ ! -e .config -a -e$(HOME)/.openwrt/defconfig ]; then cp $(HOME)/.openwrt/defc]
使用make meunconfig命令,发现menuconfig目标在include/toplevel.mk文件中,如下:
menuconfig:scripts/config/mconf prepare-tmpinfo FORCE
&&&&&& if [ ! -e .config -a -e$(HOME)/.openwrt/defconfig ]; then
&&&&&&&&&&&&& cp $(HOME)/.openwrt/defconfig.
&&&&&& $& Config.in
可以看出menuconfig依赖于scripts/config/mconf和prepare-tmpinfo、FORCE
接下来的命令:
if[ ! -e .config -a -e $(HOME)/.openwrt/defconfig ]; then
&&&&&&&&&&&&& cp $(HOME)/.openwrt/defconfig.
表示如果.config文件存在且$(HOME)/.openwrt/defconfig文件存在,就cp $(HOME)/.openwrt/defconfig .config;
最后一句命令行:$& Config.in
$&表示所有依赖目标的第一个目标,这里即为scripts/config/mconf,故这里的命令行翻译过来即为:scripts/config/mconfConfig.in,通过在命令窗口执行该句命令,可以看到该命令的执行效果即为make menuconfig出来的配置窗口,如下图:
接下来来看一下另外一个依赖目标prepare-tmpinfo
该目标prepare-tmpinfo就在toplevel.mk中,如下:
prepare-tmpinfo:FORCE
&&&&&& mkdir -p tmp/info
&&&&&& $(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -finclude/scan.mk SCAN_TARGET=&packageinfo&SCAN_DIR=&package& SCAN_NAME=&package&SCAN_DEPS=&$(TOPDIR)/include/package*.mk $(TOPDIR)/overlay/*/*.mk&SCAN_DEPTH=5 SCAN_EXTRA=&&
&&&&&& $(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -finclude/scan.mk SCAN_TARGET=&targetinfo&SCAN_DIR=&target/linux& SCAN_NAME=&target&SCAN_DEPS=&profiles/*.mk $(TOPDIR)/include/kernel*.mk$(TOPDIR)/include/target.mk& SCAN_DEPTH=2 SCAN_EXTRA=&&SCAN_MAKEOPTS=&TARGET_BUILD=1&
&&&&&& for ty do
&&&&&&&&&&&&& f=tmp/.$${type} t=tmp/.config-$${type}.
&&&&&&&&&&&&& [ &$$t& -nt&$$f& ] "| ./scripts/metadata.pl $${type}_config &$$f& &&$$t& || { rm -f &$$t&; echo &Failed to build$$t&; };
&&&&&& done
&&&&&& ./scripts/metadata.pl package_mktmp/.packageinfo & tmp/.packagedeps || { rm -f tmp/. }
&&&&&& touch $(TOPDIR)/tmp/.build
首先看一下2个变量:$(_SINGLE)和$(NO_TRACE_MAKE),$(_SINGLE)定义在主Makefile中,在第一次进入到主Makefile中定义,如下:
& space:= $(empty) $(empty)
& _SINGLE=export MAKEFLAGS=$(space);
empty和space合起来定义出space变量的值为一个空格。
_SINGLE的作用就是export MAKEFLAGS,以便后面的Makefile引用;
$(NO_TRACE_MAKE)定义在include/verbose.mk文件中,定义如下:
ifeq($(NO_TRACE_MAKE),)
NO_TRACE_MAKE:= $(MAKE) V=s$(OPENWRT_VERBOSE)
exportNO_TRACE_MAKE
翻译过来就来是NO_TRACE_MAKE=makeV=s$(OPENWRT_VERBOSE)
再来看目标prepare-tmpinfo,有一个依赖目标FORCE,接下来是命令行
第一句话mkdir -p tmp/info,首先创建一个tm/info文件夹;
接下来的命令行翻译过来如下:
makeV=sX -j1 -r -s -f include/scan.mk SCAN_TARGET=&packageinfo&SCAN_DIR=&package& SCAN_NAME=&package&SCAN_DEPS=&$(TOPDIR)/include/package*.mk $(TOPDIR)/overlay/*/*.mk&SCAN_DEPTH=5 SCAN_EXTRA=&&
选项-j1为一次同时运行一个命令;
选项-r为禁止使用任何隐含规则;
选项-s为在命令运行时不输出命令的结果;
选项-f include/scan.mk为指定需要执行的makefile为include/scan.mk;
后面SCAN_TARGET、SCAN_DIR、SCAN_NAME、SCAN_DEPS、SCAN_DEPTH、SCAN_EXTRA为include/scan.mk的参数选项;
让我们来看一下include/scan.mk,它的最终生成目标为all: $(TMP_DIR)/.$(SCAN_TARGET),该目标定义如下:
$(TMP_DIR)/.$(SCAN_TARGET):$(TARGET_STAMP) $(SCAN_STAMP)
&&&&&& $(call progress,Collecting $(SCAN_NAME)info: merging...)
&&&&&& -cat $(FILELIST) | awk '{gsub(///,&_&, $$0);print &$(TMP_DIR)/info/.$(SCAN_TARGET)-& $$0}' |xargs cat & $@ 2&/dev/null
&&&&&& $(call progress,Collecting $(SCAN_NAME) info:done)
&&&&&& echo
可以看到目标$(TMP_DIR)/.$(SCAN_TARGET)有2个依赖目标:$(TARGET_STAMP)和$(SCAN_STAMP),好吧,让我们看一下这2个依赖目标的实现:
$(TARGET_STAMP):$(FILELIST)
&&&&&& +(
&&&&&&&&&&&&& MD5SUM=$$( (md5sum || md5) &$(FILELIST) 2&/dev/null | awk '{print $$1}');
&&&&&&&&&&&&& [ -f &$@.$$MD5SUM& ] ||{
&&&&&&&&&&&&&&&&&&&& rm -f $@.*;
&&&&&&&&&&&&&&&&&&&& touch $@.$$MD5SUM;
&&&&&&&&&&&&&&&&&&&& touch $@;
&&&&&&&&&&&&& }
依赖目标$(TARGET_STAMP),它有一个依赖目标$(FILELIST),来,看一下该目标实现,如下:
$(FILELIST):
&&&&&& rm -f$(TMP_DIR)/info/.files-$(SCAN_TARGET)-*
&&&&&& $(call FIND_L, $(SCAN_DIR)) $(SCAN_EXTRA)-mindepth 1 $(if $(SCAN_DEPTH),-maxdepth $(SCAN_DEPTH)) -name Makefile | xargsgrep -HE 'call (Build/DefaultTargets|Build(Package|Target)|.+Package)' | sed -e's#^$(SCAN_DIR)/##' -e 's#/Makefile:.*##' | uniq
该目标$(FILELIST)没有依赖目标,很好,直接执行命令行,用到了在toplevel.mk中的目标prepare-tmpinfo传进来的参数,SCAN_TARGET=&packageinfo& SCAN_DIR=&package&SCAN_NAME=&package& SCAN_DEPS=&$(TOPDIR)/include/package*.mk$(TOPDIR)/overlay/*/*.mk& SCAN_DEPTH=5 SCAN_EXTRA=&&,
第一句删除命令,即为
删除/tmp/info/.files-packageinfo-*的文件;
第二句了?有点长。
让我们来看一下FIND_L这个函数,最终在incude/host.mk中找到了该函数的定义,如下:
&&&&&&&& &&&&&& if $$FIND -L /tmp -maxdepth 0&/dev/null 2&/dev/ then
&&&&&&&&&&&&&&&&&&&& echo &FIND_L=$$FIND -L$$(1)& &&$@;
&&&&&&&&&&&&& else
&&&&&&&&&&&&&&&&&&&& echo &FIND_L=$$FIND$$(1) -follow& && $@;
&&&&&&&&&&&&&
而FIND也在该文件include/host.mk中定义,如下:
&&&&&&&&&&&&&&&&&& FIND=`whichgfind 2&/dev/null`;
&&&&&&&&&&&&& [ -n &$$FIND& -a -x&$$FIND& ] || FIND=`which find 2&/dev/null`;
&&&&&&&&&&&&& echo &FIND:=$$FIND&&& $@;
首先在系统中查找gfind命令,如果没有找到的话,则查找find命令,在通常的ubuntu系统中,可以看到应为find命令,即/usr/bin/find,然后将该命令定义追加输出到所有的目标文件中。
而FIND_L了?假设该次使用的是ubuntu系统,所以判断条件if $$FIND -L/tmp -maxdepth 0 &/dev/null 2&/dev/即为:
find –L /tmp –maxdepth 0 &dev/null2&dev/null
意思为,很懒的说,直接在窗口运行显示出结果,如下:
实际含义即为检测是否有./tmp这个文件夹并显示出指向该文件夹的符号链接。
所以FIND_L定义即为FIND_L=$$FIND -L $$(1)
然后来解析一下后面的if语句,即
$(if$(SCAN_DEPTH),-maxdepth $(SCAN_DEPTH))
Ok,即为如果定义了SCAN_PATH则添加选项-maxdepth$(SCAN_DEPTH),这里即为-maxdepth 5
后面接着来,后面就是管道了,好吧,一个一个来,先看第一个,
$(callFIND_L, $(SCAN_DIR)) $(SCAN_EXTRA) -mindepth 1 $(if $(SCAN_DEPTH),-maxdepth$(SCAN_DEPTH)) -name Makefile
即为find –L package –mindepth1 –maxdepth 5 –name Makefile,再次偷懒,运行结果如下:
即查找循环查找package目录以及子文件夹下面的Makefile,最深层次不超过5层。
看管道的第二个,
xargs grep -HE "call(Build/DefaultTargets|Build(Package|Target)|.+Package)'
又可以拆分,grep的-E选项则是使用正则表达式去匹配,-H选项则是在每个符合样式的文件名称前加上具体的文件名称,若有路径则会显示路径,好吧,让我们来看一下效果:
也就是在上一步找到的所有Makefile中查找内容包含有这样的语句的部分Makefile,这样的语句指:"call(Build/DefaultTargets|Build(Package|Target)|.+Package)'
要么包含callbuild/DefaultTargets,要么包含callbuild/BuildPackage,要么包含callbuild/BuildTarget,要么包含call .+Package,注意在正则表达式中,点.是最简单的元字符,可以匹配任何单个字符(不包含换行符)。
现在来看管道的最后一个命令,靠,还不是最后一个,是第三个,倒数第二个,如下:
sed -e 's#^$(SCAN_DIR)/##' -e's#/Makefile:.*##'
先替换变量过来为 sed –e ‘s#^package/##’–e ‘s#/Makefile:.*##’,
猜想一下,-e选项应该也是正则表达式吧,靠!错误,sed的-e选项为进行多项编辑,对输入行进行多项sed命令时使用。但是这里‘s#^package/##’后面的语句像是正则表达式,但是为什么没有用到sed使用正则表达式需要用到的符号,sed使用的正则表达式是包含在符号斜杠线/之间的呀,why?先执行一下吧。
选取一个结果,6in4,然后去查看对应的Makefile吧,即package/6in4/Makefile,靠!原来是sed的s选项,替换命令,用一个字符串替换另外一个字符串,紧跟在s命令后的字符就是查找串和替换串之间的分隔符,分隔符默认为正斜杠/,但可以改变,无论什么字符都可以(除了换行符、反斜线)。故第三个管道命令的解释为:将以package/开始的的字符串替换成#,然后将/Makefile.*替换成#。
对比一下执行了前2条命令的管道和执行了前3条命令的结果,截取其中一条,如下:
package/px5g/Makefile:$(eval $(callBuildPackage,px5g))
即留下package/与/Makefile中间的字符。
管道的最后一条命令uniq & $@,去除重复行,然后输出到所有的目标文件中。也就是$(FILELIST),这里FILELIST:=$(TMP_DIR)/info/.files-$(SCAN_TARGET)-$(SCAN_COOKIE),即/tmp/info/.files-packageinfo-$(SCAN_COOKIE),而SCAN_COOKIE定义在toplevel.mk中,如下:
SCAN_COOKIE?=$(shellecho $$$$)
exportSCAN_COOKIE
是神马意思?靠,是显示当前运行进程的ID号。
第二个依赖目标:$(SCAN_STAMP),很神奇的说,没找到其定义。
看下面的命令行语句吧:
&&&&&& +(
&&&&&&&&&&&&& MD5SUM=$$( (md5sum "| md5) &$(FILELIST) 2&/dev/null | awk '{print $$1}');
&&&&&&&&&&&&& [ -f &$@.$$MD5SUM& ] ||{
&&&&&&&&&&&&&&&&&&&& rm -f $@.*;
&&&&&&&&&&&&&&&&&&&& touch $@.$$MD5SUM;
&&&&&&&&&&&&&&&&&&&& touch $@;
&&&&&&&&&&&&& }
+表示不忽略可能的错误;看一下awk的用法吧。简而言之吧,awk就是一个比sed、grep更加强大的文本分析工具,用法是将文件逐行的读入,以空格为默认分隔符划分每行,再对每行的每一个部分进行处理,每一个部分以$1~Sn取值,$0是整行。
该命令行语句的意思就是对$(FILELIST)文件即/tmp/info/.files-packageinfo-$(SCAN_COOKIE)文件md5加密,然后将加密的结果密钥作为该文件的后缀;
看一下剩下的命令行语句吧,如下:
&&&&&& $(call progress,Collecting $(SCAN_NAME)info: merging...)
&&&&&& -cat $(FILELIST) | awk '{gsub(///,&_&, $$0);print &$(TMP_DIR)/info/.$(SCAN_TARGET)-& $$0}' |xargs cat & $@ 2&/dev/null
&&&&&& $(call progress,Collecting $(SCAN_NAME)info: done)
&&&&&& Echo
首先调用progress函数,progress函数定义在include/scan.mk中,如下:
ifeq($(IS_TTY),1)
& define progress
&&&&&& printf &