`
sogo6
  • 浏览: 113781 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

用python写的linux编译工具,直接读取vcproj文件

阅读更多
很多时候,我们写代码,是在wndows下面用vc写的,但是又需要到linux系统或者其他unix系统上编译,还需要另外写makefile文件,很麻烦,下面这个工具,可以直接从vcproj中读取文件,生成编译命令进行编译。。。。不用再写烦人的makefile了。。。工具还不完善,后面有时间继续完善它。。。。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from xml.dom import minidom
import sys
import re
import os

class TOptions:
    def __init__(self):
        incDirs = ''
        libDirs = ''
        libs = ''
        preDefines = ''
        outFile = ''
        outDir = ''
        srcfiles = []


if __name__ == '__main__':
    #print sys.argc
    print sys.argv
    oFile = file('tclient.vcproj', 'r')
    data = ''
    lines = oFile.readlines()
    lines[0] = lines[0].replace('"gb2312"', '"utf-8"')
    data = data.join(lines)
    oFile.close()
    data = data.decode('gb2312').encode('utf-8');
    lstEnv = []
    lstEnv = re.findall(r'\$\(\w*\)'.encode('utf-8'), data)
    for env in lstEnv:
        print env[2:-1]
        data = data.replace(env, os.getenv(env[2:-1], env))
    data = data.replace('\\', '/');
    option = TOptions()
    xmldoc = minidom.parseString(data)
    xmlConf = xmldoc.getElementsByTagName('Configuration')
    for conf in xmlConf:
        print conf.attributes['Name'].value
        print conf.attributes['OutputDirectory'].value
        if conf.attributes['Name'].value.find('Debug') >= 0:
            print 'Debug do nothing...'
            continue
        option.outDir = conf.attributes['OutputDirectory'].value
        for tool in conf.childNodes:
            if 1 == tool.nodeType:
                if 'VCCLCompilerTool' == tool.attributes['Name'].value:
                    print '--compile...'
                    print tool.attributes['AdditionalIncludeDirectories'].value
                    print tool.attributes['PreprocessorDefinitions'].value
                    option.incDirs = tool.attributes['AdditionalIncludeDirectories'].value
                    option.preDefines = tool.attributes['PreprocessorDefinitions'].value
                    
                if 'VCLinkerTool' == tool.attributes['Name'].value:
                    print '--link...'
                    print tool.attributes['AdditionalDependencies'].value
                    print tool.attributes['AdditionalLibraryDirectories'].value
                    print tool.attributes['GenerateDebugInformation'].value
                    print tool.attributes['OutputFile'].value
                    option.libs = tool.attributes['AdditionalDependencies'].value
                    option.libDirs = tool.attributes['AdditionalLibraryDirectories'].value
                    option.outFile = tool.attributes['OutputFile'].value.rstrip('.exe')
    option.srcfiles = []
    files = xmldoc.getElementsByTagName('File')
    for file in files:
        srcfile = file.attributes['RelativePath'].value
        option.srcfiles.append(srcfile)
    
    ds = option.preDefines.split(';')
    ds1 = []
    for d in ds:
        if 'WIN32' == d:
            d = 'LINUX'
        d = '-D' + d
        ds1.append(d)
    option.preDefines = ' '.join(ds1)
    print option.preDefines
    
    incDir = option.incDirs.split(';')
    incDir1 = []
    for inc in incDir:
        inc = '-I' + inc
        incDir1.append(inc)
    option.incDirs = ' '.join(incDir1)
    print option.incDirs
    
    libDir = option.libDirs.split(';')
    libDir1 = []
    for dir in libDir:
        dir = '-L' + dir
        libDir1.append(dir)
    option.libDirs = ' '.join(libDir1)
    print option.libDirs
    
    libs = option.libs.split(' ')
    libs1 = []
    for lib in libs:
        lib = '-l' + lib.rstrip('.lib')
        libs1.append(lib)
    libs1.append('-lc')   #linux下两个默认库
    libs1.append('-ldl')
    option.libs = ' '.join(libs1)
    print option.libs
    print '..................'
    
    compileLine = option.preDefines + ' -c -g -pthread -fPIC ' + option.incDirs
    print compileLine
    
    #创建目标目录
    print option.srcfiles
    cppfiles = []
    objfiles = []
    if False == os.access('obj', os.F_OK):
        os.mkdir('obj')
    else:
        #判断cpp文件的时间戳与.o文件的时间戳
        for srcfile in option.srcfiles:
            objfile = 'obj/' + srcfile.rstrip('.cpp').lstrip('./') + '.o'
            if os.stat(srcfile).st_mtime >= os.stat(objfile).st_mtime:
                cppfiles.append(srcfile)
            else:
                objfiles.append(objfile)
        
    
    print cppfiles
    for srcfile in cppfiles:
        objfile = 'obj/' + srcfile.rstrip('.cpp').lstrip('./') + '.o'
        target = objfile + ' ' + srcfile
        objfiles.append(objfile)
        cl = 'g++ -o ' + target + ' ' + compileLine
        print cl
        os.system(cl)
        
    objs = ' '.join(objfiles)
    link = 'g++ -g -pthread -fPIC -o ' + option.outFile + ' ' + objs + ' ' + option.libDirs + ' ' + option.libs
    print link
    os.system(link)
分享到:
评论

相关推荐

    vcproj转dsw工具

    它能够读取`.vcproj`文件,并将其内容转换为`.dsw`和相应的`.dsp`文件,以便于在Visual Studio 6.0环境中打开和编译。转换过程中,工具会尽可能地保留原始的编译设置、依赖关系和工程结构。 使用这个工具时,需要...

    发掘Scons——替代Make的Python工具

    SCons是一款开源的软件构建工具,它以Python编程语言为基础,旨在替代传统的Make工具,并集成了类似autoconf/automake的功能以及编译器缓存特性,如ccache。它的核心优势在于提供了一种更简单、更可靠且更快的构建...

    x264在linux以及windows下的编译步骤

    - Windows环境下,如果你使用Visual Studio,也可以通过修改项目文件(`.vcproj`或`.sln`)来编译x264,但配置步骤会有所不同。 在实际操作中,根据你的具体环境可能需要微调上述步骤,但基本流程是一致的。请仔细...

    vcprojtomakefile

    【VCproj转换成Makefile文件】是一个重要的编程工具,它主要功能是将Microsoft Visual Studio的项目文件(.vcproj)转换为Unix/Linux平台常用的Makefile。这个工具使得开发者能够在跨平台的开发环境中更加便捷地管理...

    vcproj_into_dsw.rar_.dsw.vcpr_vcpr_vcproj_vcproj_into_d_vcproj_i

    3. `prjconverter`: 这可能是已经编译好的可执行文件,用户可以直接运行它来进行`.vcproj`到`.dsw`的转换,无需编译源代码。 在使用这个工具时,用户可能需要按照以下步骤操作: 1. 解压缩`prjconverter_src.zip`...

    将VC工程文件转换为MAKE文件的一个工具

    "将VC工程文件转换为MAKE文件的一个工具",比如`sln2mak`,工作原理通常是读取.sln和.vcproj文件,解析其中的项目和配置信息,然后生成相应的Makefile规则。这个过程可能涉及以下步骤: 1. 解析.sln文件:识别各个...

    Python调用c代码vs2005工程

    本案例主要探讨如何使用Python调用C代码,并结合Visual Studio 2005(VS2005)创建的工程来编译生成动态链接库(DLL)或Python的扩展模块(pyd文件),供Python调用。 首先,我们需要了解Python的C API,它是Python...

    纯C++方式生成复杂格式的excel文件(linux下可运行)

    generate_excel.vcproj为在vs2005下的工程文件,如果需要在vc6或Linux等其他编译环境下使用只需新建工程将.h文件和.cpp文件导入即可编译。 generate_excel |------include | |----gen_excel_file.h | |----input_...

    vs2005工程转换成vc6.0工程的小工具(vcproj->dsw包含源代码)

    这个小工具的主要功能是将VS2005的项目文件(.vcproj)转换为VC6.0的项目工作区文件(.dsw),使得在旧版IDE中也能打开和编译原本在VS2005中的工程。转换过程中,工具会处理源代码文件的路径、编译设置、链接器选项...

    Qt工程的几种编译方法.pdf

    使用 Qt Creator 或 qmake 工具,可以直接编译并生成可执行文件。 法二:使用 qmake 生成项目文件 如果没有 .pro 文件,可以使用 qmake 工具生成项目文件。下面是一个示例: 1. 打开 Qt 命令窗口,cd 进入 hello....

    VC工程转换工具

    然而,随着版本的迭代,不同版本的VC工程文件可能存在兼容性问题,使得在低版本的VC环境中无法直接打开和编译高版本创建的项目。为了应对这种问题,出现了专门的“VC工程转换工具”,如“VSProjectConverter”和...

    sumatrapdf VS08编译版本

    对于SumatraPDF VS2008编译版本,这意味着源代码可能是在Visual Studio 2008环境下用C++语言编写的,然后通过该IDE的编译工具链生成了最终的可执行文件。VS2008提供了对C++03标准的良好支持,并且拥有调试器、代码...

    VC工程文件转换QT工程文件(python脚本)

    从VS2008工程文件(.vcproj)中提取可用的QT工程文件信息,用于静态链接工程(lib),需要python解释环境运行。直接放在需要提取的工程文件文件夹下运行,在生成的RawPro文件夹中查看提取的QT工程文件信息。稍作修改...

    vs提取工程文件转Android.mk工具源码

    - 工具首先读取VS工程文件,解析其中的编译单位、链接器设置等信息。 - 解析后的数据结构化,映射到Android.mk的格式,如设置LOCAL_SRC_FILES为源代码列表,LOCAL_C_INCLUDES为头文件路径。 - 工具还需处理库依赖...

    sln2mak VC工程转换工具

    sln2mak工具能够帮助我们将Visual Studio的解决方案文件(.sln)和项目文件(.vcproj)转换成相应的MAKE文件,使得非Windows环境下的开发者也能顺利编译项目。 使用sln2mak工具的步骤大致如下: 1. **下载与安装**...

    读取excel的相关操作

    读取Excel文件通常需要借助第三方库,如`libxl`、`pandas`(Python中的库,但可以与C++结合使用)或者`Microsoft Office Interop`(适用于Windows环境)。在这里,由于没有具体的代码示例,我们将以`libxl`库为例,...

    编译配置工具cmake.rar

    CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。 通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。CMake自动生成的Makefile...

    VC6的完整编译工程与结果

    2. **项目文件**:.vcproj文件,记录了工程的配置信息,如源文件列表、编译选项等。 3. **解决方案文件**:.sln文件,管理多个项目之间的依赖关系,是VC6中的顶级组织单元。 4. **资源文件**:如.rc文件,用于定义...

    win10 vs2010 openssl库编译工具ActivePerl+nasm+strawberry

    7. **编译与安装**:接着,使用以下命令进行编译和安装: ``` msbuild all.vcproj /p:Configuration=Release nmake -f makefile.nmake install ``` 8. **验证安装**:安装完成后,你可以通过运行`openssl ...

Global site tag (gtag.js) - Google Analytics