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.results 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 project = None 95 PATH = [] 96 INCLUDE = [] 97 LIB = [] 98
99 - def __init__(self, 100 installdir = None, 101 mode = "rebuild", 102 projectfile = None, 103 config = None, 104 useenv = False, 105 project = None, 106 INCLUDE = [], 107 LIB = [], 108 PATH = [], 109 **kwargs):
110 self.installdir = installdir 111 self.mode = mode 112 self.projectfile = projectfile 113 self.config = config 114 self.useenv = useenv 115 self.project = project 116 if len(INCLUDE) > 0: 117 self.INCLUDE = INCLUDE 118 self.useenv = True 119 if len(LIB) > 0: 120 self.LIB = LIB 121 self.useenv = True 122 if len(PATH) > 0: 123 self.PATH = PATH 124 # always upcall ! 125 ShellCommand.__init__(self, **kwargs) 126 self.addFactoryArguments( 127 installdir = installdir, 128 mode = mode, 129 projectfile = projectfile, 130 config = config, 131 useenv = useenv, 132 project = project, 133 INCLUDE = INCLUDE, 134 LIB = LIB, 135 PATH = PATH 136 )
137
138 - def setupProgress(self):
139 self.progressMetrics += ('projects', 'files', 'warnings',) 140 return ShellCommand.setupProgress(self)
141
142 - def setupLogfiles(self, cmd, logfiles):
143 logwarnings = self.addLog("warnings") 144 logerrors = self.addLog("errors") 145 self.logobserver = MSLogLineObserver(logwarnings, logerrors) 146 self.addLogObserver('stdio', self.logobserver) 147 ShellCommand.setupLogfiles(self, cmd, logfiles)
148 149
150 - def setupInstalldir(self):
151 if not self.installdir: 152 self.installdir = self.default_installdir
153
154 - def setupEnvironment(self, cmd):
155 ShellCommand.setupEnvironment(self, cmd) 156 if cmd.args['env'] is None: 157 cmd.args['env'] = {} 158 159 # setup the custom one, those one goes first 160 for path in self.PATH: 161 addEnvPath(cmd.args['env'], "PATH", path) 162 for path in self.INCLUDE: 163 addEnvPath(cmd.args['env'], "INCLUDE", path) 164 for path in self.LIB: 165 addEnvPath(cmd.args['env'], "LIB", path) 166 167 self.setupInstalldir()
168
169 - def describe(self, done=False):
170 description = ShellCommand.describe(self, done) 171 if done: 172 description.append('%d projects' % self.step_status.getStatistic('projects', 0)) 173 description.append('%d files' % self.step_status.getStatistic('files', 0)) 174 warnings = self.step_status.getStatistic('warnings', 0) 175 if warnings > 0: 176 description.append('%d warnings' % warnings) 177 errors = self.step_status.getStatistic('errors', 0) 178 if errors > 0: 179 description.append('%d errors' % errors) 180 return description
181
182 - def createSummary(self, log):
183 self.step_status.setStatistic('projects', self.logobserver.nbProjects) 184 self.step_status.setStatistic('files', self.logobserver.nbFiles) 185 self.step_status.setStatistic('warnings', self.logobserver.nbWarnings) 186 self.step_status.setStatistic('errors', self.logobserver.nbErrors)
187
188 - def evaluateCommand(self, cmd):
189 if cmd.rc != 0: 190 return FAILURE 191 if self.logobserver.nbErrors > 0: 192 return FAILURE 193 if self.logobserver.nbWarnings > 0: 194 return WARNINGS 195 else: 196 return SUCCESS
197
198 - def finished(self, result):
199 self.getLog("warnings").finish() 200 self.getLog("errors").finish() 201 ShellCommand.finished(self, result)
202
203 -class VC6(VisualStudio):
204 205 default_installdir = 'C:\\Program Files\\Microsoft Visual Studio' 206
207 - def __init__(self, **kwargs):
208 209 # always upcall ! 210 VisualStudio.__init__(self, **kwargs)
211
212 - def setupEnvironment(self, cmd):
213 VisualStudio.setupEnvironment(self, cmd) 214 215 # Root of Visual Developer Studio Common files. 216 VSCommonDir = self.installdir + '\\Common' 217 MSVCDir = self.installdir + '\\VC98' 218 MSDevDir = VSCommonDir + '\\msdev98' 219 220 addEnvPath(cmd.args['env'], "PATH", MSDevDir + '\\BIN') 221 addEnvPath(cmd.args['env'], "PATH", MSVCDir + '\\BIN') 222 addEnvPath(cmd.args['env'], "PATH", VSCommonDir + '\\TOOLS\\WINNT') 223 addEnvPath(cmd.args['env'], "PATH", VSCommonDir + '\\TOOLS') 224 225 addEnvPath(cmd.args['env'], "INCLUDE", MSVCDir + '\\INCLUDE') 226 addEnvPath(cmd.args['env'], "INCLUDE", MSVCDir + '\\ATL\\INCLUDE') 227 addEnvPath(cmd.args['env'], "INCLUDE", MSVCDir + '\\MFC\\INCLUDE') 228 229 addEnvPath(cmd.args['env'], "LIB", MSVCDir + '\\LIB') 230 addEnvPath(cmd.args['env'], "LIB", MSVCDir + '\\MFC\\LIB')
231
232 - def start(self):
233 command = ["msdev"] 234 command.append(self.projectfile) 235 command.append("/MAKE") 236 if self.project is not None: 237 command.append(self.project + " - " + self.config) 238 else: 239 command.append("ALL - " + self.config) 240 if self.mode == "rebuild": 241 command.append("/REBUILD") 242 else: 243 command.append("/BUILD") 244 if self.useenv: 245 command.append("/USEENV") 246 self.setCommand(command) 247 return VisualStudio.start(self)
248
249 -class VC7(VisualStudio):
250 default_installdir = 'C:\\Program Files\\Microsoft Visual Studio .NET 2003' 251
252 - def __init__(self, **kwargs):
253 254 # always upcall ! 255 VisualStudio.__init__(self, **kwargs)
256
257 - def setupEnvironment(self, cmd):
258 VisualStudio.setupEnvironment(self, cmd) 259 260 VSInstallDir = self.installdir + '\\Common7\\IDE' 261 VCInstallDir = self.installdir 262 MSVCDir = self.installdir + '\\VC7' 263 264 addEnvPath(cmd.args['env'], "PATH", VSInstallDir) 265 addEnvPath(cmd.args['env'], "PATH", MSVCDir + '\\BIN') 266 addEnvPath(cmd.args['env'], "PATH", VCInstallDir + '\\Common7\\Tools') 267 addEnvPath(cmd.args['env'], "PATH", VCInstallDir + '\\Common7\\Tools\\bin') 268 269 addEnvPath(cmd.args['env'], "INCLUDE", MSVCDir + '\\INCLUDE') 270 addEnvPath(cmd.args['env'], "INCLUDE", MSVCDir + '\\ATLMFC\\INCLUDE') 271 addEnvPath(cmd.args['env'], "INCLUDE", MSVCDir + '\\PlatformSDK\\include') 272 addEnvPath(cmd.args['env'], "INCLUDE", VCInstallDir + '\\SDK\\v1.1\\include') 273 274 addEnvPath(cmd.args['env'], "LIB", MSVCDir + '\\LIB') 275 addEnvPath(cmd.args['env'], "LIB", MSVCDir + '\\ATLMFC\\LIB') 276 addEnvPath(cmd.args['env'], "LIB", MSVCDir + '\\PlatformSDK\\lib') 277 addEnvPath(cmd.args['env'], "LIB", VCInstallDir + '\\SDK\\v1.1\\lib')
278
279 - def start(self):
280 command = ["devenv.com"] 281 command.append(self.projectfile) 282 if self.mode == "rebuild": 283 command.append("/Rebuild") 284 else: 285 command.append("/Build") 286 command.append(self.config) 287 if self.useenv: 288 command.append("/UseEnv") 289 if self.project is not None: 290 command.append("/Project") 291 command.append(self.project) 292 self.setCommand(command) 293 return VisualStudio.start(self)
294 295 #alias VC7 as VS2003 296 VS2003 = VC7 297
298 -class VC8(VC7):
299 300 # Our ones 301 arch = "x86" 302 default_installdir = 'C:\\Program Files\\Microsoft Visual Studio 8' 303
304 - def __init__(self, arch = "x86", **kwargs):
305 self.arch = arch 306 307 # always upcall ! 308 VisualStudio.__init__(self, **kwargs) 309 self.addFactoryArguments(arch = arch)
310
311 - def setupEnvironment(self, cmd):
312 VisualStudio.setupEnvironment(self, cmd) 313 314 VSInstallDir = self.installdir 315 VCInstallDir = self.installdir + '\\VC' 316 317 addEnvPath(cmd.args['env'], "PATH", VSInstallDir + '\\Common7\\IDE') 318 if self.arch == "x64": 319 addEnvPath(cmd.args['env'], "PATH", VCInstallDir + '\\BIN\\x86_amd64') 320 addEnvPath(cmd.args['env'], "PATH", VCInstallDir + '\\BIN') 321 addEnvPath(cmd.args['env'], "PATH", VSInstallDir + '\\Common7\\Tools') 322 addEnvPath(cmd.args['env'], "PATH", VSInstallDir + '\\Common7\\Tools\\bin') 323 addEnvPath(cmd.args['env'], "PATH", VCInstallDir + '\\PlatformSDK\\bin') 324 addEnvPath(cmd.args['env'], "PATH", VSInstallDir + '\\SDK\\v2.0\\bin') 325 addEnvPath(cmd.args['env'], "PATH", VCInstallDir + '\\VCPackages') 326 addEnvPath(cmd.args['env'], "PATH", r'${PATH}') 327 328 addEnvPath(cmd.args['env'], "INCLUDE", VCInstallDir + '\\INCLUDE') 329 addEnvPath(cmd.args['env'], "INCLUDE", VCInstallDir + '\\ATLMFC\\include') 330 addEnvPath(cmd.args['env'], "INCLUDE", VCInstallDir + '\\PlatformSDK\\include') 331 332 archsuffix = '' 333 if self.arch == "x64": 334 archsuffix = '\\amd64' 335 addEnvPath(cmd.args['env'], "LIB", VCInstallDir + '\\LIB' + archsuffix) 336 addEnvPath(cmd.args['env'], "LIB", VCInstallDir + '\\ATLMFC\\LIB' + archsuffix) 337 addEnvPath(cmd.args['env'], "LIB", VCInstallDir + '\\PlatformSDK\\lib' + archsuffix) 338 addEnvPath(cmd.args['env'], "LIB", VSInstallDir + '\\SDK\\v2.0\\lib' + archsuffix)
339 340 #alias VC8 as VS2005 341 VS2005 = VC8 342
343 -class VCExpress9(VC8):
344 - def start(self):
345 command = ["vcexpress"] 346 command.append(self.projectfile) 347 if self.mode == "rebuild": 348 command.append("/Rebuild") 349 else: 350 command.append("/Build") 351 command.append(self.config) 352 if self.useenv: 353 command.append("/UseEnv") 354 if self.project is not None: 355 command.append("/Project") 356 command.append(self.project) 357 self.setCommand(command) 358 return VisualStudio.start(self)
359 360 # Add first support for VC9 (Same as VC8, with a different installdir)
361 -class VC9(VC8):
362 default_installdir = 'C:\\Program Files\\Microsoft Visual Studio 9.0'
363 364 VS2008 = VC9 365 366 # VC10 doesn't looks like it needs extra stuff.
367 -class VC10(VC9):
368 default_installdir = 'C:\\Program Files\\Microsoft Visual Studio 10.0'
369 370 VS2010 = VC10 371