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

news2024/11/15 17:39:20

全部学习汇总: 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.coloradmin.cn/o/735567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java从入门到大牛】数组详解

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Java从入门到大牛 &#x1f320; 首发时间&#xff1a;2023年7月9日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e…

Python + pymysql 之 MySQL 查询操作

在MySQL中构建一个测试表&#xff0c;如下&#xff1a; 查询单条数据 # -*- coding: UTF-8 -*- import pymysqldef mysql_query():"""MySQL查询:return:"""# 打开数据库连接db pymysql.connect(host"127.0.0.1",user"root"…

IDEA 配置 openjdk,jre

使用 idea 配置 zip 版本的 openjdk 和 jre&#xff0c;我使用的时 redhat 提供的 jdk 和 jre。 一、下载 idea、jdk 和 jre 红帽下载地址为&#xff1a; jdk 和 jre 安装地址根据个人配置&#xff0c;我的配置如下&#xff1a; 下划线的分别为我的 jdk 和 jre 保存路径 二…

简单学习UE5.2的PCG框架插件里的基础概念

目标 最近了解到5.2版本推出了实验性的功能PCG框架&#xff0c;以及用它做的范例 Electric Dreams。 本篇我简单学习它的一些基础概念&#xff0c;做一些记录。 0. 启用插件 此功能相关的类型都在PCG插件中&#xff0c;因此首先要确保启用了PCG插件&#xff1a; 1. PCGGr…

为什么进程地址空间中包括操作系统?

今天聊聊进程地址空间这点小事。 说到进程的地址空间&#xff0c;大家可能都知道这样一张图&#xff1a; 这张图就是Linux程序运行起来后所谓的进程地址空间&#xff0c;这里包括我们熟悉的代码区、数据区、以及堆区和栈区&#xff0c;今天我们不讲解这些区域&#xff0c;而是…

Vue生态及实践 - SSR(上)

目录 目标 理论 Rendering 你真的需要SSR亦或是同构吗&#xff1f; 同构实践 通用代码 同构第一步&#xff1a;避免单例 src/app.js src/store.js src/router.js 同构第二步&#xff1a;Server entry【服务端进入】&#xff1b;Client entry【客户端进入】 src/entry…

ESP32设备驱动-AS5600磁性旋转位置传感器

AS5600磁性旋转位置传感器 文章目录 AS5600磁性旋转位置传感器1、AS5600介绍2、硬件准备3、软件准备4、驱动实现1、AS5600介绍 AS5600 是一款可编程的 12 位高分辨率非接触式磁性旋转位置传感器。 AS5600可以作为磁性电位器或磁性编码器使用,具有出色的可靠性和耐用性。 与传…

网页版代码编辑器实现

接着前几天写的博客https://blog.csdn.net/woyebuzhidao321/article/details/131495855&#xff0c;提到了涉及vscode网页版工作区创建的api&#xff0c;这两天一时兴起&#xff0c;搞了一个网页版的代码编辑器&#xff0c;如果在2020年10月之前&#xff0c;实现一个网页版代码…

活动笔记 | 「企业人效提升路径」之数字化实践

6月27日&#xff0c;由人力资源智享会联合盖雅工场等机构主办的2023中国人力资源数字化论坛在北京顺利举办。盖雅工场高级解决方案顾问谷天毅先生发表了主题为 《企业人效提升路径之数字化实践》 的分享。 以下是分享内容&#xff0c;enjoy~ △ 盖雅工场高级解决方案顾问谷天…

httpx 返回都是乱码问题,非编码问题。

因为python 的requests 不能使用抓http2 的报文。所以看了一些httpx的使用。但是发现httpx 不能自动解压&#xff0c;text打印出来的都是乱码。一开始以为是编码格式的bug &#xff0c;但是使用chardet 确认了确实是utf-8.然后怀疑是压缩的问题。先去官网搜了一些文档 文档说会…

opencv4.7.0编译opencv-contrib-4.7.0以及CUDA

0、引言 最近工作中需要用到使用CUDA加速后的opencv进行传统算法的开发&#xff0c;在编程之前&#xff0c;需要先解决环境编译和lib库问题&#xff0c;本文就是记录自己编译opencv-4.7.0的全过程。 1、CUDA下载和安装 可参考我之前的博客WIN10安装配置TensorRT详解中的前几…

达尔文——生物医疗科学领域大模型

赛灵力官网 1. 生物医疗领域的挑战 1.1 复杂性 生物系统和生物过程非常复杂&#xff0c;包含大量的相互作用和调控机制&#xff0c;理解和解析这些复杂性是一项巨大的挑战。 举例来说&#xff0c;单单一个人类&#xff0c;体内的生物信息就非常复杂&#xff1a; 人类体内体内…

Django_re_path_使用正则匹配url

与path定义的路由相比&#xff0c;re_path 定义的路由可以使用正则表达式匹配url。 需要注意的是&#xff1a; 如果未定义匹配结果的变量名&#xff0c;匹配的结果默认传入视图的第2个形参。如果定义了匹配结果的变量名&#xff0c;匹配的结果会传给视图的同名字段&#xff0…

从零开始学习自动驾驶决策规划

从零开始学习自动驾驶决策规划 从入门到掌握的一系列讲解&#xff0c;其中涵盖的内容如下&#xff1a; 前言课 第一节-ros工程的创建 第一节-运行环境和工程目录简介第二节-工程运行和小车模型搭建简介 第二节-车辆里程计第三节-整体架构思路 第三节-地图路线构建方法 第三节…

Packet Tracer – 配置静态 NAT

Packet Tracer – 配置静态 NAT 目标 第 1 部分&#xff1a;测试不使用 NAT 的访问 第 2 部分&#xff1a;配置静态 NAT 第 3 部分&#xff1a;测试使用 NAT 的访问 拓扑图 场景 在 IPv4 配置网络中&#xff0c;客户端和服务器使用专用编址。 然后&#xff0c;在含专用编址…

MATLAB---线性规划问题求最优解(含例题)

线性规划是运筹学的基础&#xff0c;在现实企业经营中&#xff0c;如何有效的利用有限的人力、财力、物力等资源。 MATLAB 为方便大家理解&#xff0c;这里我们直接用一个例题为大家讲解使用matlab求解线性规划问题。 根据上图给出的线性规划问题。我们使…

SpringBoot 如何使用 @ExceptionHandler 注解进行局部异常处理

SpringBoot 如何使用 ExceptionHandler 注解进行局部异常处理 介绍 在开发 Web 应用程序时&#xff0c;异常处理是非常重要的一部分。SpringBoot 提供了多种方式来处理异常&#xff0c;其中之一是使用 ExceptionHandler 注解进行局部异常处理。使用 ExceptionHandler 注解&am…

哈工大计算网络课程数据链路层详解之:数据链路层服务

哈工大计算网络课程数据链路层详解之&#xff1a;数据链路层服务 在介绍完网络层的实现功能和协议之后&#xff0c;接下来我们继续介绍网络层的下一层&#xff1a;数据链路层。 本节首先对数据链路层的功能和所提供的服务进行概述。 如下图示例网络所示&#xff0c;标红色的部…

【二分查找】34. 在排序数组中查找元素的第一个和最后一个位置

34. 在排序数组中查找元素的第一个和最后一个位置 解题思路 使用二分查找查找到目标元素的索引之后然后向左以及向右寻找目标元素&#xff0c;然后记录下区间位置 然后保存下来 class Solution {public int[] searchRange(int[] nums, int target) {// 使用二分查找 数组有序…

Java使用Stream API对于数据列表经常处理

Java使用Stream API对于数据列表经常处理 先提供一些简单到复杂的常见例子&#xff0c;您可以根据这些例子进行进一步的开发和学习&#xff1a; 数据过滤筛选操作 查询表中所有数据&#xff1a; List<User> users userDao.getAllUsers();根据条件查询单个结果&#…