Mercurial > hg > truffle
comparison mx/commands.py @ 4269:ffd5ce8fc736
Moved IDE project configuration into mx.py.
Added capability for generating NetBeans project configurations.
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Wed, 11 Jan 2012 15:14:45 +0100 |
parents | 32b8274f52ad |
children | f8f262212aa4 |
comparison
equal
deleted
inserted
replaced
4258:8d2c14f722ac | 4269:ffd5ce8fc736 |
---|---|
24 # or visit www.oracle.com if you need additional information or have any | 24 # or visit www.oracle.com if you need additional information or have any |
25 # questions. | 25 # questions. |
26 # | 26 # |
27 # ---------------------------------------------------------------------------------------------------- | 27 # ---------------------------------------------------------------------------------------------------- |
28 | 28 |
29 import os, sys, shutil, StringIO, zipfile, tempfile, re, time, datetime, platform, subprocess | 29 import os, sys, shutil, zipfile, tempfile, re, time, datetime, platform, subprocess |
30 from os.path import join, exists, dirname, isdir, isabs, basename | 30 from os.path import join, exists, dirname, basename |
31 from argparse import ArgumentParser, REMAINDER | 31 from argparse import ArgumentParser, REMAINDER |
32 import mx | 32 import mx |
33 import sanitycheck | 33 import sanitycheck |
34 | 34 |
35 _graal_home = dirname(dirname(__file__)) | 35 _graal_home = dirname(dirname(__file__)) |
241 | 241 |
242 winSDK = mx.get_env('WIN_SDK', 'C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\') | 242 winSDK = mx.get_env('WIN_SDK', 'C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\') |
243 | 243 |
244 p = subprocess.Popen('cmd.exe /E:ON /V:ON /K ""' + winSDK + '/Bin/SetEnv.cmd" & echo ' + STARTTOKEN + '"', \ | 244 p = subprocess.Popen('cmd.exe /E:ON /V:ON /K ""' + winSDK + '/Bin/SetEnv.cmd" & echo ' + STARTTOKEN + '"', \ |
245 shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP) | 245 shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP) |
246 output = p.stdout | 246 stdout = p.stdout |
247 input = p.stdin | 247 stdin = p.stdin |
248 if logFile: | 248 if logFile: |
249 log = open(logFile, 'w') | 249 log = open(logFile, 'w') |
250 ret = False | 250 ret = False |
251 while True: | 251 while True: |
252 line = output.readline().decode() | 252 line = stdout.readline().decode() |
253 if logFile: | 253 if logFile: |
254 log.write(line) | 254 log.write(line) |
255 line = line.strip() | 255 line = line.strip() |
256 mx.log(line) | 256 mx.log(line) |
257 if line == STARTTOKEN: | 257 if line == STARTTOKEN: |
258 input.write('cd /D ' + workingDir + ' & ' + cmd + ' & echo ' + ENDTOKEN + newLine) | 258 stdin.write('cd /D ' + workingDir + ' & ' + cmd + ' & echo ' + ENDTOKEN + newLine) |
259 for regex in respondTo.keys(): | 259 for regex in respondTo.keys(): |
260 match = regex.search(line) | 260 match = regex.search(line) |
261 if match: | 261 if match: |
262 input.write(respondTo[regex] + newLine) | 262 stdin.write(respondTo[regex] + newLine) |
263 if findInOutput: | 263 if findInOutput: |
264 match = findInOutput.search(line) | 264 match = findInOutput.search(line) |
265 if match: | 265 if match: |
266 ret = True | 266 ret = True |
267 if line == ENDTOKEN: | 267 if line == ENDTOKEN: |
268 break | 268 break |
269 input.write('exit' + newLine) | 269 stdin.write('exit' + newLine) |
270 if logFile: | 270 if logFile: |
271 log.close() | 271 log.close() |
272 return ret | 272 return ret |
273 | 273 |
274 def build(args): | 274 def build(args): |
336 if mx.java().debug: | 336 if mx.java().debug: |
337 args = ['-Xdebug', '-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000'] + args | 337 args = ['-Xdebug', '-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000'] + args |
338 exe = join(_jdk(build), 'bin', mx.exe_suffix('java')) | 338 exe = join(_jdk(build), 'bin', mx.exe_suffix('java')) |
339 return mx.run([exe, vm] + args, nonZeroIsFatal=nonZeroIsFatal, out=out, err=err, cwd=cwd, timeout=timeout) | 339 return mx.run([exe, vm] + args, nonZeroIsFatal=nonZeroIsFatal, out=out, err=err, cwd=cwd, timeout=timeout) |
340 | 340 |
341 def ideinit(args): | |
342 """(re)generate Eclipse project configurations""" | |
343 | |
344 | |
345 def println(out, obj): | |
346 out.write(str(obj) + '\n') | |
347 | |
348 for p in mx.projects(): | |
349 if p.native: | |
350 continue | |
351 | |
352 if not exists(p.dir): | |
353 os.makedirs(p.dir) | |
354 | |
355 out = StringIO.StringIO() | |
356 | |
357 println(out, '<?xml version="1.0" encoding="UTF-8"?>') | |
358 println(out, '<classpath>') | |
359 for src in p.srcDirs: | |
360 srcDir = join(p.dir, src) | |
361 if not exists(srcDir): | |
362 os.mkdir(srcDir) | |
363 println(out, '\t<classpathentry kind="src" path="' + src + '"/>') | |
364 | |
365 # Every Java program depends on the JRE | |
366 println(out, '\t<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>') | |
367 | |
368 for dep in p.all_deps([], True): | |
369 if dep == p: | |
370 continue; | |
371 | |
372 if dep.isLibrary(): | |
373 if hasattr(dep, 'eclipse.container'): | |
374 println(out, '\t<classpathentry exported="true" kind="con" path="' + getattr(dep, 'eclipse.container') + '"/>') | |
375 elif hasattr(dep, 'eclipse.project'): | |
376 println(out, '\t<classpathentry combineaccessrules="false" exported="true" kind="src" path="/' + getattr(dep, 'eclipse.project') + '"/>') | |
377 else: | |
378 path = dep.path | |
379 if dep.mustExist: | |
380 dep.get_path(resolve=True) | |
381 if isabs(path): | |
382 println(out, '\t<classpathentry exported="true" kind="lib" path="' + path + '"/>') | |
383 else: | |
384 println(out, '\t<classpathentry exported="true" kind="lib" path="' + join(_graal_home, path) + '"/>') | |
385 else: | |
386 println(out, '\t<classpathentry combineaccessrules="false" exported="true" kind="src" path="/' + dep.name + '"/>') | |
387 | |
388 println(out, '\t<classpathentry kind="output" path="' + getattr(p, 'eclipse.output', 'bin') + '"/>') | |
389 println(out, '</classpath>') | |
390 mx.update_file(join(p.dir, '.classpath'), out.getvalue()) | |
391 out.close() | |
392 | |
393 csConfig = join(mx.project(p.checkstyleProj).dir, '.checkstyle_checks.xml') | |
394 if exists(csConfig): | |
395 out = StringIO.StringIO() | |
396 | |
397 dotCheckstyle = join(p.dir, ".checkstyle") | |
398 checkstyleConfigPath = '/' + p.checkstyleProj + '/.checkstyle_checks.xml' | |
399 println(out, '<?xml version="1.0" encoding="UTF-8"?>') | |
400 println(out, '<fileset-config file-format-version="1.2.0" simple-config="true">') | |
401 println(out, '\t<local-check-config name="Graal Checks" location="' + checkstyleConfigPath + '" type="project" description="">') | |
402 println(out, '\t\t<additional-data name="protect-config-file" value="false"/>') | |
403 println(out, '\t</local-check-config>') | |
404 println(out, '\t<fileset name="all" enabled="true" check-config-name="Graal Checks" local="true">') | |
405 println(out, '\t\t<file-match-pattern match-pattern="." include-pattern="true"/>') | |
406 println(out, '\t</fileset>') | |
407 println(out, '\t<filter name="FileTypesFilter" enabled="true">') | |
408 println(out, '\t\t<filter-data value="java"/>') | |
409 println(out, '\t</filter>') | |
410 | |
411 exclude = join(p.dir, '.checkstyle.exclude') | |
412 if exists(exclude): | |
413 println(out, '\t<filter name="FilesFromPackage" enabled="true">') | |
414 with open(exclude) as f: | |
415 for line in f: | |
416 if not line.startswith('#'): | |
417 line = line.strip() | |
418 exclDir = join(p.dir, line) | |
419 assert isdir(exclDir), 'excluded source directory listed in ' + exclude + ' does not exist or is not a directory: ' + exclDir | |
420 println(out, '\t\t<filter-data value="' + line + '"/>') | |
421 println(out, '\t</filter>') | |
422 | |
423 println(out, '</fileset-config>') | |
424 mx.update_file(dotCheckstyle, out.getvalue()) | |
425 out.close() | |
426 | |
427 | |
428 out = StringIO.StringIO() | |
429 | |
430 println(out, '<?xml version="1.0" encoding="UTF-8"?>') | |
431 println(out, '<projectDescription>') | |
432 println(out, '\t<name>' + p.name + '</name>') | |
433 println(out, '\t<comment></comment>') | |
434 println(out, '\t<projects>') | |
435 println(out, '\t</projects>') | |
436 println(out, '\t<buildSpec>') | |
437 println(out, '\t\t<buildCommand>') | |
438 println(out, '\t\t\t<name>org.eclipse.jdt.core.javabuilder</name>') | |
439 println(out, '\t\t\t<arguments>') | |
440 println(out, '\t\t\t</arguments>') | |
441 println(out, '\t\t</buildCommand>') | |
442 if exists(csConfig): | |
443 println(out, '\t\t<buildCommand>') | |
444 println(out, '\t\t\t<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>') | |
445 println(out, '\t\t\t<arguments>') | |
446 println(out, '\t\t\t</arguments>') | |
447 println(out, '\t\t</buildCommand>') | |
448 println(out, '\t</buildSpec>') | |
449 println(out, '\t<natures>') | |
450 println(out, '\t\t<nature>org.eclipse.jdt.core.javanature</nature>') | |
451 if exists(csConfig): | |
452 println(out, '\t\t<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>') | |
453 println(out, '\t</natures>') | |
454 println(out, '</projectDescription>') | |
455 mx.update_file(join(p.dir, '.project'), out.getvalue()) | |
456 out.close() | |
457 | |
458 out = StringIO.StringIO() | |
459 settingsDir = join(p.dir, ".settings") | |
460 if not exists(settingsDir): | |
461 os.mkdir(settingsDir) | |
462 | |
463 myDir = dirname(__file__) | |
464 | |
465 with open(join(myDir, 'org.eclipse.jdt.core.prefs')) as f: | |
466 content = f.read() | |
467 mx.update_file(join(settingsDir, 'org.eclipse.jdt.core.prefs'), content) | |
468 | |
469 with open(join(myDir, 'org.eclipse.jdt.ui.prefs')) as f: | |
470 content = f.read() | |
471 mx.update_file(join(settingsDir, 'org.eclipse.jdt.ui.prefs'), content) | |
472 | 341 |
473 # Table of unit tests. | 342 # Table of unit tests. |
474 # Keys are project names, values are package name lists. | 343 # Keys are project names, values are package name lists. |
475 # All source files in the given (project,package) pairs are scanned for lines | 344 # All source files in the given (project,package) pairs are scanned for lines |
476 # containing '@Test'. These are then detemrined to be the classes defining | 345 # containing '@Test'. These are then detemrined to be the classes defining |
630 'specjvm2008': [specjvm2008, ''], | 499 'specjvm2008': [specjvm2008, ''], |
631 'example': [example, '[-v] example names...'], | 500 'example': [example, '[-v] example names...'], |
632 'gate' : [gate, ''], | 501 'gate' : [gate, ''], |
633 'bench' : [bench, ''], | 502 'bench' : [bench, ''], |
634 'unittest' : [unittest, '[filters...]'], | 503 'unittest' : [unittest, '[filters...]'], |
635 'vm': [vm, '[-options] class [args...]'], | 504 'vm': [vm, '[-options] class [args...]'] |
636 'ideinit': [ideinit, ''] | |
637 } | 505 } |
638 | 506 |
639 if (_vmSourcesAvailable): | 507 if (_vmSourcesAvailable): |
640 mx.add_argument('--product', action='store_const', dest='vmbuild', const='product', help='select the product VM') | 508 mx.add_argument('--product', action='store_const', dest='vmbuild', const='product', help='select the product VM') |
641 mx.add_argument('--debug', action='store_const', dest='vmbuild', const='debug', help='select the debug VM') | 509 mx.add_argument('--debug', action='store_const', dest='vmbuild', const='debug', help='select the debug VM') |