Mercurial > hg > graal-jvmci-8
comparison mxtool/mx.py @ 22020:36a7ec14279d
moved unit test support from mx_graal.py to mx.py
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Thu, 18 Jun 2015 23:06:11 +0200 |
parents | 11ed27b2abe8 |
children | e942083c0fcc |
comparison
equal
deleted
inserted
replaced
22019:07cfd3d7072b | 22020:36a7ec14279d |
---|---|
31 Version 1.x supports a single suite of projects. | 31 Version 1.x supports a single suite of projects. |
32 | 32 |
33 Full documentation can be found at https://wiki.openjdk.java.net/display/Graal/The+mx+Tool | 33 Full documentation can be found at https://wiki.openjdk.java.net/display/Graal/The+mx+Tool |
34 """ | 34 """ |
35 | 35 |
36 import sys, os, errno, time, subprocess, shlex, types, StringIO, zipfile, signal, xml.sax.saxutils, tempfile, fnmatch, platform | 36 import sys |
37 if __name__ == '__main__': | |
38 # Rename this module as 'mx' so it is not re-executed when imported by other modules. | |
39 sys.modules['mx'] = sys.modules.pop('__main__') | |
40 | |
41 import os, errno, time, subprocess, shlex, types, StringIO, zipfile, signal, xml.sax.saxutils, tempfile, platform | |
37 import textwrap | 42 import textwrap |
38 import socket | 43 import socket |
39 import tarfile | 44 import tarfile |
40 import hashlib | 45 import hashlib |
41 import xml.parsers.expat | 46 import xml.parsers.expat |
42 import shutil, re, xml.dom.minidom | 47 import shutil, re, xml.dom.minidom |
43 import pipes | 48 import pipes |
44 import difflib | 49 import difflib |
50 import mx_unittest | |
45 from collections import Callable | 51 from collections import Callable |
46 from threading import Thread | 52 from threading import Thread |
47 from argparse import ArgumentParser, REMAINDER | 53 from argparse import ArgumentParser, REMAINDER |
48 from os.path import join, basename, dirname, exists, getmtime, isabs, expandvars, isdir, isfile | 54 from os.path import join, basename, dirname, exists, getmtime, isabs, expandvars, isdir, isfile |
49 | 55 |
97 _libs = dict() | 103 _libs = dict() |
98 _jreLibs = dict() | 104 _jreLibs = dict() |
99 _dists = dict() | 105 _dists = dict() |
100 _suites = dict() | 106 _suites = dict() |
101 _annotationProcessors = None | 107 _annotationProcessors = None |
108 _mx_suite = None | |
102 _primary_suite_path = None | 109 _primary_suite_path = None |
103 _primary_suite = None | 110 _primary_suite = None |
104 _opts = None | 111 _opts = None |
105 _extra_java_homes = [] | 112 _extra_java_homes = [] |
106 _default_java_home = None | 113 _default_java_home = None |
1037 try: | 1044 try: |
1038 self.requiredMxVersion = VersionSpec(suiteDict['mxversion']) | 1045 self.requiredMxVersion = VersionSpec(suiteDict['mxversion']) |
1039 except AssertionError as ae: | 1046 except AssertionError as ae: |
1040 abort('Exception while parsing "mxversion" in project file: ' + str(ae)) | 1047 abort('Exception while parsing "mxversion" in project file: ' + str(ae)) |
1041 | 1048 |
1042 libsMap = suiteDict['libraries'] | 1049 libsMap = suiteDict.get('libraries', {}) |
1043 jreLibsMap = suiteDict['jrelibraries'] | 1050 jreLibsMap = suiteDict.get('jrelibraries', {}) |
1044 projsMap = suiteDict['projects'] | 1051 projsMap = suiteDict.get('projects', {}) |
1045 distsMap = suiteDict['distributions'] | 1052 distsMap = suiteDict.get('distributions', {}) |
1046 | 1053 |
1047 def pop_list(attrs, name, context): | 1054 def pop_list(attrs, name, context): |
1048 v = attrs.pop(name, None) | 1055 v = attrs.pop(name, None) |
1049 if not v: | 1056 if not v: |
1050 return [] | 1057 return [] |
1703 deps = [] | 1710 deps = [] |
1704 for p in projects: | 1711 for p in projects: |
1705 p.all_deps(deps, includeLibs=includeLibs, includeJreLibs=includeJreLibs, includeAnnotationProcessors=includeAnnotationProcessors) | 1712 p.all_deps(deps, includeLibs=includeLibs, includeJreLibs=includeJreLibs, includeAnnotationProcessors=includeAnnotationProcessors) |
1706 return deps | 1713 return deps |
1707 | 1714 |
1715 def extract_VM_args(args, useDoubleDash=False, allowClasspath=False): | |
1716 """ | |
1717 Partitions 'args' into a leading sequence of HotSpot VM options and the rest. If | |
1718 'useDoubleDash' then 'args' is partititioned by the first instance of "--". If | |
1719 not 'allowClasspath' then mx aborts if "-cp" or "-classpath" is in 'args'. | |
1720 | |
1721 """ | |
1722 for i in range(len(args)): | |
1723 if useDoubleDash: | |
1724 if args[i] == '--': | |
1725 vmArgs = args[:i] | |
1726 remainder = args[i + 1:] | |
1727 return vmArgs, remainder | |
1728 else: | |
1729 if not args[i].startswith('-'): | |
1730 if i != 0 and (args[i - 1] == '-cp' or args[i - 1] == '-classpath'): | |
1731 if not allowClasspath: | |
1732 abort('Cannot supply explicit class path option') | |
1733 else: | |
1734 continue | |
1735 vmArgs = args[:i] | |
1736 remainder = args[i:] | |
1737 return vmArgs, remainder | |
1738 return args, [] | |
1739 | |
1708 class ArgParser(ArgumentParser): | 1740 class ArgParser(ArgumentParser): |
1709 # Override parent to append the list of available commands | 1741 # Override parent to append the list of available commands |
1710 def format_help(self): | 1742 def format_help(self): |
1711 return ArgumentParser.format_help(self) + _format_commands() | 1743 return ArgumentParser.format_help(self) + _format_commands() |
1712 | 1744 |
2051 def _find_jdk_in_candidates(candidates, versionCheck, warn=False, source=None): | 2083 def _find_jdk_in_candidates(candidates, versionCheck, warn=False, source=None): |
2052 filtered = _filtered_jdk_configs(candidates, versionCheck, warn, source) | 2084 filtered = _filtered_jdk_configs(candidates, versionCheck, warn, source) |
2053 if filtered: | 2085 if filtered: |
2054 return filtered[0] | 2086 return filtered[0] |
2055 return None | 2087 return None |
2056 | |
2057 | 2088 |
2058 def run_java(args, nonZeroIsFatal=True, out=None, err=None, cwd=None, addDefaultArgs=True, javaConfig=None): | 2089 def run_java(args, nonZeroIsFatal=True, out=None, err=None, cwd=None, addDefaultArgs=True, javaConfig=None): |
2059 if not javaConfig: | 2090 if not javaConfig: |
2060 javaConfig = java() | 2091 javaConfig = java() |
2061 return run(javaConfig.format_cmd(args, addDefaultArgs), nonZeroIsFatal=nonZeroIsFatal, out=out, err=err, cwd=cwd) | 2092 return run(javaConfig.format_cmd(args, addDefaultArgs), nonZeroIsFatal=nonZeroIsFatal, out=out, err=err, cwd=cwd) |
5001 """find directories corresponding to deleted Java projects and delete them""" | 5032 """find directories corresponding to deleted Java projects and delete them""" |
5002 if not is_interactive(): | 5033 if not is_interactive(): |
5003 log('fsckprojects command must be run in an interactive shell') | 5034 log('fsckprojects command must be run in an interactive shell') |
5004 return | 5035 return |
5005 hg = HgConfig() | 5036 hg = HgConfig() |
5037 projectDirs = [p.dir for suite in suites() for p in suite.projects] | |
5038 distIdeDirs = [d.get_ide_project_dir() for suite in suites() for d in suite.dists if d.get_ide_project_dir() is not None] | |
5006 for suite in suites(True): | 5039 for suite in suites(True): |
5007 projectDirs = [p.dir for p in suite.projects] | |
5008 distIdeDirs = [d.get_ide_project_dir() for d in suite.dists if d.get_ide_project_dir() is not None] | |
5009 for dirpath, dirnames, files in os.walk(suite.dir): | 5040 for dirpath, dirnames, files in os.walk(suite.dir): |
5010 if dirpath == suite.dir: | 5041 if dirpath == suite.dir: |
5011 # no point in traversing .hg, lib, or .workspace | 5042 # no point in traversing .hg, lib, or .workspace |
5012 dirnames[:] = [d for d in dirnames if d not in ['.hg', 'lib', '.workspace']] | 5043 dirnames[:] = [d for d in dirnames if d not in ['.hg', 'lib', '.workspace']] |
5013 elif dirpath in projectDirs: | 5044 elif dirpath in projectDirs: |
5014 # don't traverse subdirs of an existing project in this suite | 5045 # don't traverse subdirs of an existing project |
5015 dirnames[:] = [] | 5046 dirnames[:] = [] |
5016 elif dirpath in distIdeDirs: | 5047 elif dirpath in distIdeDirs: |
5017 # don't traverse subdirs of an existing distributions in this suite | 5048 # don't traverse subdirs of an existing distribution |
5018 dirnames[:] = [] | 5049 dirnames[:] = [] |
5019 else: | 5050 else: |
5020 projectConfigFiles = frozenset(['.classpath', '.project', 'nbproject']) | 5051 projectConfigFiles = frozenset(['.classpath', '.project', 'nbproject']) |
5021 indicators = projectConfigFiles.intersection(files) | 5052 indicators = projectConfigFiles.intersection(files) |
5022 if len(indicators) != 0: | 5053 if len(indicators) != 0: |
5023 indicators = [os.path.relpath(join(dirpath, i), suite.dir) for i in indicators] | 5054 indicators = [os.path.relpath(join(dirpath, i), suite.dir) for i in indicators] |
5024 indicatorsInHg = hg.locate(suite.dir, indicators) | 5055 indicatorsInHg = hg.locate(suite.dir, indicators) |
5025 # Only proceed if there are indicator files that are not under HG | 5056 # Only proceed if there are indicator files that are not under HG |
5026 if len(indicators) > len(indicatorsInHg): | 5057 if len(indicators) > len(indicatorsInHg): |
5027 if not is_interactive() or ask_yes_no(dirpath + ' looks like a removed project -- delete it', 'n'): | 5058 if ask_yes_no(dirpath + ' looks like a removed project -- delete it', 'n'): |
5028 shutil.rmtree(dirpath) | 5059 shutil.rmtree(dirpath) |
5029 log('Deleted ' + dirpath) | 5060 log('Deleted ' + dirpath) |
5030 | 5061 |
5031 def javadoc(args, parser=None, docDir='javadoc', includeDeps=True, stdDoclet=True): | 5062 def javadoc(args, parser=None, docDir='javadoc', includeDeps=True, stdDoclet=True): |
5032 """generate javadoc for some/all Java projects""" | 5063 """generate javadoc for some/all Java projects""" |
5667 'javadoc': [javadoc, '[options]'], | 5698 'javadoc': [javadoc, '[options]'], |
5668 'site': [site, '[options]'], | 5699 'site': [site, '[options]'], |
5669 'netbeansinit': [netbeansinit, ''], | 5700 'netbeansinit': [netbeansinit, ''], |
5670 'suites': [show_suites, ''], | 5701 'suites': [show_suites, ''], |
5671 'projects': [show_projects, ''], | 5702 'projects': [show_projects, ''], |
5703 'unittest' : [mx_unittest.unittest, '[unittest options] [--] [VM options] [filters...]', mx_unittest.unittestHelpSuffix], | |
5672 } | 5704 } |
5673 | 5705 |
5674 _argParser = ArgParser() | 5706 _argParser = ArgParser() |
5675 | 5707 |
5676 def _suitename(mxDir): | 5708 def _suitename(mxDir): |
5725 return mxDir | 5757 return mxDir |
5726 # backwards compatibility: search from path of this file | 5758 # backwards compatibility: search from path of this file |
5727 return _findPrimarySuiteMxDirFrom(dirname(__file__)) | 5759 return _findPrimarySuiteMxDirFrom(dirname(__file__)) |
5728 | 5760 |
5729 def main(): | 5761 def main(): |
5762 mxMxDir = _is_suite_dir(dirname(__file__)) | |
5763 assert mxMxDir | |
5764 global _mx_suite | |
5765 _mx_suite = _loadSuite(mxMxDir) | |
5766 | |
5730 primarySuiteMxDir = _findPrimarySuiteMxDir() | 5767 primarySuiteMxDir = _findPrimarySuiteMxDir() |
5731 if primarySuiteMxDir: | 5768 if primarySuiteMxDir: |
5732 global _primary_suite | 5769 global _primary_suite |
5733 _primary_suite = _loadSuite(primarySuiteMxDir, True) | 5770 _primary_suite = _loadSuite(primarySuiteMxDir, True) |
5734 else: | 5771 else: |
5783 version = VersionSpec("1.0") | 5820 version = VersionSpec("1.0") |
5784 | 5821 |
5785 currentUmask = None | 5822 currentUmask = None |
5786 | 5823 |
5787 if __name__ == '__main__': | 5824 if __name__ == '__main__': |
5788 # rename this module as 'mx' so it is not imported twice by the commands.py modules | |
5789 sys.modules['mx'] = sys.modules.pop('__main__') | |
5790 | |
5791 # Capture the current umask since there's no way to query it without mutating it. | 5825 # Capture the current umask since there's no way to query it without mutating it. |
5792 currentUmask = os.umask(0) | 5826 currentUmask = os.umask(0) |
5793 os.umask(currentUmask) | 5827 os.umask(currentUmask) |
5794 | 5828 |
5795 main() | 5829 main() |