用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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值