def intellij_read_sdks(): sdks = dict() if mx.is_linux() or mx.is_openbsd() or mx.is_sunos() or mx.is_windows(): xmlSdks = glob.glob(os.path.expanduser("~/.IdeaIC*/config/options/jdk.table.xml")) + \ glob.glob(os.path.expanduser("~/.IntelliJIdea*/config/options/jdk.table.xml")) + \ glob.glob(os.path.expanduser("~/.config/JetBrains/IdeaIC*/options/jdk.table.xml")) + \ glob.glob(os.path.expanduser("~/.config/JetBrains/IntelliJIdea*/options/jdk.table.xml")) elif mx.is_darwin(): xmlSdks = \ glob.glob(os.path.expanduser("~/Library/Application Support/JetBrains/IdeaIC*/options/jdk.table.xml")) + \ glob.glob(os.path.expanduser("~/Library/Application Support/JetBrains/IntelliJIdea*/options/jdk.table.xml")) + \ glob.glob(os.path.expanduser("~/Library/Preferences/IdeaIC*/options/jdk.table.xml")) + \ glob.glob(os.path.expanduser("~/Library/Preferences/IntelliJIdea*/options/jdk.table.xml")) else: mx.warn("Location of IntelliJ SDK definitions on {} is unknown".format(mx.get_os())) return sdks if len(xmlSdks) == 0: mx.warn("IntelliJ SDK definitions not found") return sdks verRE = re.compile(r'^.*[/\\]\.?(IntelliJIdea|IdeaIC)([^/\\]+)[/\\].*$') def verSort(path): match = verRE.match(path) return match.group(2) + (".a" if match.group(1) == "IntellijIC" else ".b") xmlSdks.sort(key=verSort) xmlSdk = xmlSdks[-1] # Pick the most recent IntelliJ version, preferring Ultimate over Community edition. mx.log("Using SDK definitions from {}".format(xmlSdk)) versionRegexes = {} versionRegexes[intellij_java_sdk_type] = re.compile(r'^java\s+version\s+"([^"]+)"$|^version\s+(.+)$|^([\d._]+)$') versionRegexes[intellij_python_sdk_type] = re.compile(r'^Python\s+(.+)$') # Examples: # truffleruby 19.2.0-dev-2b2a7f81, like ruby 2.6.2, Interpreted JVM [x86_64-linux] # ver.2.2.4p230 ( revision 53155) p230 versionRegexes[intellij_ruby_sdk_type] = re.compile(r'^\D*(\d[^ ,]+)') for sdk in etreeParse(xmlSdk).getroot().findall("component[@name='ProjectJdkTable']/jdk[@version='2']"): name = sdk.find("name").get("value") kind = sdk.find("type").get("value") home = realpath(os.path.expanduser(sdk.find("homePath").get("value").replace('$USER_HOME$', '~'))) if home.find('$APPLICATION_HOME_DIR$') != -1: # Don't know how to convert this into a real path so ignore it continue versionRE = versionRegexes.get(kind) if not versionRE or sdk.find("version") is None: # ignore unknown kinds continue match = versionRE.match(sdk.find("version").get("value")) if match: version = match.group(1) sdks[home] = {'name': name, 'type': kind, 'version': version} mx.logv("Found SDK {} with values {}".format(home, sdks[home])) else: mx.warn(u"Couldn't understand Java version specification \"{}\" for {} in {}".format(sdk.find("version").get("value"), home, xmlSdk)) return sdks
def _lib_versioned(arg): name, version = arg.split('.') if mx.is_darwin(): return "lib" + name + "." + version + ".dylib" elif mx.is_linux() or mx.is_openbsd() or mx.is_sunos(): return "lib" + name + ".so." + version elif mx.is_windows(): return name + ".dll" else: mx.abort('unsupported os')