一个简单的python自动化编译的脚本

今天又学了一下 makefile,感觉我还是写不出一些比较好用的脚本程序,索性就用 python 写了一个自动化编译的脚本

这个脚本我指定编译 ./ 和 ./src 两个目录下的 .cpp 程序,将编译后的 .o 文件保存到到 ./obj 文件夹中,然后把 ./obj 文件夹中的所有 .o 文件链接成 main.exe 文件。

脚本的功能并不完善,如果有哪些大神刷到这篇文章,觉得有兴趣可以帮我完善一下,那就非常感谢了,毕竟我也没写过大型的 cpp 项目

​​​一个简单的python自动化编译的脚本_第1张图片一个简单的python自动化编译的脚本_第2张图片

import os
import time

'''
程序目录:
    1.路径生成
    2.ini解析
    3.读取文件修改情况
    4.编译需要编译目录下的文件
    5.写入所有的时间
    6.链接所有的.o文件
'''


'''1.路径生成'''
#获取的路径
RunPath = os.getcwd()
ConfigPath = RunPath + "\\config"
ObjPath = RunPath + "\\obj"
SrcPath = RunPath + "\\src"

#查看路径存不存在,如果不存在就创建
if (os.path.exists(ConfigPath) == False):
    os.mkdir(".\\config")
if (os.path.exists(ObjPath) == False):
    os.mkdir(".\\obj")
if (os.path.exists(SrcPath) == False):
    os.mkdir(".\\src")

#所有要编译的路径
allBuildPath = []
allBuildPath.append(RunPath)
allBuildPath.append(SrcPath)


'''2.ini解析'''
FileName = ConfigPath + "\\bulidconfig.ini"

#判断bulidconfig.int文件是否存在
if (os.path.exists(FileName) == False):
    f = open(FileName, 'w')
    f.close()

#然后可以在这里写读取配置文件的相关内容,方便后期使用
#我这里偷懒就不做了

'''3.读取文件修改情况'''
FileName = ".\\config\\lastTime.txt"

#按照第一个空格分隔
def cutFileAndTime(lineStr):
    ret = []
    pos = 0
    for i in lineStr:
        if(i == " "):
            ret.append(lineStr[:pos])
            ret.append(lineStr[(pos+1):])
            break
        pos = pos + 1
    return ret

#判断lastTime.txt文件是否存在
if (os.path.exists(FileName) == False):
    f = open(FileName, 'w')
    f.close()

#读取上一次运行时候的时间
f = open(FileName, 'r', encoding='utf-8')
lastTime = []
for line in f:
    ret = cutFileAndTime(line.strip())
    lastTime.append(ret)
f.close


'''4.编译需要编译目录下的文件'''
#判断是不是cpp文件
def isCpp(file):
    fileLen = len(file)
    if (fileLen > 3):
        fileSuffix = file[fileLen-4:fileLen]
        if (fileSuffix == ".cpp"):
            return True
    return False

#.cpp->.o
def cpp_o(file):
    fileLen = len(file)
    if (fileLen > 3):
        fileSuffix = file[fileLen-4:fileLen]
        if (fileSuffix == ".cpp"):
            return file[0:fileLen-4] + ".o"
    return file + ".o"

#判断obj文件存不存在
def isObjExist(file):
    return os.path.exists(ObjPath + "\\" + cpp_o(file))

#判断需不需要编译
def isbuild(file, mtime):
    for i in lastTime:
        if (i[0] == file):
            if (i[1] == mtime):
                return False
            break
    return True

#编译单个文件
newTime = []
def buildFile(filePath, file):
    mtime = time.ctime(os.path.getmtime(filePath + "\\" + file))
    fileLine =[]
    fileLine.append(file)
    fileLine.append(mtime)
    newTime.append(fileLine)
    if (isbuild(file, mtime) or (isObjExist(file) == False)):
        cmd = "g++ -c " + filePath + "\\" + file + " -o " + ObjPath + "\\" + cpp_o(file)
        os.system(cmd)
        print("build %s success!" %(file))

#编译所有的文件
for path in allBuildPath:
    files = os.listdir(path)
    for file in files:
        if (isCpp(file) == False):
            continue
        buildFile(path, file)


'''5.写入所有的时间'''
f = open(FileName, 'w', encoding='utf-8')
for i in newTime:
    f.write(i[0] + " " + i[1] + "\n")
f.close()


'''6.链接所有的.o文件'''
cmd = "g++ ./obj/*.o -o main"
os.system(cmd)

 

你可能感兴趣的:(C/C++,自动化,运维)