By: fu linux
E-mail: fulinux@sina.com
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!
返回总目录 : Yocto开发讲解系列 - 总目录
前言
**考虑到现在有怎么个情形:**我知道某个项目和我现有的项目很接近,我想参考下它是怎么在yocto中实现的,包括bb文件和源码等,我需要快速搜索文件和查找关键词。
当然我们可以使用
find
和
grep
等命令来搜索和查找,但是我们的poky目录下有很多的bb、append、class和inc等文件,build目录下又有很多的源码和输出文件,如果每次都用find和grep来实现的话,那么无疑是一场
噩梦
。yocto项目实在是太大了,要查找和搜索某个文件或者关键词无疑要
花费太多太多的时间
,长时间等待是一件极其痛苦的事情。
今天我就结合自身的经验,给大家整理一个
快速
搜索
文件
和查找
关键词
的方法
生成我们的文件数据库
首先,使用
updatedb
命令生成文件数据库,默认使用
updatedb
的时候会更新根目录下(会过滤etc/updatedb.conf配置)的内容,通过下面的方法对一个
android
、
yocto
代码库生成一个
myupdatedb
数据块,下面的过程可能花费较长的时间,建议在空闲时间执行。
poky]$ sudo updatedb -U . -o myupdatedb
[sudo] password for peeta:
poky]$ ls -l myupdatedb #最后在poky目录下生成这个文件
-rw-r----- 1 root mlocate 770068153 5月 22 16:13 myupdatedb
- 1
- 2
- 3
- 4
搜索文件演示
首先,我们假设想搜索linux-yocto_5.8.bb文件,可以通过如下方法搜索:
poky]$ locate -d myupdatedb linux-yocto_5.8.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.8.bb
/home/peeta/poky/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_5.8.bbappend
- 1
- 2
- 3
进一步优化,如果每次都需要输入那么长的命令行确实有点难受,我们可以起个别名,比如:
poky]$ vim ~/.bashrc
...
alias mylocate='locate -d /home/peeta/poky/myupdatedb' #添加这一行
...
poky]$ source ~/.bashrc
- 1
- 2
- 3
- 4
- 5
以后查找文件时就可以这样了:
poky]$ mylocate linux-yocto_5.8.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.8.bb
/home/peeta/poky/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_5.8.bbappend
- 1
- 2
- 3
而且可以再任意位置调用mylocate命令(最好我们将myupdatedb文件进行一个备份哦,免得误删除)
话说,如果要搜索多种类型的文件呢?参考:
poky]$ mylocate *.bb *.bbappend *.inc *.conf *.bbclass
...
/home/peeta/poky/meta-skeleton/recipes-kernel/linux/linux-yocto-custom.bb
/home/peeta/poky/meta-skeleton/recipes-multilib/images/core-image-multilib-example.bb
/home/peeta/poky/meta-skeleton/recipes-skeleton/service/service_0.1.bb
/home/peeta/poky/meta-skeleton/recipes-skeleton/useradd/useradd-example.bb
/home/peeta/poky/meta-yocto-bsp/conf/layer.conf
/home/peeta/poky/meta-yocto-bsp/conf/machine/beaglebone-yocto.conf
/home/peeta/poky/meta-yocto-bsp/conf/machine/edgerouter.conf
/home/peeta/poky/meta-yocto-bsp/conf/machine/genericx86-64.conf
...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
现在假设如果我们要查询的文件在build目录中也存在,会有很多很多,比如:
poky]$ mylocate linux-yocto
/home/peeta/poky/documentation/profile-manual/figures/pybootchartgui-linux-yocto.png
/home/peeta/poky/documentation/profile-manual/figures/pychart-linux-yocto-rpm-nostrip.png
/home/peeta/poky/documentation/profile-manual/figures/pychart-linux-yocto-rpm.png
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-dev.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.4.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.8.bb
...
/home/peeta/poky/build/tmp/deploy/licenses/linux-yocto
/home/peeta/poky/build/tmp/deploy/licenses/linux-yocto/COPYING
...
/home/peeta/poky/build/tmp/sysroots-components/qemux86_64/linux-yocto
...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
实在是太多了,那如果我们只希望关注
poky/build
目录之外的文件或目录该如何处理呢,可以使用
grep -v
反向匹配过滤
poky/build
,看结果:
poky]$ mylocate linux-yocto | grep -v "poky/build"
/home/peeta/poky/documentation/profile-manual/figures/pybootchartgui-linux-yocto.png
/home/peeta/poky/documentation/profile-manual/figures/pychart-linux-yocto-rpm-nostrip.png
/home/peeta/poky/documentation/profile-manual/figures/pychart-linux-yocto-rpm.png
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-dev.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.4.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.8.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-tiny_5.4.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-tiny_5.8.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto.inc
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.4.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.8.bb
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
查找文件中的关键词
现在,又有一种应用情形:我想了解
bb
或
bbappend
文件中
KERNEL_EXTRA_FEATURES
变量的使用样例。
OK,先看一种使用情况:
poky]$ mylocate *.bb *.bbappend *.inc *.conf *.bbclass | grep -v "poky/build" | xargs grep -in KERNEL_EXTRA_FEATURES
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-dev.bb:47:KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc features/taskstats/taskstats.scc"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-dev.bb:48:KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.4.bb:39:KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc features/taskstats/taskstats.scc"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.4.bb:40:KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.8.bb:39:KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc features/taskstats/taskstats.scc"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.8.bb:40:KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.4.bb:48:KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.4.bb:49:KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.8.bb:49:KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.8.bb:50:KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
上面列举了文件路径,关键词出现的行号等信息。
输出某些文件内容到一个文件中
在上面的演示中我们看到了通过查找某个关键词时可以使用mylocate和grep命令组合的形式来查找。但是我的开发经验过程中,仍旧发现该方法比较笨,而且也有点费时,那么我们该如何进一步提升效率呢?
我们可以将某一类比如bb文件相关的内容直接重定向到一个文件中,以后想看某个关键词时,轻松搜索即可。
下面我演示将poky目录除了build目录之外的所有
bb
、
bbappend
、
bbclass
、
inc
和
conf
文件路径和内容都重定向到一个单一的文件中的做法,参考:
poky]$ for c in `mylocate *.bb *.bbappend *.inc *.conf *.bbclass | grep -v "poky/build"`;do echo $c >> allbbandinc;cat $c >> allbbandinc;done
- 1
然后我们打开这个allbbandinc文件看下:
poky]$ vim allbbandinc
1 /home/peeta/poky/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass
2 SLOWTASKS ??= ""
3 SSTATEVALID ??= ""
4
5 def stamptask(d):
6 import time
7
8 thistask = d.expand("${PN}:${BB_CURRENTTASK}")
9 stampname = d.expand("${TOPDIR}/%s.run" % thistask)
10 with open(stampname, "a+") as f:
11 f.write(d.getVar("BB_UNIHASH") + "\n")
...
Line: 1/117466:1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
虽然该文件有117466多行,但是打开的速度也是秒开,而且搜索匹配的效率杠杠的,而且还带有对应文件的目录位置信息。当然这个
allbbandinc
文件也可放到
window
或者其他目录里面,以免丢失。然后再文本软件中查找或者使用linux的
vim
中的
/
斜杠命令也可以查找。比如查找上面的KERNEL_EXTRA_FEATURES变量:
是不是就很方便呢!
To be continue~
希望帮我点个赞加关注,你的喜欢就是我持续更新的动力!