文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何精准的收集所有 MDK 源代码文件?一个脚本搞定

2024-12-03 02:05

关注

有些工程,可能包含了一大堆文件(比如 rt-thread 工程),你可能并不需要它们,但是却一直保留在你的工程目录中,想删掉又怕删错,一个个整理又太麻烦。

还有就是,当你使用 SI(source insight) 看源代码时,因为你不知道哪些文件才是你当前文件需要的,所以只能一股脑把所有的源文件添加到工程里面了。

然后你会发现,一个 main 函数有多处定义了,你都不知道哪个文件的 main 函数才是正主(在看 linux 源代码时亦是如此,根本不知道哪些文件被编译进内核了)。并且 SI 同步时间也大大延长了,本来几秒钟就能完成同步的,可能就需要十几秒,几十秒。

有没有好的方法把 MDK 工程里面包含的文件提取出来呢?

当然有。

最近鱼鹰写了一个脚本,专门干这事,通过在 git bash 中执行这个脚本,就可以完成提取工作(包括汇编文件、C 文件、包含的头文件)。

汇编文件和C 文件我们可以通过打开 *.uvopt 文件找到对应的文件路径。

但是头文件咋办?

我们知道 MDK 工程可以编译可以通过,那么 MDK 肯定知道头文件在哪找,所以我们需要想办法找到这些信息。

然后我们可以在 Objects 文件夹里面的 *.d 文件中找到对应的头文件路径(每一个源文件都有一个对应的 *.d 文件存在,比如上面的 main.c 对应的文件就是 main.d)。

使用记事本打开 main.d 文件:

我们可以看到 main.d 文件的第一项就是 C 文件,后面的就是头文件路径了,因为目前这个文件只包含了一个头文件 S3C2440.h ,所以这个 main.d 文件里面只有一个头文件信息。

所以我们的脚本要做的事情很简单,就是把所有源文件的 *.d 文件信息收集起来,然后进行适当的处理就可以了。

脚本如下:

  1. #!/bin/bash 
  2. # Author: Osprey 
  3. # 本脚本用于生成 MDK 包含的源文件信息  
  4. # 必须使用 MDK 编译后,在工程文件目录下执行本脚本 
  5.                
  6. dir_obj=./obj           # *.d 文件所在目录  
  7. out_file_name=absolute_files.txt     # 输出文件名(绝对路径) 
  8. relative_out_file_name=relative_files.txt     # 输出文件名(相对路径) 
  9. ###当前路径处理 
  10.  
  11. # 斜杠替换为反斜杠  \ 也是特殊字符,需要转义   操作 `` 有问题 
  12. curr_dir=`pwd`/ 
  13. echo ${curr_dir} | sed 's/\//\\/g' > ${out_file_name} && curr_dir=`cat ${out_file_name}`  
  14. curr_dir=${curr_dir#*\\}  # 去除第一个斜杠 
  15. # 第一个反斜杠替换    :\  
  16. echo ${curr_dir} | sed 's/\\/:\\/' > ${out_file_name} && curr_dir=`cat ${out_file_name}` 
  17.  
  18. # 替换 \ 为 \\ 防止 sed 命令出错 
  19. echo ${curr_dir} | sed 's/\\/\\\\/g' > ${out_file_name} && curr_dir=`cat ${out_file_name}` 
  20.  
  21. echo "curr dir: ${curr_dir}" 
  22.  
  23. # *.d 文件中包含了源文件信息所以不需要从 *.uvoptx 中提取,下面这些 if 里面的命令没有意义 
  24. if false ; then 
  25.     dir_uvoptx=./  
  26.     file_uvoptx=`find ${dir_uvoptx} -name "*.uvoptx"
  27.     echo "file the name: ${file_uvoptx}" 
  28.  
  29.     sed -i "s/      /"${curr_dir}"/g" ${out_file_name} 
  30.     sed -i  's/<\/PathWithFileName>//g' ${out_file_name} 
  31. fi 
  32.  
  33. # 首先进入目录 
  34. cd ${dir_obj} 
  35.  
  36. temp_file_name=temp_files.txt 
  37. find ./ -name "*.d" | xargs cat > head_temp.txt # 合并所有 d 文件 
  38.  
  39. if [[ ! -s head_temp.txt ]]  
  40. then 
  41.   echo "file is null, please build the project"  # 文件空白 
  42.   exit 0 
  43. fi 
  44.  
  45. # 去除重复文件,并排序 
  46. sort -u head_temp.txt > head_temp1.txt 
  47. # 去除标准头文件  搜索关键 ':\' (包含了标准头文件),分隔符 ':' 去除 *.O 文件名                   'o: ..'   'o: \.\.'  
  48. cat head_temp1.txt | grep -v ':\\' | awk -F ": " '{print $2}' > head_temp.txt  
  49.  
  50.  
  51. # 替换 / 为 \  
  52. sed -i 's/\//\\/g' head_temp.txt 
  53.  
  54.  
  55. # 添加绝对路径 
  56. absolute_files=../${out_file_name} 
  57. echo "add absolute dir: ${curr_dir}"  # 双反斜杠是为了防止 sed 命令出错 
  58. #行首(^ 代表行首)添加绝对路径字符串 
  59. sed "s/^/"${curr_dir}"/g" head_temp.txt > ${absolute_files}   
  60. # 添加相对路径(去除 ..\ )必须用单引号(根据 SI 工程的情况决定是否去除 ..\) 
  61. relative_files=../${relative_out_file_name} 
  62. sed 's:\.\.\\::g' head_temp.txt > ${relative_files}  
  63.  
  64. rm head_temp.txt head_temp1.txt  # 删除文件 
  65.  
  66. cnt=`wc ${absolute_files} | awk '{print $2}'`  # 计文件数 
  67.  
  68. echo "all files is saved in file: ${absolute_files##*/} && ${relative_files##*/}, files number is: ${cnt} " 

这个脚本会在当前目录下生成两个文件,absolute_files.txt 和 relative_files.txt ,里面包含了两种路径信息,如果使用相对路径的话,可以使用 relative_files.txt 导入到 SI 工程中,比如通过下面的 “add from list”导入这个文件 relative_files.txt:

那么如何使用这个脚本呢?

特别注意,工程路径中不要有中文,否则执行失败(下面的截图路径是中文,所以会失败)

0、编译 MDK ,产生 *.d 文件

把脚本保存到一个文件中,比如 mdk_list.sh

将脚本复制到工程目录下

修改脚本的 *.d 文件夹路径,这里的路径为 obj,

打开 git bash

执行刚才的脚本(这里的后缀可以随便,没有关系),可以在脚本目录下生成两个文件

  1. ./mdk_lsit.sh.txt 

生成的头文件路径中不存在标准头文件(可自行修改脚本支持),因为这个一般在 MDK 安装目录下,所以就去除了这些信息。

可以打开文件查看信息:

绝对路径:

相对路径:

特别注意:在使用 SI 导入该文件时,SI 工程路径必须和 MDK 工程保持一致。

即下面两个文件(夹)必须在同一目录下才能顺利添加进去。

如果 MDK 工程文件在子文件夹下,那么 SI 工程也必须在子文件夹下,否则 SI 导入时将失败,毕竟在使用相对路径时,不能找到对应文件当然会失败,但是使用绝对路径没有这个要求,但会影响 SI 工程的使用(不能随便移动工程或者重命名),可以自行修改脚本功能使其适用与不同情况。

总之,基本的脚本功能和思路已经提供给大家了,如何根据实际情况修改就是各位道友的问题了,建议大家简单学习一下这些脚本知识,可以帮助大家很方便的处理一些简单工作,比如替换、搜索、重命名、计数、数字比较等功能。

最后友情提醒,删除源文件时,需要有备份或者 git 管理,否则删错了可就后悔莫及了。

 

来源:鱼鹰谈单片机内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯