• 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.*"(.*)"@12@'        
    59.                                 -e 's@/*.*@@'                                                        
    60.                                 -e 's@^.*#include.*$@@'                                 
    61.                                 -e 's@^@ @' |                                                       
    62.                         sort |                                                                                
    63.                         uniq |                                                                               
    64.                         tr -d ' ' |                                                                
    65.                         tr -d ' '                                                                       
    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*CCs*/ /'                       
    79.                 -e 's/.o/.c/'                        |       
    80.         tr -d ' ' |                                        
    81.         tr -d ' '                                               
    82. )
    83. echo ${SOURCE_LIST}
    84. get_includes "${SOURCE_LIST}"
    85. FILE_LIST=$(echo "${FILE_LIST}" | sed -r -e 's/s/ /g' )
    86. echo "${FILE_LIST}" > ${FILE_OUT}
  • 相关阅读:
    【USACO10JAN】Cheese Towers S 奶酪塔 (背包dp)
    【SDOI2015】排序(dfs+结论)
    【NOI2014】购票(树形dp+树剖+斜率优化)
    【BZOJ3329】Xorequ(数位dp+矩阵快速幂)
    [NOI 2012] 骑行川藏
    BZOJ
    [学习笔记] 上下界网络流
    [八省联考 2018] 劈配
    P4313 文理分科
    [SDOI 2015] 序列统计
  • 原文地址:https://www.cnblogs.com/mouou/p/4599148.html
Copyright © 2020-2023  润新知