SourceInsight 精確導入Linux kernel源碼的方法


相信有很多人用 SourceInsight 查看 Linux Kernel 源碼,但導入源碼時會遇到一些問題。
1、如果把整個源碼樹都導入進去,查看符號定義的時候,會發現有大量重復定義,很難找到正確的位置
2、如果手動導入只和該硬件平台相關的源碼,工作量太大
本帖提供了一個方法,可用腳本生成只和該硬件平台相關的源碼的文件列表,然后通過該文件列表,將相應文件導入 SourceInsight 。
以下是步驟,共4步:
1、新建 SourceInsight 項目
     先不要導入文件,停在如下界面:
     

2、完整編譯內核,將編譯時輸出的信息保存到一個文件中
    例如:
   

  1. make ARCH=arm > build_log.txt


    build_log.txt 文件中內容大致如下:
   

  1. CC      init/main.o
  2.   CHK     include/generated/compile.h
  3.   CC      init/do_mounts.o
  4.   HOSTCC  usr/gen_init_cpio
  5.   CC      arch/arm/vfp/vfpmodule.o
  6.   CC      arch/arm/kernel/elf.o
  7.   AS      arch/arm/kernel/entry-armv.o
  8.   AS      arch/arm/vfp/entry.o
  9.   AS      arch/arm/kernel/entry-common.o
  10.   CC      arch/arm/kernel/irq.o
  11.   AS      arch/arm/vfp/vfphw.o
  12.   GEN     usr/initramfs_data.cpio
  13.   CC      arch/arm/kernel/opcodes.o



3、生成文件列表
     下載 帖子 最后面的附件,解壓后是 linux shell 腳本。
    編輯腳本兩個變量,ARCH 和 MACH,MACH是平台的名字。如果你用的平台對應 arch/arm/mach-at91 的話,就改成 MACH=at91,以此類推。
           
    在內核源碼目錄下執行:
   

  1. ./sg.sh build_log.txt file_list.txt
復制代碼


    這樣,SourceInsight 需要的 文件列表 file_list.txt 就生成了。里面的內容大致如下:
       

4、導入文件列表
     回到 SourceInsight,點擊窗口右下角 help 按鈕上方的 “add from list” 按鈕導入生成的 file_list.txt 文件。
       
     到此為止,文件導入完成了。重新打開工程,會提示同步、構建,之后就可以正常的查看源碼了。

這樣導入的文件和硬件平台是完全對應的。
下面是本帖的核心,就是這個腳本,有興趣的可以看看:
   

  1. #!/bin/sh
  2. ARCH=arm
  3. MACH=at91
  4. FILE_IN=$1
  5. FILE_OUT=$2
  6. # .c
  7. SOURCE_LIST=""
  8. # generated file list
  9. FILE_LIST=""
  10. # nest depth for function get_includes()
  11. NEST_DTPTH=0
  12. # recursive function, used to get included files from files.
  13. # result is stored in FILE_LIST
  14. # $1 : file list, e.g. "fs/ext4/file.c fs/ext4/fsync.c"
  15. get_includes()
  16. {
  17.         local includes
  18.         local file
  19.         for file in $1
  20.         do
  21.                 if [ ! -e ${file} ]; then
  22.                         continue
  23.                 fi
  24.                 if echo "${FILE_LIST}" | grep -E ${file} > /dev/null; then
  25.                         continue
  26.                 fi
  27.                 FILE_LIST="${FILE_LIST} ${file}"
  28.                 NEST_DTPTH=$((NEST_DTPTH+1))
  29.                 echo "<${NEST_DTPTH} : ${file}"
  30.                 includes=$(                                                                                \
  31.                         grep -E -H '^#include' ${file} |                                \
  32.                         sed -r \
  33.                                 -e 's@^.*<(acpi/.*)>@include/\1@'                 \
  34.                                 -e 's@^.*<(asm-generic/.*)>@include/\1@'\
  35.                                 -e 's@^.*<(config/.*)>@include/\1@'         \
  36.                                 -e 's@^.*<(crypto/.*)>@include/\1@'         \
  37.                                 -e 's@^.*<(drm/.*)>@include/\1@'                 \
  38.                                 -e 's@^.*<(generated/.*)>@include/\1@'         \
  39.                                 -e 's@^.*<(keys/.*)>@include/\1@'                 \
  40.                                 -e 's@^.*<(linux/.*)>@include/\1@'                 \
  41.                                 -e 's@^.*<(math-emu/.*)>@include/\1@'         \
  42.                                 -e 's@^.*<(media/.*)>@include/\1@'                 \
  43.                                 -e 's@^.*<(misc/.*)>@include/\1@'                 \
  44.                                 -e 's@^.*<(mtd/.*)>@include/\1@'                 \
  45.                                 -e 's@^.*<(net/.*)>@include/\1@'                 \
  46.                                 -e 's@^.*<(pcmcia/.*)>@include/\1@'         \
  47.                                 -e 's@^.*<(rdma/.*)>@include/\1@'                 \
  48.                                 -e 's@^.*<(rxrpc/.*)>@include/\1@'                 \
  49.                                 -e 's@^.*<(scsi/.*)>@include/\1@'                 \
  50.                                 -e 's@^.*<(sound/.*)>@include/\1@'                 \
  51.                                 -e 's@^.*<(target/.*)>@include/\1@'         \
  52.                                 -e 's@^.*<(trace/.*)>@include/\1@'                 \
  53.                                 -e 's@^.*<(uapi/.*)>@include/\1@'                 \
  54.                                 -e 's@^.*<(video/.*)>@include/\1@'                 \
  55.                                 -e 's@^.*<(xen/.*)>@include/\1@'                 \
  56.                                 -e "s@^.*<(asm/.*)>@arch/${ARCH}/include/\1 arch/${ARCH}/include/generated/\1@"        \
  57.                                 -e "s@^.*<(mach/.*)>@arch/${ARCH}/mach-${MACH}/include/\1@"        \
  58.                                 -e 's@(^.*/)[^/]+\.c.*\"(.*)\"@\1\2@'         \
  59.                                 -e 's@/\*.*@@'                                                         \
  60.                                 -e 's@^.*\#include.*$@@'                                  \
  61.                                 -e 's@^@ @' |                                                        \
  62.                         sort |                                                                                 \
  63.                         uniq |                                                                                \
  64.                         tr -d '\n' |                                                                 \
  65.                         tr -d '\r'                                                                        \
  66.                 )
  67.                 if [ -n "${includes}" ]; then
  68.                         get_includes "${includes}"
  69.                 fi
  70.                 echo ">${NEST_DTPTH}) : ${file}"
  71.                 NEST_DTPTH=$((NEST_DTPTH-1))
  72.         done
  73. }
  74. # get *.c from kernel build log
  75. SOURCE_LIST=$(                                                \
  76.         grep -E '^\s*CC' ${FILE_IN} |        \
  77.         sed -r                                                         \
  78.                 -e 's/^\s*CC\s*/ /'                        \
  79.                 -e 's/\.o/\.c/'                        |        \
  80.         tr -d '\n' |                                         \
  81.         tr -d '\r'                                                \
  82. )
  83. echo ${SOURCE_LIST}
  84. get_includes "${SOURCE_LIST}"
  85. FILE_LIST=$(echo "${FILE_LIST}" | sed -r -e 's/\s/\r\n/g' )
  86. echo "${FILE_LIST}" > ${FILE_OUT}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM