使用scsh编写脚本收集编译的代码

来源:互联网 发布:java实用教程第三版pdf 编辑:程序博客网 时间:2024/06/04 17:53

    在查看比较复杂的代码时, 往往由于过多的宏定义以及相同的函数名弄的晕头转向的.

比较快速的查看代码的方法是

1. 先用自己板子的配置文件编译源码

2. 根据编译的.o文件和.depend文件 使用脚本生成一个文件列表

3. 使用source insight或者其他查看代码工具添加文件列表.

    经以上步骤, 查看的源码就不会包含那些不被使用的头文件和c文件.  这样便能快速而方便的了解自身需要的代码.

本方法优点是:

  1) 快速查看有用的代码不受干扰

  2) 快速修改此编译配置下的代码 (更改配置可能会出问题)

不足之处就是:

   1)你可能需要在源代码配置基础上使能一些新的配置,  这个方法就满足不了需求了.

   2)对改代码来说可能会出现移植问题. 


===============================脚本文件代码如下===========================================

#!/usr/bin/scsh \
-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))))
 

原创粉丝点击