在查看比较复杂的代码时, 往往由于过多的宏定义以及相同的函数名弄的晕头转向的.
比较快速的查看代码的方法是
1. 先用自己板子的配置文件编译源码
2. 根据编译的.o文件和.depend文件 使用脚本生成一个文件列表
3. 使用source insight或者其他查看代码工具添加文件列表.
经以上步骤, 查看的源码就不会包含那些不被使用的头文件和c文件. 这样便能快速而方便的了解自身需要的代码.
本方法优点是:
1) 快速查看有用的代码不受干扰
2) 快速修改此编译配置下的代码 (更改配置可能会出问题)
不足之处就是:
1)你可能需要在源代码配置基础上使能一些新的配置, 这个方法就满足不了需求了.
2)对改代码来说可能会出现移植问题.
===============================脚本文件代码如下===========================================
-e main -s
!#
; 定义编译文件的后缀名
(define valid-exts '(".c" ".S" ".cpp" ".C" ".java" ".l" ".y"))
; 输出文件的名称
(define list-file-name "cscope.files")
; 头文件列表
(define list-head-name "head.list")
(define data-base-name "cscope.out")
; 搜索路径为当前路径
(define curr_dir (car (run/strings (pwd))))
(define (main prog+args)
(let ((file-list
(run/strings (find ,curr_dir -name "[^#*.%@]*.o"))))
(run (begin
(map (lambda (file)
(let ((f (prog-file-exists? file valid-exts)))
(if f
(format #t "~A~%" f))))
file-list))
(> ,list-file-name))
(get_head_file)
(if (file-exists? list-head-name)
(run (sort -m ,list-head-name)
(>> ,list-file-name)))
(run (rm -f ,list-head-name))
; (run (cscope -b -k "-i" ,list-file-name -f ,data-base-name))
))
; 给出编译过的.o文件, 查找相应的源文件
(define (prog-file-exists? file exts)
(define (transfer-file file ext)
(string-append
(file-name-sans-extension file) ext))
(if (not (null? exts))
(if (file-exists? (transfer-file file (car exts)))
(transfer-file file (car exts))
(prog-file-exists? file (cdr exts)))
#f))
; 根据编译目录下的 .depend 或者 *.o.cmd 文件找出编译时依赖的头文件
(define (get_head_file)
(let ((depends (run/strings (find ,curr_dir -name ".depend"))))
(if (not (null? depends))
(begin (format #t "~A~%" "get include file from .depend")
(map (lambda (f)
(output-head-from-depend f))
depends))
(begin (format #t "~A~%" "get include file from *.o.cmd")
(let ((cmds (run/strings (find ,curr_dir -name "*.o.cmd"))))
(map (lambda (f)
(output-head-from-cmd f))
cmds))))))
; 解析 .o.cmd 文件, 并获取存在的头文件, 其中 get_h_from_cmd 程序是由flex生成的程序,
; 详见http://blog.csdn.net/joans123/article/details/7515632
(define (output-head-from-cmd file)(let ((inc_files (run/strings (get_h_from_cmd) (< ,file))))
(run (begin
(map (lambda (f)
(let ((fpath (string-append curr_dir "/" f)))
(if (file-exists? fpath)
(format #t "~A~%" fpath))))
inc_files))
(>> ,list-head-name))))
; 解析 .depend 文件, 获取存在的头文件
(define (output-head-from-depend file)
(let ((strs (run/strings (cat ,file))))
(run
(begin
(map (lambda (str)
(map (lambda (f)
(if (and (file-exists? f)
(string-match curr_dir f))
(format #t "~A~%" f)))
((infix-splitter (make-regexp "[ \t\n\\]+")) str)))
strs))
(>> ,list-head-name))))