热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python编写makefile_用python写makefile

温馨提示:阅读本文的同学最好能了解makefile和python的编写规则。不懂的同学能够先保存在收藏夹。以便日后查看。事实上之前我一直非常懒,我不想了

温馨提示:阅读本文的同学最好能了解makefile和python的编写规则。

不懂的同学能够先保存在收藏夹。以便日后查看。

事实上之前我一直非常懒,我不想了解makefile规则。由于在linux下开发我一直使用Qt creator。(非常多时候正是一些“懒人”的创造力。解放了我们的双手,显然如今我们还须要用双手写makefile)。Qt creator是一个非常好的IDE。并且能够跨平台开发。可是相比VS,显然还是不够优秀。

因此非常多开发人员都会选择在Windows下开发C/C++程序,然后部署在Linux下运行。当然我也不例外。所以近期花了几个晚上了解makefile的编写规则。

開始的时候。我參照网上一些makefile的样例,写了一个初版的makefile。然而这个makefile在编译我的project的时候报错。

主要出错体如今:

%.o: %.cpp

$(CXX) -fpic -c $(INCPATH) $<-o $&#64;

当然能够写成

$(objdir)/%.o:$(srcdir)/%.cpp

$(CXX) -fpic -c $(INCPATH) $<-o $&#64;

原因在于&#xff1a;

1、.o文件与.cpp文件处于不同的文件夹下。

2、不同的.o文件或不同的.cpp文件处于不同的文件夹下。

这时我找到两种解决方法&#xff1a;

1、就是用VPATH这个特殊变量&#xff0c;可是我不可能将全部要包括的文件夹都一一手动包括进来&#xff0c;于是我放弃。

2、就是把全部的编译规则列举出来。

我终于选择另外一种解决方法。

由于之前遇到这个困难时&#xff0c;我特意去了解Qt生成的makefile(事实上这个makefile是根据.proproject文件生成的)。而这个makefile正是将全部的编译规则都列举出来。

于是就有以下这个python脚本。事实上開始的时候我想用shell来做这一步工作的&#xff0c;可是我看到sed和awk。我头都晕&#xff0c;之前还一直抵触学习sed和awk。因此最后选择了python。

#encoding: utf-8

import os

import os.path

import sys

#sys.exit(0);

#########################################################################################################################

#

#本脚本的作用是:通过配置必要的信息,用python来生成makefile。

(技术支持:www.guimigame.com)

#&#64;FILENAME 运行脚本输出makefile文件名称

#&#64;BIN 生成可运行文件名称

#&#64;SUFFIX 源文件后缀

#&#64;ROOTPATH“根”文件夹路径(脚本工作文件夹的上一层)

#&#64;PWD当前工作文件夹

#&#64;WD 工作文件夹。假设程序有多个工作文件夹请一一用append加上

#&#64;BINDIR可运行文件输出文件夹

#&#64;OBJDIR中间文件输出文件夹

#&#64;INCROOTPATH头文件包括路径的“根路径”&#xff0c;方便INCPATH的编写

#&#64;LIBROOTPATH 包括库的“根”路径。方便LIBS的编写

#&#64;INCPATH 头文件包括路径

#&#64;SYSLIBS 包括的系统库

#&#64;LIBS编译程序须要包括的库

# &#64;CXX一般填写gcc/g&#43;&#43;

#&#64;FLAGSgcc/g&#43;&#43;的编译标志

#

#########################################################################################################################

FILENAME &#61; &#39;makefile&#39;;

BIN&#61; "DatabaseServer";

SUFFIX &#61; ".cpp";

ROOTPATH &#61; os.path.dirname(os.path.dirname(os.path.abspath(__file__)));

PWD &#61; os.getcwd();

WD&#61; [];

WD.append(PWD);

WD.append(ROOTPATH &#43; "/common");

BINDIR&#61; PWD &#43; "/Bin/";

OBJDIR&#61; BINDIR &#43; "obj/";

INCROOTPATH&#61; "-I " &#43; ROOTPATH;

LIBROOTPATH &#61; "-L " &#43; ROOTPATH;

INCPATH &#61; INCROOTPATH &#43; "/common" &#43; " " &#43; INCROOTPATH &#43; "/lib/include";

SYSLIBS&#61; " -lmysqlclient -lpthread"

LIBS&#61; LIBROOTPATH &#43; "/lib/linux " &#43; "-lTimeManager -lServerConfig -lGameSocket -lCommon -lTinyxml" &#43; SYSLIBS;

CXX&#61; "g&#43;&#43;";

FLAGS&#61; &#39;-g -Wall&#39;;

#########################################################################################################################

#

#下面不须要再配置

#

#########################################################################################################################

OBJFILE&#61; &#39;&#39;;

OBJ2SRC&#61; [];

SOURCES&#61; "";

def SearchFiles(path):

global OBJFILE;

global OBJ2SRC;

global SOURCES;

global SUFFIX;

listFile &#61; os.listdir(path);

for file in listFile:

if os.path.isdir(os.path.join(path, file)):

SearchFiles(os.path.join(path, file));

elif file.endswith(SUFFIX) > 0:

OBJFILE &#61; file;

OBJFILE &#61; OBJFILE.replace(SUFFIX,&#39;.o&#39;);

OBJ2SRC.append([OBJDIR &#43; OBJFILE,path &#43; "/" &#43; file]);

SOURCES &#43;&#61; path &#43; "/" &#43; file &#43; " ";

for dir in WD:

SearchFiles(dir);

if os.path.exists(FILENAME):

os.remove(FILENAME);

f &#61; open(FILENAME,&#39;w&#39;);

f.write("PWD &#61; " &#43; PWD &#43; "\n");

f.write("CXX &#61; " &#43; CXX &#43; "\n");

f.write("INCPATH&#61; " &#43; INCPATH &#43; "\n");

f.write("LIBS &#61; " &#43; LIBS &#43; "\n");

f.write("BINDIR&#61; " &#43; BINDIR &#43;"\n");

f.write("OBJDIR&#61; " &#43; OBJDIR &#43; "\n");

f.write("BIN &#61; " &#43; BIN &#43; "\n");

f.write("SOURCES&#61; " &#43; SOURCES&#43; "\n");

f.write("SOURCEFILES&#61; $(notdir $(SOURCES))\n");

f.write("OBJECTS&#61; $(addprefix $(OBJDIR), $(patsubst %.cpp,%.o,$(SOURCEFILES)))\n");

f.write("FLAGS&#61; " &#43; FLAGS &#43; "\n");

f.write("\n");

f.write("all:makedir $(OBJECTS)\n");

f.write("$(CXX) $(FLAGS) $(INCPATH) -o $(BIN) $(OBJECTS) $(LIBS);\n");

f.write("\n");

f.write("makedir:\n");

f.write(&#39;$(shell if [ -n "$(OBJDIR)" -a ! -e "$(OBJDIR)" ];then mkdir -p $(OBJDIR); fi)\n&#39;);

f.write(&#39;$(shell if [ -n "$(BINDIR)" -a ! -e "$(BINDIR)" ];then mkdir -p $(BINDIR); fi)\n&#39;);

f.write("\n");

for val in OBJ2SRC:

f.write(val[0] &#43; ":" &#43; val[1] &#43;"\n");

f.write("rm -f $&#64;\n");

f.write("$(CXX) -fpic -c $(INCPATH) $<-o $&#64;\n");

f.write("\n");

f.close();

os.system("make");

os.system("mv " &#43; BIN &#43; " " &#43; BINDIR);

os.system("cd " &#43; OBJDIR &#43; ";rm -f *.o");

怎样编写makefile和python&#xff0c;这里不作说明。由于这篇文章不是makefile和python的教程。下面要说明的是SearchFiles函数。

通过遍历之前设定的project工作文件夹。调用SearchFiles遍历该文件夹下全部的源文件(.cpp),及设定目标文件(.o)的绝对路径&#xff0c;终于是tuple的形式保存到OBJ2SRC数组中。还有的是将全部源文件保存在SOURCES中。当然这个过程中会递归遍历全部子文件夹&#xff0c;查找到全部的源文件。终于在for val in OBJ2SRC:遍历全部的数据&#xff1b;列出全部的源文件(.cpp)生成所相应的目标文件(.o)。将编译规则写进makefile。

这是我要编译的project。当然截图仅仅是其中一部分。

这个project须要包括的文件除了在DatabaseServer下,还要包括在../common其中(脚本中代码WD.append(ROOTPATH &#43; "/common");)。

我截图是为了证明。这个脚本是可行的。有人可能会说为什么不写一个測试样例。

事实上我想说。非常多时候要弄懂一些技术。动手去做或许是最好的方法。假设你有什么问题&#xff0c;欢迎与我讨论&#xff01;



推荐阅读
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 个人博客https:juejin.cnuser176366088104638和http:blog.wuzhenyu.com.cncmake编译动态库和链接动态库cmake中&#x ... [详细]
  • 在Linux环境下编译安装Heartbeat时,常遇到依赖库缺失的问题。为确保顺利安装,建议预先通过yum安装必要的开发库,如glib2-devel、libtool-ltdl-devel、net-snmp-devel、bzip2-devel和ncurses-devel等。这些库是编译过程中不可或缺的组件,能够有效避免编译错误,确保Heartbeat的稳定运行。 ... [详细]
  • zabbix 自定义监控
    配置自定义监控,我们需要配置监控项的key,和监控项返回的value添加自定义监控key的格式,在配置文件中添加UserParameter ... [详细]
  • Linux下Google Test (GTest)测试环境搭建步骤
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • [转]Makefile 使用总结
    2019独角兽企业重金招聘Python工程师标准1.Makefile简介Makefile是和make命令一起配合使用的.很多大型项目的编译都是通过Makefile来组织的,如 ... [详细]
  • 1.Googlehonggfuzz安装$githttps:github.comgooglehonggfuzz.git$cdhonggfuzz$make$makeinstall2.安 ... [详细]
  • 在进行网络编程时,准确获取本地主机的IP地址是一项基本但重要的任务。Winsock作为20世纪90年代初由Microsoft与多家公司共同制定的Windows平台网络编程接口,为开发者提供了一套高效且易用的工具。通过Winsock,开发者可以轻松实现网络通信功能,并准确获取本地主机的IP地址,从而确保应用程序在网络环境中的稳定运行。此外,了解Winsock的工作原理及其API函数的使用方法,有助于提高开发效率和代码质量。 ... [详细]
  • 在《PHP应用性能优化实战指南:从理论到实践的全面解析》一文中,作者分享了一次实际的PHP应用优化经验。文章回顾了先前进行的一次优化项目,指出即使系统运行时间较长后出现的各种问题和性能瓶颈,通过采用一些通用的优化策略仍然能够有效解决。文中不仅详细阐述了优化的具体步骤和方法,还结合实例分析了优化前后的性能对比,为读者提供了宝贵的参考和借鉴。 ... [详细]
  • 在Linux环境下安装Oracle 11g时,经常会遇到中文显示异常的问题。本文详细介绍了如何解决安装界面中的中文乱码现象,确保用户在安装过程中能够正确显示中文字符。具体步骤包括调整系统语言设置、配置环境变量以及修改Oracle安装文件等方法,以确保安装过程顺利进行。 ... [详细]
  • 在VC环境中,掌握高效的调试技巧和高级应用对于提高开发效率至关重要。本文详细介绍了如何通过检查程序中的括号匹配来避免常见的语法错误。具体操作包括将光标置于待检测的括号(如大括号 {}、方括号 [] 和圆括号 ())上,系统会自动高亮显示对应的配对括号,从而帮助开发者快速定位和修复问题。此外,文章还探讨了其他实用的调试工具和方法,如断点设置、变量监视和调用堆栈分析,以全面提升代码调试的准确性和效率。 ... [详细]
  • 本指南详细介绍了如何使用 `apt-get` 命令在 Ubuntu 系统上部署 MySQL 5、Apache 2、PHP 5 及 phpMyAdmin。首先,建议读者查阅 Ubuntu 的官方文档以获取更多背景信息。通过本文,您将逐步了解每个软件包的安装过程及其配置方法,确保系统环境的稳定性和安全性。此外,还将提供一些常见问题的解决方案,帮助用户顺利完成部署。 ... [详细]
  • 技术日志:在Ubuntu 20.04上部署与移除MySQL 8的详细步骤
    技术日志:在Ubuntu 20.04上部署与移除MySQL 8的详细步骤 ... [详细]
  • 在使用 PHP 通过 SSL 安全连接到 MySQLi 数据库服务器时,遇到了一些技术难题。我的环境包括一个 Web 服务器和一个数据库服务器,两者均使用 OpenSSL 生成了证书。尽管证书内容一致,但在尝试从 Web 服务器使用 `mysql` 命令进行连接时,仍然遇到了问题。为了确保连接的安全性和稳定性,需要进一步检查证书配置和 PHP 的 SSL 设置,以排除潜在的配置错误或兼容性问题。 ... [详细]
  • PyFasterRCNN配置详解与优化指南
    本文主要讲解Faster-RCNN的配置过程,以及配置过程中遇到问题的解决方案。 1.下载工程gitclone--recursivehttps:github.comr ... [详细]
author-avatar
ssben_530
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有