Skip to content

Commit 7412dd7

Browse files
[GR-63253] Provide tools to build unchained language standalones.
PullRequest: graal/20383
2 parents 72849a6 + 49607cc commit 7412dd7

File tree

11 files changed

+1149
-122
lines changed

11 files changed

+1149
-122
lines changed

common.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"Jsonnet files should not include this file directly but use ci/common.jsonnet instead."
55
],
66

7-
"mx_version": "7.40.2",
7+
"mx_version": "7.45.0",
88

99
"COMMENT.jdks": "When adding or removing JDKs keep in sync with JDKs in ci/common.jsonnet",
1010
"jdks": {

espresso/mx.espresso/mx_espresso.py

+2-44
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,10 @@
3838
import mx_espresso_benchmarks # pylint: disable=unused-import
3939
import mx_sdk_vm
4040
import mx_sdk_vm_impl
41+
from mx_sdk_vm_ng import JavaHomeDependency
4142
from mx_gate import Task, add_gate_runner
4243
from mx_jackpot import jackpot
43-
from os.path import join, isabs, exists, dirname, relpath, basename
44+
from os.path import join, exists, dirname, relpath
4445
from import_order import verify_order, validate_format
4546

4647
_suite = mx.suite('espresso')
@@ -587,49 +588,6 @@ def register_espresso_runtime_resources(register_project, register_distribution,
587588
}))
588589

589590

590-
class JavaHomeDependency(mx.BaseLibrary):
591-
def __init__(self, suite, name, java_home):
592-
assert isabs(java_home)
593-
self.java_home = java_home
594-
release_dict = mx_sdk_vm.parse_release_file(join(java_home, 'release'))
595-
self.is_ee_implementor = release_dict.get('IMPLEMENTOR') == 'Oracle Corporation'
596-
self.version = mx.VersionSpec(release_dict.get('JAVA_VERSION'))
597-
self.major_version = self.version.parts[1] if self.version.parts[0] == 1 else self.version.parts[0]
598-
if self.is_ee_implementor:
599-
the_license = "Oracle Proprietary"
600-
else:
601-
the_license = "GPLv2-CPE"
602-
super().__init__(suite, name, optional=False, theLicense=the_license)
603-
self.deps = []
604-
605-
def is_available(self):
606-
return True
607-
608-
def getBuildTask(self, args):
609-
return mx.ArchivableBuildTask(self, args, 1)
610-
611-
def getResults(self):
612-
for root, _, files in os.walk(self.java_home):
613-
for name in files:
614-
yield join(root, name)
615-
616-
def getArchivableResults(self, use_relpath=True, single=False):
617-
if single:
618-
raise ValueError("single not supported")
619-
for path in self.getResults():
620-
if use_relpath:
621-
arcname = relpath(path, self.java_home)
622-
else:
623-
arcname = basename(path)
624-
yield path, arcname
625-
626-
def post_init(self):
627-
pass # help act like a distribution since this is registered as a distribution
628-
629-
def archived_deps(self):
630-
return [] # help act like a distribution since this is registered as a distribution
631-
632-
633591
class EspressoRuntimeResourceProject(mx.JavaProject):
634592
def __init__(self, suite, subDir, runtime_name, theLicense):
635593
name = f'com.oracle.truffle.espresso.resources.runtime'

sdk/mx.sdk/mx_sdk.py

+2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import mx_gate
4747
import mx_sdk_vm
4848
import mx_sdk_vm_impl
49+
import mx_sdk_vm_ng
4950
import pathlib
5051
import mx_sdk_benchmark # pylint: disable=unused-import
5152
import mx_sdk_clangformat # pylint: disable=unused-import
@@ -193,6 +194,7 @@ def upx(args):
193194

194195
def mx_register_dynamic_suite_constituents(register_project, register_distribution):
195196
mx_sdk_vm_impl.mx_register_dynamic_suite_constituents(register_project, register_distribution)
197+
mx_sdk_vm_ng.mx_register_dynamic_suite_constituents(register_project, register_distribution)
196198

197199

198200
def mx_post_parse_cmd_line(args):

sdk/mx.sdk/mx_sdk_vm_impl.py

+50-58
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@
6060
import textwrap
6161
import zipfile
6262

63+
import mx_sdk_vm_ng
64+
6365
try:
6466
# Use more secure defusedxml library, if available
6567
from defusedxml.ElementTree import parse as etreeParse
@@ -77,25 +79,8 @@
7779
import mx_util
7880

7981

80-
if sys.version_info[0] < 3:
81-
_unicode = unicode # pylint: disable=undefined-variable
82-
def _decode(x):
83-
return x
84-
def _encode(x):
85-
return x
86-
else:
87-
_unicode = str
88-
def _decode(x):
89-
return x.decode()
90-
def _encode(x):
91-
return x.encode()
92-
93-
9482
def unicode_utf8(string):
95-
if sys.version_info[0] < 3:
96-
if isinstance(string, str):
97-
return unicode(string, 'utf-8') # pylint: disable=undefined-variable
98-
elif isinstance(string, bytes):
83+
if isinstance(string, bytes):
9984
return str(string)
10085
return string
10186

@@ -479,7 +464,7 @@ def _patch_darwin_jdk():
479464
root.write(bio) # When porting to Python 3, we can use root.write(StringIO(), encoding="unicode")
480465
plist_src = {
481466
'source_type': 'string',
482-
'value': _decode(bio.getvalue()),
467+
'value': bio.getvalue().decode(),
483468
'ignore_value_subst': True
484469
}
485470
_incl_list.append((base_dir + '/Contents/Info.plist', plist_src))
@@ -1030,11 +1015,11 @@ def _get_graalvm_configuration(base_name, components=None, stage1=False):
10301015
mx.logv("No dist name for {}".format(components_sorted_set))
10311016
m = hashlib.sha1()
10321017
for component in components_sorted_set:
1033-
m.update(_encode(component))
1018+
m.update(component.encode())
10341019
if _jlink_libraries():
1035-
m.update(_encode("jlinked"))
1020+
m.update("jlinked".encode())
10361021
else:
1037-
m.update(_encode("not-jlinked"))
1022+
m.update("not-jlinked".encode())
10381023
short_sha1_digest = m.hexdigest()[:10] # to keep paths short
10391024
base_dir = '{base_name}_{hash}_java{jdk_version}'.format(base_name=base_name, hash=short_sha1_digest, jdk_version=_src_jdk_version)
10401025
name = '{base_dir}{stage_suffix}'.format(base_dir=base_dir, stage_suffix='_stage1' if stage1 else '')
@@ -3171,7 +3156,7 @@ def get_stage1_graalvm_distribution():
31713156
""":rtype: GraalVmLayoutDistribution"""
31723157
global _stage1_graalvm_distribution
31733158
if _stage1_graalvm_distribution == 'uninitialized':
3174-
_stage1_graalvm_distribution = GraalVmLayoutDistribution(_graalvm_base_name, stage1=True)
3159+
_stage1_graalvm_distribution = GraalVmLayoutDistribution(_graalvm_base_name, stage1=True, defaultBuild=False)
31753160
_stage1_graalvm_distribution.description = "GraalVM distribution (stage1)"
31763161
_stage1_graalvm_distribution.maven = False
31773162
return _stage1_graalvm_distribution
@@ -3534,10 +3519,10 @@ def register_main_dist(dist, label):
35343519
register_distribution(debuginfo_dist)
35353520
main_dists[label].append(debuginfo_dist.name)
35363521

3537-
_final_graalvm_distribution = get_final_graalvm_distribution()
3522+
final_graalvm_distribution = get_final_graalvm_distribution()
35383523

35393524
from mx_native import TargetSelection
3540-
for c in _final_graalvm_distribution.components:
3525+
for c in final_graalvm_distribution.components:
35413526
if c.extra_native_targets:
35423527
for t in c.extra_native_targets:
35433528
mx.logv(f"Selecting extra target '{t}' from GraalVM component '{c.short_name}'.")
@@ -3549,7 +3534,7 @@ def register_main_dist(dist, label):
35493534

35503535
names = set()
35513536
short_names = set()
3552-
needs_stage1 = False
3537+
needs_stage1 = mx_sdk_vm_ng.requires_native_image_stage1()
35533538
installables = {}
35543539
jvmci_parent_jars = []
35553540
modified_jmods = {}
@@ -3617,10 +3602,10 @@ def register_main_dist(dist, label):
36173602
register_project(native_image_resources_filelist_project)
36183603

36193604
# Register main distribution
3620-
register_main_dist(_final_graalvm_distribution, 'graalvm')
3605+
register_main_dist(final_graalvm_distribution, 'graalvm')
36213606

36223607
# Register standalones
3623-
needs_java_standalone_jimage = False
3608+
needs_java_standalone_jimage = mx_sdk_vm_ng.requires_standalone_jimage()
36243609
for components in installables.values():
36253610
main_component = _get_main_component(components)
36263611
svm_support = _get_svm_support()
@@ -3639,7 +3624,7 @@ def register_main_dist(dist, label):
36393624
mx.warn("Skipping JVM standalone of '{}' because it contains launcher configs that are not yet supported".format(main_component.name))
36403625
else:
36413626
needs_java_standalone_jimage = True
3642-
java_standalone = GraalVmStandaloneComponent(get_component(main_component.name, fatalIfMissing=True), _final_graalvm_distribution, is_jvm=True, defaultBuild=False)
3627+
java_standalone = GraalVmStandaloneComponent(get_component(main_component.name, fatalIfMissing=True), final_graalvm_distribution, is_jvm=True, defaultBuild=False)
36433628
register_main_dist(java_standalone, 'graalvm_standalones')
36443629

36453630
# Use `main_component.library_configs` rather than `_get_library_configs(main_component)` because we
@@ -3655,7 +3640,7 @@ def register_main_dist(dist, label):
36553640
only_native_launchers = not main_component.launcher_configs or has_svm_launcher(main_component)
36563641
only_native_libraries = not main_component.library_configs or (svm_support.is_supported() and not _has_skipped_libraries(main_component))
36573642
if only_native_launchers and only_native_libraries:
3658-
native_standalone = GraalVmStandaloneComponent(get_component(main_component.name, fatalIfMissing=True), _final_graalvm_distribution, is_jvm=False, defaultBuild=False)
3643+
native_standalone = GraalVmStandaloneComponent(get_component(main_component.name, fatalIfMissing=True), final_graalvm_distribution, is_jvm=False, defaultBuild=False)
36593644
register_main_dist(native_standalone, 'graalvm_standalones')
36603645

36613646
if needs_java_standalone_jimage:
@@ -3678,7 +3663,7 @@ def register_main_dist(dist, label):
36783663
suite=_suite,
36793664
name='java-standalone-jimage',
36803665
jimage_jars=sorted(java_standalone_jimage_jars),
3681-
jimage_ignore_jars=sorted(_final_graalvm_distribution.jimage_ignore_jars),
3666+
jimage_ignore_jars=sorted(final_graalvm_distribution.jimage_ignore_jars),
36823667
workingSets=None,
36833668
defaultBuild=False,
36843669
missing_export_target_action='warn',
@@ -3694,32 +3679,34 @@ def register_main_dist(dist, label):
36943679
else:
36953680
config_class = GraalVmMiscLauncher
36963681
for launcher_config in _get_launcher_configs(component):
3697-
register_project(config_class(component, launcher_config, stage1=True))
3698-
for component in registered_graalvm_components(stage1=False):
3699-
# native properties in the final distribution also need native properties in the stage1 distribution
3700-
for launcher_config in _get_launcher_configs(component):
3701-
register_project(GraalVmNativeProperties(component, launcher_config, stage1=True))
3702-
for library_config in _get_library_configs(component):
3703-
register_project(GraalVmNativeProperties(component, library_config, stage1=True))
3682+
register_project(config_class(component, launcher_config, stage1=True, defaultBuild=False))
3683+
if get_component('svm', stage1=True):
3684+
for component in registered_graalvm_components(stage1=False):
3685+
# native properties in the final distribution also need native properties in the stage1 distribution
3686+
for launcher_config in _get_launcher_configs(component):
3687+
register_project(GraalVmNativeProperties(component, launcher_config, stage1=True, defaultBuild=False))
3688+
for library_config in _get_library_configs(component):
3689+
register_project(GraalVmNativeProperties(component, library_config, stage1=True, defaultBuild=False))
37043690
register_distribution(get_stage1_graalvm_distribution())
37053691

37063692
if register_project:
37073693
if needs_stage1:
3708-
_stage1_graalvm_distribution = get_stage1_graalvm_distribution()
3709-
if _needs_stage1_jimage(_stage1_graalvm_distribution, _final_graalvm_distribution):
3694+
stage1_graalvm_distribution = get_stage1_graalvm_distribution()
3695+
if _needs_stage1_jimage(stage1_graalvm_distribution, final_graalvm_distribution):
37103696
register_project(GraalVmJImage(
37113697
suite=_suite,
37123698
name='graalvm-stage1-jimage',
3713-
jimage_jars=sorted(_stage1_graalvm_distribution.jimage_jars),
3714-
jimage_ignore_jars=sorted(_stage1_graalvm_distribution.jimage_ignore_jars),
3699+
jimage_jars=sorted(stage1_graalvm_distribution.jimage_jars),
3700+
jimage_ignore_jars=sorted(stage1_graalvm_distribution.jimage_ignore_jars),
37153701
workingSets=None,
37163702
default_to_jvmci=False, # decide depending on the included modules
3703+
defaultBuild=False,
37173704
))
37183705
final_jimage_project = GraalVmJImage(
37193706
suite=_suite,
37203707
name='graalvm-jimage',
3721-
jimage_jars=sorted(_final_graalvm_distribution.jimage_jars),
3722-
jimage_ignore_jars=sorted(_final_graalvm_distribution.jimage_ignore_jars),
3708+
jimage_jars=sorted(final_graalvm_distribution.jimage_jars),
3709+
jimage_ignore_jars=sorted(final_graalvm_distribution.jimage_ignore_jars),
37233710
workingSets=None,
37243711
default_to_jvmci=_get_libgraal_component() is not None,
37253712
)
@@ -4377,7 +4364,7 @@ def check_versions(jdk, expect_graalvm, check_jvmci):
43774364
mx.log_error(out.data)
43784365
mx.abort("'{}' is not a JVMCI-enabled JDK ('java -XX:+JVMCIPrintProperties' fails).\n{}.".format(jdk.home, check_env))
43794366

4380-
out = _decode(subprocess.check_output([jdk.java, '-version'], stderr=subprocess.STDOUT)).rstrip()
4367+
out = subprocess.check_output([jdk.java, '-version'], stderr=subprocess.STDOUT).decode().rstrip()
43814368

43824369
jdk_version = jdk.version
43834370
if os.environ.get('JDK_VERSION_CHECK', None) != 'ignore' and (jdk_version <= mx.VersionSpec('1.8') or mx.VersionSpec('9') <= jdk_version < mx.VersionSpec('11')):
@@ -4399,7 +4386,7 @@ def graalvm_vm_name(graalvm_dist, jdk):
43994386
:type jdk_home: str
44004387
:rtype str:
44014388
"""
4402-
out = _decode(subprocess.check_output([jdk.java, '-version'], stderr=subprocess.STDOUT)).rstrip()
4389+
out = subprocess.check_output([jdk.java, '-version'], stderr=subprocess.STDOUT).decode().rstrip()
44034390
match = re.search(r'^(?P<base_vm_name>[a-zA-Z() ]+64-Bit Server VM )', out.split('\n')[-1])
44044391
vm_name = match.group('base_vm_name') if match else ''
44054392
return vm_name + graalvm_vendor_version()
@@ -4592,15 +4579,16 @@ def _expand_native_images_list(only):
45924579
return only
45934580

45944581

4595-
def _force_bash_launchers(launcher):
4582+
def _force_bash_launchers(launcher, build_by_default=None):
45964583
"""
45974584
:type launcher: str | mx_sdk.LauncherConfig
45984585
"""
45994586
launcher_name = _get_launcher_name(launcher)
46004587

46014588
forced = _parse_cmd_arg('force_bash_launchers')
4602-
default = has_vm_suite() or forced is not None # for compatibility with legacy behavior
4603-
only = _parse_cmd_arg('native_images', default_value=str(default))
4589+
if build_by_default is None:
4590+
build_by_default = has_vm_suite() or forced is not None # for compatibility with legacy behavior
4591+
only = _parse_cmd_arg('native_images', default_value=str(build_by_default))
46044592
only = _expand_native_images_list(only)
46054593
if isinstance(only, bool):
46064594
included = only
@@ -4615,15 +4603,16 @@ def _force_bash_launchers(launcher):
46154603
return not included
46164604

46174605

4618-
def _skip_libraries(library):
4606+
def _skip_libraries(library, build_by_default=None):
46194607
"""
46204608
:type library: str | mx_sdk.LibraryConfig
46214609
"""
46224610
library_name = _get_library_name(library)
46234611

46244612
skipped = _parse_cmd_arg('skip_libraries')
4625-
default = has_vm_suite() or skipped is not None # for compatibility with legacy behavior
4626-
only = _parse_cmd_arg('native_images', default_value=str(default))
4613+
if build_by_default is None:
4614+
build_by_default = has_vm_suite() or skipped is not None # for compatibility with legacy behavior
4615+
only = _parse_cmd_arg('native_images', default_value=str(build_by_default))
46274616
only = _expand_native_images_list(only)
46284617
if isinstance(only, bool):
46294618
included = only
@@ -4765,12 +4754,15 @@ def _generate_debuginfo(image_config):
47654754
elif isinstance(generate_debuginfo, bool):
47664755
return generate_debuginfo
47674756
else:
4768-
destination = image_config.destination if isinstance(image_config, mx_sdk.AbstractNativeImageConfig) else image_config
4769-
if isinstance(image_config, mx_sdk.LauncherConfig):
4770-
name = basename(remove_exe_suffix(destination, require_suffix=False))
4771-
elif isinstance(image_config, mx_sdk.LibraryConfig):
4772-
name = remove_lib_prefix_suffix(basename(destination), require_suffix_prefix=False)
4773-
generate_debuginfo = [lib[4:] for lib in generate_debuginfo if lib.startswith('lib:')]
4757+
if isinstance(image_config, str):
4758+
name = image_config
4759+
else:
4760+
destination = image_config.destination if isinstance(image_config, mx_sdk.AbstractNativeImageConfig) else image_config
4761+
if isinstance(image_config, mx_sdk.LauncherConfig):
4762+
name = basename(remove_exe_suffix(destination, require_suffix=False))
4763+
elif isinstance(image_config, mx_sdk.LibraryConfig):
4764+
name = remove_lib_prefix_suffix(basename(destination), require_suffix_prefix=False)
4765+
generate_debuginfo = [lib[4:] for lib in generate_debuginfo if lib.startswith('lib:')]
47744766
return name in generate_debuginfo
47754767

47764768

0 commit comments

Comments
 (0)