#!/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)
用python写的linux编译工具,直接读取vcproj文件
很多时候,我们写代码,是在wndows下面用vc写的,但是又需要到linux系统或者其他unix系统上编译,还需要另外写makefile文件,很麻烦,下面这个工具,可以直接从vcproj中读取文件,生成编译命令进行编译。。。。不用再写烦人的makefile了。。。工具还不完善,后面有时间继续完善它。。。。
猜你喜欢
转载自sogo6.iteye.com/blog/1184188
今日推荐
周排行