blob: 71f05095be222d40d500a18e3335d04fc30f576c [file] [log] [blame]
# -*- coding: utf-8
'''
Created on 2012-2-25
更新 VC2008 工程编译输出的临时文件路径
@author: cheng.tang
'''
import os,sys,re
from optparse import OptionParser
import xml.dom.minidom
class vcprojred:
XML_HEADER_RE = re.compile(r'<\?\s*xml\s*version=\"([0-9.]*)\"\s*encoding=\"(\w*)\"\s*\?>')
def __init__(self):
self.root_dir_ = None
self.proj_count_ = 0
def run(self,argv):
self._parse_opt(argv)
if isinstance(self.options.solutiondir,str):
soludir = self.options.solutiondir.decode('gbk')
else:
soludir = self.options.solutiondir
if isinstance(self.options.outputdir,str):
self.options.outputdir = self.options.outputdir.decode('gbk')
self._run_dir(soludir)
def error(self,msg,exitcode = 1):
print "Error: %s" % msg
if exitcode > 0:
sys.exit(exitcode)
def _run_dir(self,soludir):
soludir = os.path.realpath(soludir)
if not os.path.isdir(soludir):
self.error(u"解决方案路径不存在")
self._check_dir(soludir)
print u"处理工程[%d]个" % self.proj_count_
def _check_dir(self,projdir):
if os.path.basename(projdir) in ["..","."]:
return
files = os.listdir(projdir)
for item in files:
full_name = os.path.join(projdir,item)
if os.path.isdir(full_name):
self._check_dir(full_name)
elif os.path.isfile(full_name):
self._deal_proj(full_name)
else:
self.error(u"文件[%s]异常")
def _load_xml_file(self,filename):
xml = open(filename,'r')
lines = xml.readlines()
xml.close()
if len(lines) == 0:
return None
m = vcprojred.XML_HEADER_RE.search(lines[0])
encoding = 'gb2312'
if m:
encoding = m.group(2)
try:
l = re.compile(encoding).sub('utf-8',lines[0])
lines[0] = l
content = ''.join(lines).decode(encoding).encode('utf-8')
except Exception,ex:
self.error(u"格式错误,%s" % ex, 0)
content = None
return (content,encoding)
def _save_xml_file(self,filename,content,encoding):
new_file = filename + '.bak'
if os.path.exists(new_file):
os.unlink(new_file)
os.rename(filename, new_file)
new_content = content
with open(filename,'ab') as f:
f.write(new_content)
f.close()
def _deal_proj(self,projfile):
if isinstance(projfile,str):
projfile = projfile.decode('gbk')
file_name = os.path.basename(projfile)
exts = os.path.splitext(file_name)
if exts[-1] not in ['.vcproj']:
return None
# parse project
print u"处理工程 [%s]" % unicode(projfile)
prjdom = xml_encoding = None
try:
content,xml_encoding = self._load_xml_file(projfile)
prjdom = xml.dom.minidom.parseString(content)
except Exception,ex:
self.error(u'分析错误,[%s]%s' % (projfile,ex))
if not prjdom:
self.error(u'文件[%s]解析错误' % projfile,0)
return False
prj_nodes = prjdom.getElementsByTagName("VisualStudioProject")
if not prj_nodes:
return
configurations_nodes = prj_nodes[0].getElementsByTagName("Configurations")
if not configurations_nodes:
return
configuration_nodes = configurations_nodes[0].getElementsByTagName("Configuration")
if not configuration_nodes:
return
for config in configuration_nodes:
#print "Config[%s]" % config.getAttribute("Name")
config_name = config.getAttribute("Name")
intermediate_dir = config.getAttribute("IntermediateDirectory")
#print "Config[%s]dir[%s]" % (config_name,intermediate_dir)
new_path = "$(SolutionDir)%s\\$(ProjectName)\\$(ConfigurationName)" % self.options.outputdir
config.setAttribute("IntermediateDirectory",new_path)
self._save_xml_file(projfile, prjdom.toxml(xml_encoding), xml_encoding)
self.proj_count_ += 1
def _parse_opt(self,argv):
parser = OptionParser()
parser.add_option("-d","--destination",dest="solutiondir",type="string")
parser.add_option("-o","--output_name",dest="outputdir",type="string",default="build")
(options,args) = parser.parse_args()
self.options = options
self.args = args
if not self.options.solutiondir:
parser.error(u"未指定工程路径")
if __name__ == "__main__":
red = vcprojred()
red.run(sys.argv)