我如何 运行 cscope 只在任意位置搜索源代码并将交叉引用文件写入另一个任意位置?
How can I run cscope to search source code in an arbitrary location only and write the cross-reference files in another arbitrary location?
这是我的源代码目录的样子。
learner@centos:~/lab$ tree
.
+-- cscope.out
+-- src
¦ +-- bar
¦ ¦ +-- bar.c
¦ ¦ +-- baz
¦ ¦ +-- baz.c
¦ +-- foo.c
¦ +-- qux
¦ +-- qux.c
+-- work
我想为文件系统任意位置的源代码文件创建交叉引用(本例中为~/lab/src/bar
)并将交叉引用写入任意位置(~/lab/work/cscope.out
)在这种情况下。
除了 ~/lab/src/bar
之外,交叉引用中不应包含任何内容。
当然,下面的命令不起作用。它在交叉引用
中也包括 ~/lab/src/*.c
和 ~/lab/src/qux/*.c
learner@centos:~/lab$ cscope -b -R -f ~/lab/work/cscope.out
learner@centos:~/lab$ grep "@.*src" ~/lab/work/cscope.out
@src/bar/bar.c
@src/bar/baz/baz.c
@src/foo.c
@src/qux/qux.c
以下命令也遇到同样的问题,因为默认情况下会自动隐含搜索当前目录。
learner@centos:~/lab$ rm ~/lab/work/cscope.out
learner@centos:~/lab$ cscope -b -R -f ~/lab/work/cscope.out -s ~/lab/src/bar
learner@centos:~/lab$ grep "@.*src" ~/lab/work/cscope.out
@/home/learner/lab/src/bar/bar.c
@/home/learner/lab/src/bar/baz/baz.c
@src/bar/bar.c
@src/bar/baz/baz.c
@src/foo.c
@src/qux/qux.c
以下命令不起作用。
learner@centos:~/lab$ rm ~/lab/work/*
learner@centos:~/lab$ cscope -b -R -f ~/lab/work/cscope.out ~/lab/src/bar
Cannot open file /home/learner/lab/src/bar
使用 ctags,类似的命令可以正常工作。
learner@centos:~/lab$ ctags -R -f ~/lab/work/tags ~/lab/src/bar
learner@centos:~/lab$ grep src ~/lab/work/tags
bar /home/learner/lab/src/bar/bar.c /^void bar()$/;" f
baz /home/learner/lab/src/bar/baz/baz.c /^void baz()$/;" f
main /home/learner/lab/src/bar/bar.c /^int main()$/;" f
main /home/learner/lab/src/bar/baz/baz.c /^int main()$/;" f
如何使用 cscope 做同样的事情?
到目前为止,我发现的唯一解决方法是先切换到一个空目录,然后 运行 使用 -s ~/lab/src/bar
的 cscope 命令。这将搜索指定目录和当前目录,但由于当前目录是空的,因此交叉引用中只会包含指定目录中的文件。
learner@centos:~/lab$ rm ~/lab/work/*
learner@centos:~/lab$ cd ~/lab/work
learner@centos:~/lab/work$ cscope -b -R -f ~/lab/work/cscope.out -s ~/lab/src/bar
learner@centos:~/lab/work$ grep "@.*src" ~/lab/work/cscope.out
@/home/learner/lab/src/bar/bar.c
@/home/learner/lab/src/bar/baz/baz.c
是否有另一种不需要我将当前目录更改为空目录的解决方案?
注意:该解决方案应该适用于一般用例。
- 可能有数百个其他文件和目录不能包含在交叉引用中(如上例中的
foo.c
和 qux
)。
- 可能有
.h
、.l
、.y
等其他扩展名的文件需要交叉引用。
这里的诀窍是知道 cscope 也将接受源文件列表而不是自行搜索。所以传递文件列表就是要解决的问题
找到救援。
cscope -b -f <path_to_refdir>/cscope.out `find <path_of_desired_src_tree> -name *.[chly]`
你的情况
cscope -b -f work/cscope.out `find src/bar -name *.[chly]`
这是我的源代码目录的样子。
learner@centos:~/lab$ tree
.
+-- cscope.out
+-- src
¦ +-- bar
¦ ¦ +-- bar.c
¦ ¦ +-- baz
¦ ¦ +-- baz.c
¦ +-- foo.c
¦ +-- qux
¦ +-- qux.c
+-- work
我想为文件系统任意位置的源代码文件创建交叉引用(本例中为~/lab/src/bar
)并将交叉引用写入任意位置(~/lab/work/cscope.out
)在这种情况下。
除了 ~/lab/src/bar
之外,交叉引用中不应包含任何内容。
当然,下面的命令不起作用。它在交叉引用
中也包括~/lab/src/*.c
和 ~/lab/src/qux/*.c
learner@centos:~/lab$ cscope -b -R -f ~/lab/work/cscope.out
learner@centos:~/lab$ grep "@.*src" ~/lab/work/cscope.out
@src/bar/bar.c
@src/bar/baz/baz.c
@src/foo.c
@src/qux/qux.c
以下命令也遇到同样的问题,因为默认情况下会自动隐含搜索当前目录。
learner@centos:~/lab$ rm ~/lab/work/cscope.out
learner@centos:~/lab$ cscope -b -R -f ~/lab/work/cscope.out -s ~/lab/src/bar
learner@centos:~/lab$ grep "@.*src" ~/lab/work/cscope.out
@/home/learner/lab/src/bar/bar.c
@/home/learner/lab/src/bar/baz/baz.c
@src/bar/bar.c
@src/bar/baz/baz.c
@src/foo.c
@src/qux/qux.c
以下命令不起作用。
learner@centos:~/lab$ rm ~/lab/work/*
learner@centos:~/lab$ cscope -b -R -f ~/lab/work/cscope.out ~/lab/src/bar
Cannot open file /home/learner/lab/src/bar
使用 ctags,类似的命令可以正常工作。
learner@centos:~/lab$ ctags -R -f ~/lab/work/tags ~/lab/src/bar
learner@centos:~/lab$ grep src ~/lab/work/tags
bar /home/learner/lab/src/bar/bar.c /^void bar()$/;" f
baz /home/learner/lab/src/bar/baz/baz.c /^void baz()$/;" f
main /home/learner/lab/src/bar/bar.c /^int main()$/;" f
main /home/learner/lab/src/bar/baz/baz.c /^int main()$/;" f
如何使用 cscope 做同样的事情?
到目前为止,我发现的唯一解决方法是先切换到一个空目录,然后 运行 使用 -s ~/lab/src/bar
的 cscope 命令。这将搜索指定目录和当前目录,但由于当前目录是空的,因此交叉引用中只会包含指定目录中的文件。
learner@centos:~/lab$ rm ~/lab/work/*
learner@centos:~/lab$ cd ~/lab/work
learner@centos:~/lab/work$ cscope -b -R -f ~/lab/work/cscope.out -s ~/lab/src/bar
learner@centos:~/lab/work$ grep "@.*src" ~/lab/work/cscope.out
@/home/learner/lab/src/bar/bar.c
@/home/learner/lab/src/bar/baz/baz.c
是否有另一种不需要我将当前目录更改为空目录的解决方案?
注意:该解决方案应该适用于一般用例。
- 可能有数百个其他文件和目录不能包含在交叉引用中(如上例中的
foo.c
和qux
)。 - 可能有
.h
、.l
、.y
等其他扩展名的文件需要交叉引用。
这里的诀窍是知道 cscope 也将接受源文件列表而不是自行搜索。所以传递文件列表就是要解决的问题
找到救援。
cscope -b -f <path_to_refdir>/cscope.out `find <path_of_desired_src_tree> -name *.[chly]`
你的情况
cscope -b -f work/cscope.out `find src/bar -name *.[chly]`