使用python来创建linux下的makefile

文章讲述了在管理C++项目时,手动编写makefile的不便,尤其是当源码文件数量较多时。作者提出使用Python脚本来自动化生成makefile,通过递归遍历源码目录获取所有cpp和c文件,然后创建一个简单的编译脚本。虽然生成的make.sh是半成品,仍需添加头文件路径、库信息等,但已显著减少了工作量。

作者:朱金灿
来源:clever101的专栏

  我经常使用的编译linux程序的makefile不太正式,类似如下:

g++ a.cpp b.cpp \
-I"/opt/ThirdPartyLib/pugixml/include" \   
-L"/opt/ThirdPartyLib/pugixml/lib" -lpugixml   \
 -std=c++11 -fPIE -o /opt/bin/MyApp

  这是一个简单的编译应用程序的makefile。制作这个makefile的痛点在哪里呢?假如一个模块存在很多源码文件的话,需要把很多的源码文件都加进makefile文件,这样工作量是很大的。此时可以考虑使用python来遍历源码目录来自动构建一个makefile文件。代码比较简单,如下:

#!/usr/bin/python
# -*- coding=utf-8 -*-
# author : clever101@163.com
# date: 2023-02-07
# version: 0.2
#propose:提供一个文件夹,生成对应的编译sh文件

import os

# 从指定path下递归获取所有文件
def getAllFile(path, fileList):
    dirList = []    # 存放文件夹路径的列表
    for ff in os.listdir(path):
        wholepath = os.path.join(path, ff)
        # wholepath = path+'/'+ff
        if os.path.isdir(wholepath):
            dirList.append(wholepath)   # 如果是文件添加到结果文件列表中

        if os.path.isfile(wholepath):
            fileList.append(wholepath)  # 如果是文件夹,存到文件夹列表中

    for dir in dirList:
        getAllFile(dir, fileList)   # 对于dirList列表中的文件夹,递归提取其中的文件,fileList一直在往下传,所有的文件路径都会被保存在这个列表中

# 从文件路径列表中筛选出指定后缀的文件
# 这里可以从源列表中删除 非后缀 项,也可以新建一个 后缀列表,遍历源列表向后缀列表中.append()后缀项
# 后者更容易一些,我这里选择了前者,还费劲解决了一波list循环remove的问题。。。
# list循环remove http://itdarcy.wang/index.php/20200109/381
def getSufFilePath(fileList, suffixs):
    # print(len(fileList))
    for ff in fileList[:]:
        bMatch = False
        for suffix in suffixs[:]:
            if ff.endswith(suffix):
                bMatch = True
                break
        if not bMatch:
            fileList.remove(ff)

# 遍历文件夹,获取里面的所有cpp文件名和c文件名
# 创建一个sh文件,将所有的文件名都写入到sh文件中
def CreateBuildShell(folder):
    fileList = []
    #用于过滤的文件后缀
    suffixs = ['.cpp','.c']
    getAllFile(folder, fileList)
    getSufFilePath(fileList, suffixs)
    shellFile = folder + "\\make.sh"
    count =0
    line = "g++ "
    with open(shellFile, 'w') as file:
        for codeFile in fileList:
            fileName = os.path.basename(codeFile)  # 带后缀的文件名
            if(0==count):
                line += fileName
            else:
                line +=" "+fileName
            count = count+1
            if(3==count):
                line+=" \\"
                file.write(line + '\n')
                line = ""
                count=0



if __name__ == "__main__":
    folder = "D:\\MyProject\\MyApp"
    CreateBuildShell(folder)

  当然使用python生成的这个makefile文件叫make.sh,它只是一个半成品。效果如下:

g++ a.cpp b.cpp \

  你还得添加包含的头文件路径、链接库路径以及库名称,输出是一个应用程序还是so库,还有其它一些gcc编译选项等。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clever101

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值