1762_gcc编译c语言makefile自动生成工具的Perl实现

news/2024/11/24 20:23:03/

全部学习汇总: GreyZhang/g_makefile: Learn makefile from all kinds of tutorials on the web. Happy hacking and let's find an common way so we may don't need to touch makefile code any more! (github.com)

         前阵子实现了一个CodeWarrior嵌入式开发环境的自动编译环境,用的基本上是Python。说起来,我觉得那个环境还是很实用的。虽说还有很多可以改进的地方,但是总觉得能用就好了,不想去做那么多的补丁。

         虽说自己从事的是汽车电子嵌入式开发,但是很多时候各种代码正确或者错误的测试我都是借助于gcc,编译一下直接打印出执行结果。虽说方法很烂,但是通常这么简单的一个功能已经足以让我去定位绝大多数的问题。不过,有时候文件多的时候确实也需要自己写个简单的makefile,一来二去,厌烦了重复劳作的我有了写个简单小工具的想法。参考之前的CodeWarrior实现,只是这次改成了Perl,因为我接触的计算机环境中Perl更为普遍适用一些。

         本次实现的功能很不完整,实用功能是最主要的指标,其他的功能能省则省。makefile的生成也只完成了文件的编译和链接功能,但是我觉得这已经足以覆盖90%以上的需求。make工具使用了gmake,从MATLAB的安装目录中找到的,gcc是安装草莓Perl时打包安装的。中间用到了一点点DOS CMD命令,测试的平台为Windows10 HB。

         我的最小工程demo如下:

         一个main.c文件,两个以文件夹划分的模块。设计的时候把所有的object文件生成在同一个文件夹,名为objects,最终可执行程序的名称在Perl程序中指定。

         原始工程目录树如下:

         makefile构建功能在make.pl中实现,具体的代码如下(使用截图是为了有更好的格式与语法显示,路过感兴趣的可以自己抄一遍或者跟我联系索取,联系方式在文章开头已经提供):

         为了能够让工程更完善一些,我把gmake加入到了环境变量,而make与clean则全都用Windows的批处理简单实现了一下。具体的测试结果如下:

1. 运行Perl程序,生成makefile

生成的makefile内容如下:

CC = gcc

test_project : main.o test1.o test2.o

         gcc -o D:\workspace\Perl\maketools\test_project main.o test1.o test2.o

main.o: D:\workspace\Perl\maketools\main.c C:/Strawberry/c/i686-w64-mingw32/include/stdio.h \

 C:/Strawberry/c/i686-w64-mingw32/include/crtdefs.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw_mac.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw_secapi.h \

 C:/Strawberry/c/i686-w64-mingw32/include/vadefs.h \

 C:/Strawberry/c/i686-w64-mingw32/include/sdks/_mingw_directx.h \

 C:/Strawberry/c/i686-w64-mingw32/include/sdks/_mingw_ddk.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw_print_push.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw_off_t.h \

 C:/Strawberry/c/i686-w64-mingw32/include/swprintf.inl \

 C:/Strawberry/c/i686-w64-mingw32/include/sec_api/stdio_s.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw_print_pop.h \

 D:\workspace\Perl\maketools\test1/test1.h \

 D:\workspace\Perl\maketools\test2/test2.h

         $(CC) -c -o $@ $<  -I D:\workspace\Perl\maketools -I D:\workspace\Perl\maketools\objects -I D:\workspace\Perl\maketools\test1 -I D:\workspace\Perl\maketools\test2

test1.o: D:\workspace\Perl\maketools/test1\test1.c C:/Strawberry/c/i686-w64-mingw32/include/stdio.h \

 C:/Strawberry/c/i686-w64-mingw32/include/crtdefs.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw_mac.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw_secapi.h \

 C:/Strawberry/c/i686-w64-mingw32/include/vadefs.h \

 C:/Strawberry/c/i686-w64-mingw32/include/sdks/_mingw_directx.h \

 C:/Strawberry/c/i686-w64-mingw32/include/sdks/_mingw_ddk.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw_print_push.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw_off_t.h \

 C:/Strawberry/c/i686-w64-mingw32/include/swprintf.inl \

 C:/Strawberry/c/i686-w64-mingw32/include/sec_api/stdio_s.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw_print_pop.h

         $(CC) -c -o $@ $<  -I D:\workspace\Perl\maketools -I D:\workspace\Perl\maketools\objects -I D:\workspace\Perl\maketools\test1 -I D:\workspace\Perl\maketools\test2

test2.o: D:\workspace\Perl\maketools/test2\test2.c C:/Strawberry/c/i686-w64-mingw32/include/stdio.h \

 C:/Strawberry/c/i686-w64-mingw32/include/crtdefs.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw_mac.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw_secapi.h \

 C:/Strawberry/c/i686-w64-mingw32/include/vadefs.h \

 C:/Strawberry/c/i686-w64-mingw32/include/sdks/_mingw_directx.h \

 C:/Strawberry/c/i686-w64-mingw32/include/sdks/_mingw_ddk.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw_print_push.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw_off_t.h \

 C:/Strawberry/c/i686-w64-mingw32/include/swprintf.inl \

 C:/Strawberry/c/i686-w64-mingw32/include/sec_api/stdio_s.h \

 C:/Strawberry/c/i686-w64-mingw32/include/_mingw_print_pop.h

         $(CC) -c -o $@ $<  -I D:\workspace\Perl\maketools -I D:\workspace\Perl\maketools\objects -I D:\workspace\Perl\maketools\test1 -I D:\workspace\Perl\maketools\test2

         虽说这种makefile比较冗长难维护,但是其实我们的工具本来就是解决这样的问题的,只要编译能够顺利执行,我们并不需要特别在意makefile的具体内容。

2. 进行编译功能的测试

         这样,简单的编译功能已经实现。

3. 编译结果执行

         到此,一个简单可以用于日常代码测试的工具已经实现。值得注意的是,中间固定死了主函数所在的文件名以及位置。至于目录层级,其实这个工具支持还算是良好。


http://www.ppmy.cn/news/751209.html

相关文章

怎样关闭笔记本触控板

FnF8组合键,笔者笔记本是联想的&#xff0c;可通过此法关闭触控板&#xff0c;如遇到个别笔记本电脑通过此方法不能关闭触摸板。另外个别笔记本也提供了关闭触摸板的快捷键&#xff0c;详细信息需要提供具体型号核实。 禁用触控板 打开控制面板&#xff0c;双击打开“鼠标”选…

关闭笔记本自带鼠标触摸键

亲试&#xff0c;此方法确实好用 1 首先在笔记本电脑桌面的“计算机&#xff08;我的电脑&#xff09;”上右键鼠标&#xff0c;然后选择打开“属性”&#xff0c;如下图所示。 怎么禁用笔记本键盘 关闭笔记本自带键盘方法 2 打开系统属性后&#xff0c;点击进入上角的【设备管…

测试用例是什么?怎么写?不会测试用例的看过来,

前言 今天笔者想和大家来聊聊测试用例&#xff0c;这篇文章主要是想要写给测试小伙伴们的&#xff0c;因为我发现还是有很多小伙伴在遇到写测试用例的时候无从下手&#xff0c;我就想和大家简单的聊聊&#xff0c;这篇文章主要是针对功能测试的哟。 一、什么是测试用例&#…

用html+javascript打造公文一键排版系统1:设计界面

近日&#xff0c;有同事抱怨收到的文件没有按公文要求进行排版&#xff0c;不得不自已动手帮他们擦PP排版&#xff0c;感慨每天都在做这些无意义的事情&#xff0c;浪费生命&#xff01; 于是打算用用htmljavascript打造公文一键排版系统。 首先是设置界面&#xff0c;主要包…

Google 总部员工终于也享受到了 “蜗居” 待遇

金融时报记者Richard Waters昨天在拜访Google山寨城总部的时候&#xff0c;拍摄到了如上图的这张诡异照片&#xff0c;一个Google员工躺在类似“蜗居”的设备里休息&#xff08;还是在看什么见不得人的东西&#xff1f;&#xff09;。Richard说当他走过这枚“蜗居”之时&#x…

探秘Google美国总部

推荐&#xff01;探秘Google美国总部 如果你在Google英文搜索中搜索“Worst Company In the World&#xff08;世界上最烂的公司&#xff09;”&#xff0c;你就会发现其结果竟然是Google和沃尔玛&#xff0c;但事实到底是怎么样呢&#xff1f;让我们一起走进Google美国总部Goo…

探秘Google中国总部

google神秘的美国总部其实被曝光的次数已经不少了&#xff0c;但是你是否了解google的中国总部是什么样子&#xff1f;请看 独家探秘google中国总部。感觉装饰和氛围比美国总部差了一截。但是跟中国同行比起来还是满有特色的。

参观腾讯北京总部记

今天特意简单写点参观随笔&#xff0c;以示踏雪留痕吧。 1&#xff09;获得中国鲁班奖的腾讯北京职场内部图。好久没去科技公司看看了&#xff0c;想起了当年老东家IBM在西北旺的环宇与钻石大厦。 2、久违的QQ&#xff0c;据说还有5~6亿的用户&#xff0c;还都是年轻用户。 3、…