Package buildbot :: Package steps :: Module vstudio
[frames] | no frames]

Source Code for Module buildbot.steps.vstudio

  1  # This file is part of Buildbot.  Buildbot is free software: you can 
  2  # redistribute it and/or modify it under the terms of the GNU General Public 
  3  # License as published by the Free Software Foundation, version 2. 
  4  # 
  5  # This program is distributed in the hope that it will be useful, but WITHOUT 
  6  # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
  7  # FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more 
  8  # details. 
  9  # 
 10  # You should have received a copy of the GNU General Public License along with 
 11  # this program; if not, write to the Free Software Foundation, Inc., 51 
 12  # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 
 13  # 
 14  # Copyright Buildbot Team Members 
 15   
 16  # Visual studio steps 
 17   
 18  from buildbot.steps.shell import ShellCommand 
 19  from buildbot.process.buildstep import LogLineObserver 
 20  from buildbot.status.builder import SUCCESS, WARNINGS, FAILURE 
 21   
 22  import re 
 23   
 24    
25 -def addEnvPath(env, name, value):
26 """ concat a path for this name """ 27 try: 28 oldval = env[name] 29 if not oldval.endswith(';'): 30 oldval = oldval + ';' 31 except KeyError: 32 oldval = "" 33 if not value.endswith(';'): 34 value = value + ';' 35 env[name] = oldval + value
36
37 -class MSLogLineObserver(LogLineObserver):
38 39 _re_delimitor = re.compile(r'^(\d+>)?-{5}.+-{5}$') 40 _re_file = re.compile(r'^(\d+>)?[^ ]+\.(cpp|c)$') 41 _re_warning = re.compile(r' : warning [A-Z]+[0-9]+:') 42 _re_error = re.compile(r' error [A-Z]+[0-9]+\s?: ') 43 44 nbFiles = 0 45 nbProjects = 0 46 nbWarnings = 0 47 nbErrors = 0 48 49 logwarnings = None 50 logerrors = None 51
52 - def __init__(self, logwarnings, logerrors, **kwargs):
53 LogLineObserver.__init__(self, **kwargs) 54 self.logwarnings = logwarnings 55 self.logerrors = logerrors 56 self.stdoutParser.delimiter = "\r\n" 57 self.stderrParser.delimiter = "\r\n"
58
59 - def outLineReceived(self, line):
60 if self._re_delimitor.search(line): 61 self.nbProjects += 1 62 self.logwarnings.addStdout("%s\n" % line) 63 self.logerrors.addStdout("%s\n" % line) 64 self.step.setProgress('projects', self.nbProjects) 65 elif self._re_file.search(line): 66 self.nbFiles += 1 67 self.step.setProgress('files', self.nbFiles) 68 elif self._re_warning.search(line): 69 self.nbWarnings += 1 70 self.logwarnings.addStdout("%s\n" % line) 71 self.step.setProgress('warnings', self.nbWarnings) 72 elif self._re_error.search("%s\n" % line): 73 # error is no progres indication 74 self.nbErrors += 1 75 self.logerrors.addStderr("%s\n" % line)
76 77
78 -class VisualStudio(ShellCommand):
79 name = "compile" 80 description = "compiling" 81 descriptionDone = "compile" 82 83 logobserver = None 84 85 installdir = None 86 default_installdir = None 87 88 # One of build, or rebuild 89 mode = "rebuild" 90 91 projectfile = None 92 config = None 93 useenv = False 94 PATH = [] 95 INCLUDE = [] 96 LIB = [] 97
98 - def __init__(self, 99 installdir = None, 100 mode = "rebuild", 101 projectfile = None, 102 config = None, 103 useenv = False, 104 INCLUDE = [], 105 LIB = [], 106 PATH = [], 107 **kwargs):
108 self.installdir = installdir 109 self.mode = mode 110 self.projectfile = projectfile 111 self.config = config 112 self.useenv = useenv 113 if len(INCLUDE) > 0: 114 self.INCLUDE = INCLUDE 115 self.useenv = True 116 if len(LIB) > 0: 117 self.LIB = LIB 118 self.useenv = True 119 if len(PATH) > 0: 120 self.PATH = PATH 121 # always upcall ! 122 ShellCommand.__init__(self, **kwargs) 123 self.addFactoryArguments( 124 installdir = installdir, 125 mode = mode, 126 projectfile = projectfile, 127 config = config, 128 useenv = useenv, 129 INCLUDE = INCLUDE, 130 LIB = LIB, 131 PATH = PATH 132 )
133
134 - def setupProgress(self):
135 self.progressMetrics += ('projects', 'files', 'warnings',) 136 return ShellCommand.setupProgress(self)
137
138 - def setupLogfiles(self, cmd, logfiles):
139 logwarnings = self.addLog("warnings") 140 logerrors = self.addLog("errors") 141 self.logobserver = MSLogLineObserver(logwarnings, logerrors) 142 self.addLogObserver('stdio', self.logobserver) 143 ShellCommand.setupLogfiles(self, cmd, logfiles)
144 145
146 - def setupInstalldir(self):
147 if not self.installdir: 148 self.installdir = self.default_installdir
149
150 - def setupEnvironment(self, cmd):
151 ShellCommand.setupEnvironment(self, cmd) 152 if cmd.args['env'] is None: 153 cmd.args['env'] = {} 154 155 # setup the custom one, those one goes first 156 for path in self.PATH: 157 addEnvPath(cmd.args['env'], "PATH", path) 158 for path in self.INCLUDE: 159 addEnvPath(cmd.args['env'], "INCLUDE", path) 160 for path in self.LIB: 161 addEnvPath(cmd.args['env'], "LIB", path) 162 163 self.setupInstalldir()
164
165 - def describe(self, done=False):
166 description = ShellCommand.describe(self, done) 167 if done: 168 description.append('%d projects' % self.step_status.getStatistic('projects', 0)) 169 description.append('%d files' % self.step_status.getStatistic('files', 0)) 170 warnings = self.step_status.getStatistic('warnings', 0) 171 if warnings > 0: 172 description.append('%d warnings' % warnings) 173 errors = self.step_status.getStatistic('errors', 0) 174 if errors > 0: 175 description.append('%d errors' % errors) 176 return description
177
178 - def createSummary(self, log):
179 self.step_status.setStatistic('projects', self.logobserver.nbProjects) 180 self.step_status.setStatistic('files', self.logobserver.nbFiles) 181 self.step_status.setStatistic('warnings', self.logobserver.nbWarnings) 182 self.step_status.setStatistic('errors', self.logobserver.nbErrors)
183
184 - def evaluateCommand(self, cmd):
185 if self.logobserver.nbErrors > 0: 186 return FAILURE 187 if self.logobserver.nbWarnings > 0: 188 return WARNINGS 189 else: 190 return SUCCESS
191
192 - def finished(self, result):
193 self.getLog("warnings").finish() 194 self.getLog("errors").finish() 195 ShellCommand.finished(self, result)
196
197 -class VC6(VisualStudio):
198 199 default_installdir = 'C:\\Program Files\\Microsoft Visual Studio' 200
201 - def __init__(self, **kwargs):
202 203 # always upcall ! 204 VisualStudio.__init__(self, **kwargs)
205
206 - def setupEnvironment(self, cmd):
207 VisualStudio.setupEnvironment(self, cmd) 208 209 # Root of Visual Developer Studio Common files. 210 VSCommonDir = self.installdir + '\\Common' 211 MSVCDir = self.installdir + '\\VC98' 212 MSDevDir = VSCommonDir + '\\msdev98' 213 214 addEnvPath(cmd.args['env'], "PATH", MSDevDir + '\\BIN') 215 addEnvPath(cmd.args['env'], "PATH", MSVCDir + '\\BIN') 216 addEnvPath(cmd.args['env'], "PATH", VSCommonDir + '\\TOOLS\\WINNT') 217 addEnvPath(cmd.args['env'], "PATH", VSCommonDir + '\\TOOLS') 218 219 addEnvPath(cmd.args['env'], "INCLUDE", MSVCDir + '\\INCLUDE') 220 addEnvPath(cmd.args['env'], "INCLUDE", MSVCDir + '\\ATL\\INCLUDE') 221 addEnvPath(cmd.args['env'], "INCLUDE", MSVCDir + '\\MFC\\INCLUDE') 222 223 addEnvPath(cmd.args['env'], "LIB", MSVCDir + '\\LIB') 224 addEnvPath(cmd.args['env'], "LIB", MSVCDir + '\\MFC\\LIB')
225
226 - def start(self):
227 command = ["msdev"] 228 command.append(self.projectfile) 229 command.append("/MAKE") 230 command.append("ALL - " + self.config) 231 if self.mode == "rebuild": 232 command.append("/REBUILD") 233 else: 234 command.append("/BUILD") 235 if self.useenv: 236 command.append("/USEENV") 237 self.setCommand(command) 238 return VisualStudio.start(self)
239
240 -class VC7(VisualStudio):
241 default_installdir = 'C:\\Program Files\\Microsoft Visual Studio .NET 2003' 242
243 - def __init__(self, **kwargs):
244 245 # always upcall ! 246 VisualStudio.__init__(self, **kwargs)
247
248 - def setupEnvironment(self, cmd):
249 VisualStudio.setupEnvironment(self, cmd) 250 251 VSInstallDir = self.installdir + '\\Common7\\IDE' 252 VCInstallDir = self.installdir 253 MSVCDir = self.installdir + '\\VC7' 254 255 addEnvPath(cmd.args['env'], "PATH", VSInstallDir) 256 addEnvPath(cmd.args['env'], "PATH", MSVCDir + '\\BIN') 257 addEnvPath(cmd.args['env'], "PATH", VCInstallDir + '\\Common7\\Tools') 258 addEnvPath(cmd.args['env'], "PATH", VCInstallDir + '\\Common7\\Tools\\bin') 259 260 addEnvPath(cmd.args['env'], "INCLUDE", MSVCDir + '\\INCLUDE') 261 addEnvPath(cmd.args['env'], "INCLUDE", MSVCDir + '\\ATLMFC\\INCLUDE') 262 addEnvPath(cmd.args['env'], "INCLUDE", MSVCDir + '\\PlatformSDK\\include') 263 addEnvPath(cmd.args['env'], "INCLUDE", VCInstallDir + '\\SDK\\v1.1\\include') 264 265 addEnvPath(cmd.args['env'], "LIB", MSVCDir + '\\LIB') 266 addEnvPath(cmd.args['env'], "LIB", MSVCDir + '\\ATLMFC\\LIB') 267 addEnvPath(cmd.args['env'], "LIB", MSVCDir + '\\PlatformSDK\\lib') 268 addEnvPath(cmd.args['env'], "LIB", VCInstallDir + '\\SDK\\v1.1\\lib')
269
270 - def start(self):
271 command = ["devenv.com"] 272 command.append(self.projectfile) 273 if self.mode == "rebuild": 274 command.append("/Rebuild") 275 else: 276 command.append("/Build") 277 command.append(self.config) 278 if self.useenv: 279 command.append("/UseEnv") 280 self.setCommand(command) 281 return VisualStudio.start(self)
282 283 #alias VC7 as VS2003 284 VS2003 = VC7 285
286 -class VC8(VC7):
287 288 # Our ones 289 arch = "x86" 290 default_installdir = 'C:\\Program Files\\Microsoft Visual Studio 8' 291
292 - def __init__(self, arch = "x86", **kwargs):
293 self.arch = arch 294 295 # always upcall ! 296 VisualStudio.__init__(self, **kwargs) 297 self.addFactoryArguments(arch = arch)
298
299 - def setupEnvironment(self, cmd):
300 VisualStudio.setupEnvironment(self, cmd) 301 302 VSInstallDir = self.installdir 303 VCInstallDir = self.installdir + '\\VC' 304 305 addEnvPath(cmd.args['env'], "PATH", VSInstallDir + '\\Common7\\IDE') 306 if self.arch == "x64": 307 addEnvPath(cmd.args['env'], "PATH", VCInstallDir + '\\BIN\\x86_amd64') 308 addEnvPath(cmd.args['env'], "PATH", VCInstallDir + '\\BIN') 309 addEnvPath(cmd.args['env'], "PATH", VSInstallDir + '\\Common7\\Tools') 310 addEnvPath(cmd.args['env'], "PATH", VSInstallDir + '\\Common7\\Tools\\bin') 311 addEnvPath(cmd.args['env'], "PATH", VCInstallDir + '\\PlatformSDK\\bin') 312 addEnvPath(cmd.args['env'], "PATH", VSInstallDir + '\\SDK\\v2.0\\bin') 313 addEnvPath(cmd.args['env'], "PATH", VCInstallDir + '\\VCPackages') 314 addEnvPath(cmd.args['env'], "PATH", r'${PATH}') 315 316 addEnvPath(cmd.args['env'], "INCLUDE", VCInstallDir + '\\INCLUDE') 317 addEnvPath(cmd.args['env'], "INCLUDE", VCInstallDir + '\\ATLMFC\\include') 318 addEnvPath(cmd.args['env'], "INCLUDE", VCInstallDir + '\\PlatformSDK\\include') 319 320 archsuffix = '' 321 if self.arch == "x64": 322 archsuffix = '\\amd64' 323 addEnvPath(cmd.args['env'], "LIB", VCInstallDir + '\\LIB' + archsuffix) 324 addEnvPath(cmd.args['env'], "LIB", VCInstallDir + '\\ATLMFC\\LIB' + archsuffix) 325 addEnvPath(cmd.args['env'], "LIB", VCInstallDir + '\\PlatformSDK\\lib' + archsuffix) 326 addEnvPath(cmd.args['env'], "LIB", VSInstallDir + '\\SDK\\v2.0\\lib' + archsuffix)
327 328 #alias VC8 as VS2005 329 VS2005 = VC8 330
331 -class VCExpress9(VC8):
332 - def start(self):
333 command = ["vcexpress"] 334 command.append(self.projectfile) 335 if self.mode == "rebuild": 336 command.append("/Rebuild") 337 else: 338 command.append("/Build") 339 command.append(self.config) 340 if self.useenv: 341 command.append("/UseEnv") 342 self.setCommand(command) 343 return VisualStudio.start(self)
344 345 # Add first support for VC9 (Same as VC8, with a different installdir)
346 -class VC9(VC8):
347 default_installdir = 'C:\\Program Files\\Microsoft Visual Studio 9.0'
348 349 VS2008 = VC9 350 351 # VC10 doesn't looks like it needs extra stuff.
352 -class VC10(VC9):
353 default_installdir = 'C:\\Program Files\\Microsoft Visual Studio 10.0'
354 355 VS2010 = VC10 356