would you pleasee make s______...

高中英语题目,小试牛刀,为什么?谢谢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 &33[Mr$(1)&&&2;
& define progress
仅仅是一个输出语句,重定向到&2,标准错误输出。
第二句,分割吧,首先-cat $(FILELIST),输出文件内容;然后awk '{gsub(///, &_&, $$0);print&$(TMP_DIR)/info/.$(SCAN_TARGET)-& $$0}',又来了,gsub函数,靠,gsub函数是是字符串中所有符合正则表达式的字符都被替换,返回替换的次数。那么该语句执行的结果了,如下:
可以看到其含义是先将$(FILELIST)文件中的每行字符串中的/替换串_,如(network/ipv6/ds-lite替换成network_ipv6_ds-lite),然后在前面加上$(TMP_DIR)/info/.$(SCAN_TARGET)-前缀,之后将这些文件的内容输出到$(TMP_DIR)/.$(SCAN_TARGET)即tmp/.packageinfo
该命令行的最后一句xargs cat &$@ 2&/dev/null,输出内容到所有的目标,错误不输出。目标即$(TMP_DIR)/.$(SCAN_TARGET)
既然这里感觉没啥意义了,再看一下在include/scan.mk中的/tmp/info/.files-packageinfo-$(SCAN_COOKIE)另外一个定义吧,即定义在函数PackageDir中,
definePackageDir
& $(TMP_DIR)/.$(SCAN_TARGET):$(TMP_DIR)/info/.$(SCAN_TARGET)-$(1)
& $(TMP_DIR)/info/.$(SCAN_TARGET)-$(1):$(SCAN_DIR)/$(2)/Makefile $(SCAN_STAMP) $(foreachDEP,$(DEPS_$(SCAN_DIR)/$(1)/Makefile) $(SCAN_DEPS),$(wildcard $(if $(filter/%,$(DEP)),$(DEP),$(SCAN_DIR)/$(1)/$(DEP))))
&&&&&&&&&&&&& $$(call progress,Collecting$(SCAN_NAME) info: $(SCAN_DIR)/$(2))
&&&&&&&&&&&&& echo Source-Makefile:$(SCAN_DIR)/$(2)/M
&&&&&&&&&&&&& $(NO_TRACE_MAKE) --no-print-dir -rDUMP=1 -C $(SCAN_DIR)/$(2) $(SCAN_MAKEOPTS) 2&/dev/null "| {
&&&&&&&&&&&&&&&&&&&& mkdir -p&$(TOPDIR)/logs/$(SCAN_DIR)/$(2)&;
&&&&&&&&&&&&&&&&&&&& $(NO_TRACE_MAKE)--no-print-dir -r DUMP=1 -C $(SCAN_DIR)/$(2) $(SCAN_MAKEOPTS) &$(TOPDIR)/logs/$(SCAN_DIR)/$(2)/dump.txt 2&&1;
&&&&&&&&&&&&&&&&&&&& $$(call progress,ERROR:please fix $(SCAN_DIR)/$(2)/Makefile - see logs/$(SCAN_DIR)/$(2)/dump.txt fordetailsn)
&&&&&&&&&&&&&&&&&&&& rm -f $$@;
&&&&&&&&&&&&& };
&&&&&&&&&&&&&
&&&&&& } & $$@ || true
假如使用的该定义,
感觉有意义的一句就是$(NO_TRACE_MAKE)--no-print-dir -r DUMP=1 -C $(SCAN_DIR)/$(2) $(SCAN_MAKEOPTS) 2&/dev/null
即make V=sXX –no-print-dir–r DUMP=1 –c package/$(2) TRAGT_BUILD=1 2&dev/null,后面的||语句就是将错误日志记录在$(TOPDIR)/logs/$(SCAN_DIR)/$(2)/dump.txt中
回过头来再研究一下依赖目标中的foreach语句,如下:
$(foreachDEP,$(DEPS_$(SCAN_DIR)/$(1)/Makefile) $(SCAN_DEPS),$(wildcard $(if $(filter/%,$(DEP)),$(DEP),$(SCAN_DIR)/$(1)/$(DEP))))
先翻译一下变量:
$(foreachDEP,$(DEPS_package/$(1)/Makefile) $(TOPDIR)/include/package*.mk$(TOPDIR)/overlay/*/*.mk,$(wildcard $(if $(filter/%,$(DEP)),$(DEP),$(SCAN_DIR)/$(1)/$(DEP))))
$(if$(filter /%,$(DEP)),$(DEP),$(SCAN_DIR)/$(1)/$(DEP)),首先判断$(DEP)中是否有符合/%模式的字符串,如果有则$(DEP),否则返回$(SCAN_DIR)/$(1)/$(DEP)
$(wildcard$(if $(filter /%,$(DEP)),$(DEP),$(SCAN_DIR)/$(1)/$(DEP)))就不说了,符合最终符合if返回的值格式的语句
这里有一个疑问:$(DEPS_$(SCAN_DIR)/$(1)/Makefile)这个是神马变量?
靠,离开始的目标有点远了。
回归到目标prepare-tmpinfo,在toplevel.mk中:
还是一条$(_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&
语句,执行include/scan.mk。
&&&&&& 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
一个for循环,
一行一行解释,for t do ,是令type分别为package和target;
f=tmp/.$${type}t=tmp/.config-$${type}. ,即f、t分别为/、/tmp/.config-package.in和、tmp/.config-target.in
[&$$t& -nt &$$f& ] || ./scripts/metadata.pl $${type}_config&$$f& & &$$t& || { rm -f &$$t&; echo &Failedto build $$t&; };
没的说,拆分吧;
[&$$t& -nt &$$f& ]判断t代表的文件是否比f代表的文件新,新返回真
./scripts/metadata.pl$${type}_config &$$f& & &$$t& 看一下metadata.pl脚本做神马吧,简单看了一下,原来就是格式化输出文件内容。
./scripts/metadata.plpackage_config tmp/.packageinfo & tmp/.config-package.in
./scripts/metadata.pltarget_config tmp/.targetinfo & tmp/.config-target.in
{rm -f &$$t&; echo &Failed to build $$t&; };删除t文件
for循环完。
./scripts/metadata.plpackage_mk tmp/.packageinfo & tmp/.packagedeps || { rm -f tmp/. }
最后一句依然是执行metadata.pl脚本,然后删除tmp/.packagedeps
回顾一下,metadata.pl脚本的第二个参数tmp/.packageinfo和tmp/.targetinfo是前面的include/scan.mk的最终生成产物。但是tmp/.packageinfo和tmp/.targetinfo又是依赖于tmp/info/目录下的.package-*和.target-*文件生成,那tmp/info/目录下的这2类文件是在什么时候生成的了?
最后看了一下,发现也是在执行include/scan.mk的时候生成的。好吧,最后发现原来是在include/scan.mk中这条语句:
$(TMP_DIR)/info/.files-$(SCAN_TARGET).mk
看一下这条语句指向的目标吧,如下:
$(TMP_DIR)/info/.files-$(SCAN_TARGET).mk:$(FILELIST)
&&&&&&&&&&&&& cat $& | awk '{print &$(SCAN_DIR)/&$$0 &/Makefile& }' | xargs grep -HE '^ *SCAN_DEPS *= *' | awk -F: '{gsub(/^.*DEPS *= */, &&, $$2); print &DEPS_& $$1&=& $$2 }';
&&&&&&&&&&&&& awk -v deps=&$$DEPS& '{
&&&&&&&&&&&&&&&&&&&& info=$$0;
&&&&&&&&&&&&&&&&&&&& gsub(///, &_&,info);
&&&&&&&&&&&&&&&&&&&& print &$$(eval $$(callPackageDir,& info &,& $$0 &))&;
&&&&&&&&&&&&& } ' & $&;
&&&&&&&&&&&&&
&&&&&& ) & $@
发现最终调用的是函数PackageDir函数,好吧,前面我错过了,再看一下,如下:
definePackageDir
& $(TMP_DIR)/.$(SCAN_TARGET):$(TMP_DIR)/info/.$(SCAN_TARGET)-$(1)
& $(TMP_DIR)/info/.$(SCAN_TARGET)-$(1):$(SCAN_DIR)/$(2)/Makefile $(SCAN_STAMP) $(foreachDEP,$(DEPS_$(SCAN_DIR)/$(1)/Makefile) $(SCAN_DEPS),$(wildcard $(if $(filter/%,$(DEP)),$(DEP),$(SCAN_DIR)/$(1)/$(DEP))))
&&&&&&&&&&&&& $$(call progress,Collecting$(SCAN_NAME) info: $(SCAN_DIR)/$(2))
&&&&&&&&&&&&& echo Source-Makefile:$(SCAN_DIR)/$(2)/M
&&&&&&&&&&&&& $(NO_TRACE_MAKE) --no-print-dir -rDUMP=1 -C $(SCAN_DIR)/$(2) $(SCAN_MAKEOPTS) 2&/dev/null || {
&&&&&&&&&&&&&&&&&&&& mkdir -p&$(TOPDIR)/logs/$(SCAN_DIR)/$(2)&;
&&&&&&&&&&&&&&&&&&&& $(NO_TRACE_MAKE)--no-print-dir -r DUMP=1 -C $(SCAN_DIR)/$(2) $(SCAN_MAKEOPTS) &$(TOPDIR)/logs/$(SCAN_DIR)/$(2)/dump.txt 2&&1;
&&&&&&&&&&&&&&&&&&&& $$(call progress,ERROR:please fix $(SCAN_DIR)/$(2)/Makefile - see logs/$(SCAN_DIR)/$(2)/dump.txt fordetailsn)
&&&&&&&&&&&&&&&&&&&& rm -f $$@;
&&&&&&&&&&&&& };
&&&&&&&&&&&&&
&&&&&& } & $$@ || true
找到关键点,& $$@,有一个输出语句,输出内容到所有的目标文件,即$(TMP_DIR)/info/.$(SCAN_TARGET)-$(1);
可以发现在生成的$(TMP_DIR)/info/.$(SCAN_TARGET)-$(1)中的/tmp/info/.packageinfo-*文件中的Depends条目会自动加上+libc+USE_EGLIBC:librt +USE_EGLIBC:libpthread,后面紧跟对应的+kmod-*或者@Target_*
但是又来了一个疑问,如何由tmp/.config-package.in和tmp/.config-target-package.in生成config.in文件?
另外,看到这里的时候,我还有一个问题,目标FORCE还是变量FORCE,管他是神马,但是都没有找到定义。只是在include/toplevel.mk中找到这样一句:
ifeq($(FORCE),)
& .config scripts/config/confscripts/config/mconf: tmp/.prereq-build
这几行语句的意思是,如果FORCE没有定义,则以下目标.config scripts/config/conf scripts/config/mconf都依赖于tmp/.prereq-build这个目标,即在执行前面几个目标之前,必须前执行tmp/.prereq-build这个依赖目标。
而这个依赖目标的实现如下:
tmp/.prereq-build:include/prereq-build.mk
&&&&&& mkdir -p tmp
&&&&&& rm -f tmp/.host.mk
&&&&&& @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f$(TOPDIR)/include/prereq-build.mk prereq 2&/dev/null || {
&&&&&&&&&&&&& echo &Prerequisite checkfailed. Use FORCE=1 to override.&;
&&&&&&&&&&&&&
&&&&&& touch $@
实际上就是执行include/prereq-build.mk文件,该文件的作用是检查编译环境。
最后总算是在rules.mk中找到这样一句定义,如下:
.PHONY:FORCE
依赖目标为;是什么意思?
执行make menuconfig,不输出执行结果,只打印执行的命令序列,如下:
smart@smart-virtual-machine:~/workspace/tpsdk/trunk$make menuconfig --debug -w --just-print
GNUMake 3.81
Copyright(C) 2006& Free Software Foundation, Inc.
T see the source for copying conditions.
Thereis NO not even for MERCHANTABILITY or FITNESS FOR A
PARTICULARPURPOSE.
Thisprogram built for i686-pc-linux-gnu
Readingmakefiles...
Updatinggoal targets....
&File `menuconfig' does not exist.
&&& Target `scripts/config/mconf_check' isdouble-colon and has no prerequisites.
&&& Must remake target`scripts/config/mconf_check'.
make:Entering directory `/home/smart/workspace/tpsdk/trunk'
{[ -f &scripts/config/mconf_check.1& ] && mv&scripts/config/mconf_check.1&;/home/smart/workspace/tpsdk/trunk/scripts/timestamp.pl -x &*/.svn*&-x &.*& -x &*:*& -x &*!*& -x &* *& -x&*#*& -x &*/.*_check& -x &*/.*.swp&& -n scripts/config/mconf scripts/config&&
{& touch -r&scripts/config/mconf& &scripts/config/mconf_check&; } } ||{& touch&scripts/config/mconf_check&; }
&&& Successfully remade target file`scripts/config/mconf_check'.
&& Prerequisite `scripts/config/mconf_check' isnewer than target `scripts/config/mconf'.
& Must remake target `scripts/config/mconf'.
exportMAKEFLAGS= ;umask 022; cmd() { &/dev/null 2&&1 make -s $* & /dev/null|| { echo &make $*: build failed. Please re-run make with V=s to seewhat's going on&; } } 8&&1 9&&2; cmd -s -Cscripts/config all CC=&gcc&
& Successfully remade target file`scripts/config/mconf'.
&& File `prepare-tmpinfo' does not exist.
&& &&File`FORCE' does not exist.
&&& Must remake target `FORCE'.
&&& Successfully remade target file `FORCE'.
& Must remake target `prepare-tmpinfo'.
mkdir-p tmp/info
exportMAKEFLAGS= ;make V=s -j1 -r -s -f include/scan.mkSCAN_TARGET=&packageinfo& SCAN_DIR=&package&SCAN_NAME=&package&SCAN_DEPS=&/home/smart/workspace/tpsdk/trunk/include/package*.mk/home/smart/workspace/tpsdk/trunk/overlay/*/*.mk& SCAN_DEPTH=5SCAN_EXTRA=&&
exportMAKEFLAGS= ;make V=s -j1 -r -s -f include/scan.mkSCAN_TARGET=&targetinfo& SCAN_DIR=&target/linux&SCAN_NAME=&target& SCAN_DEPS=&profiles/*.mk/home/smart/workspace/tpsdk/trunk/include/kernel*.mk/home/smart/workspace/tpsdk/trunk/include/target.mk& SCAN_DEPTH=2SCAN_EXTRA=&&
SCAN_MAKEOPTS=&TARGET_BUILD=1&
&&&&&&&&&&&&&&& 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.plpackage_mk tmp/.packageinfo & tmp/.packagedeps || { rm -f tmp/. }
touch/home/smart/workspace/tpsdk/trunk/tmp/.build
& Successfully remade target file`prepare-tmpinfo'.
Mustremake target `menuconfig'.
if[ ! -e .config -a -e /home/smart/.openwrt/defconfig ]; then
&&&&&&&&&&&&&&& cp/home/smart/.openwrt/defconfig .
&&&&&&& fi
scripts/config/mconfConfig.in
Successfullyremade target file `menuconfig'.
make:Leaving directory `/home/smart/workspace/tpsdk/trunk'
include/host.mk
定义了两个关键的命令TAR FIND
感谢关注 Ithao123精品文库频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
Swift是Apple在WWDC2014所发布的一门编程语言,用来撰写OS X和iOS应用程序[1]。在设计Swift时.就有意和Objective-C共存,Objective-C是Apple操作系统在导入Swift前使用的编程语言
Swift是供iOS和OS X应用编程的新编程语言,基于C和Objective-C,而却没有C的一些兼容约束。Swift采用了安全的编程模式和添加现代的功能来使得编程更加简单、灵活和有趣。界面则基于广受人民群众爱戴的Cocoa和Cocoa Touch框架,展示了软件开发的新方向。
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。
IThao123周刊}

我要回帖

更多关于 would you please 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信