免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1771 | 回复: 2
打印 上一主题 下一主题

[其他] 帮助提高阅读代码效率的工具 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-26 16:27 |只看该作者 |倒序浏览
本帖最后由 prc 于 2015-11-26 16:33 编辑

在阅读大型C/C++工程源码的过程中常常遇到以下问题
  • 源码中存在的条件编译语句;有的甚至很长,超出了屏幕的高度
  • 工程中存在大量同名的符号
这些都会打断思维过程,使得我不得不停下来花费时间精力去判断哪个代码块为“真”,哪个为“假”。 CL针对这个问题提供了一套简单的解决方案,在编译过程中模仿预处理器计算条件编译语句的值,然后删除“假”的代码块, 仅剩下有效代码。

运行环境
  • Ubuntu (其它的linux发行版应该也可以,但是没做过测试)
  • Python 2
  • Gnu awk
  • Bash
  • Gnu make

运行
以linux为例,依次执行下列命令:
  • git clone https://github.com/panruochen/codeless.git
  • 编译CL,假设代码目录为${CL_DIR}
  • make defconfig CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH}
  • ${CL_DIR}/y-Make --yz-cc=${CROSS_COMPILE}gcc --yz-postprocess=${YOUR_DIR} --yz-server-addr=${ANY_VALID_PATH} -j8
--yz开头的参数传给CL的;--yz-cc表示编译器,--yz-postprocess表示先编译后清理源文件;一般来说只需要这两个参数就可以了。 --yz-server-addr表示启动server并指定server的地址(该地址可以是任何有效的路径)。启动server可以减少临时文件的大小, 并对程序的性能有轻微的改善。而其它的参数如-j8则是传给make的。
编译完成后,在linux目录下会发现大量的.bak文件,它们都是被清理过的同名的.c/.cpp/.h文件的备份。通过比较.bak与原文件,可以发现源文件中的条件编译代码已经被删除:

为了方便恢复代码,建议使用git或者其它的版本管理工具。
为了保证目标文件vmlinux与源代码的一致性,还需要再次编译linux。

限制
只能使用下列编译器(其它的编译器未经测试)
  • gcc
  • clang
并且${CROSS_COMILE}gcc展开后只能包含字母,数字,下划线_和减号-

副产品
${YOUR_DIR}目录下的projlist.txt列出了本次编译涉及到的所有.c/.cpp/.h文件,我们可以利用它来生成一个更精确的cscope或者ctags的数据库。
cscope -bkq -i <(tail -n +2 projlist.txt)
通过这个数据库查找可以避免大量重名的符号。


y-Make的命令行参数

  1. --yz-cc=CC                 指定编译器
  2. --yz-postprocess=DIR       开启后处理模式,并使用DIR为其工作目录
  3. --yz-save-dep=FILE         将所有依赖关系保存在文件FILE中
  4. --yz-save-cl=FILE          将所有命令行保存在文件FILE中
  5. --yz-save-condvals=FILE    将所有条件编译语句的计算结果保存在文件FILE中
  6. --yz-save-proj=FILE        将编译中所涉及到的文件保存在文件FILE中
  7. --yz-server-addr=FILE      启动server,并以FILE作为server的地址
  8. --yz-runtime-dir=DIR       指定server的工作目录为DIR;默认为/var/tmp
  9. --yz-xcc=FILE              指定FILE为parser;默认为${CL_DIR}/cl.exe
  10. --yz-server-program=FILE   指定FILE为server;默认为${CL_DIR}/cl-server.exe
复制代码
Post Process(后处理)
后处理模式是为了解决编译过程中的实际问题而引入的,即一个.c/.cpp文件有可能被多次编译。如果在编译之前清理文件(这是默认模式), 被删除掉的代码很可能在第二次编译时应该被引用,从而导致整个编译过程失败。 并且,.h文件几乎100%会被多次引用,如果未开启后处理模式,清理.h文件是不可能的。

适用范围
下列开源项目经过测试
  • linux-3.6
  • linux-2.6.27.29
  • llvm-3.5.0
  • u-boot
  • make-4.0

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
2 [报告]
发表于 2015-11-27 10:44 |只看该作者
看起来不错;

做个在线服务吧,提供linux upstream代码处理后的下载,

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
3 [报告]
发表于 2015-11-27 16:21 |只看该作者
为什么不用OpenGrok啊都多少年了啊从来没有人想得起这个东西么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP