Skip to content

Commit 2744587

Browse files
committed
GraalPy standalone module falls back to older version of python-embedding artifact if the current version is not available
1 parent 7ec5f56 commit 2744587

File tree

1 file changed

+29
-16
lines changed
  • graalpython/lib-graalpython/modules/standalone

1 file changed

+29
-16
lines changed

graalpython/lib-graalpython/modules/standalone/__main__.py

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686

8787
MVN_REPOSITORY = os.getenv("MVN_REPOSITORY")
8888
MVN_GRAALPY_VERSION = os.getenv("MVN_GRAALPY_VERSION") if os.getenv("MVN_GRAALPY_VERSION") else __graalpython__.get_graalvm_version()
89+
LEGACY_EMBEDDING_VERSION = '24.2.2'
8990

9091
CMD_NATIVE_EXECUTABLE = "native"
9192
CMD_JAVA_PYTHON_APP = "polyglot_app"
@@ -139,8 +140,7 @@ def create_polyglot_app(parsed_args):
139140
exit(1)
140141

141142

142-
def get_download_dir(parsed_args):
143-
subdir = "downloaded_standalone_resources"
143+
def get_download_dir(parsed_args, subdir = "downloaded_standalone_resources"):
144144
mp = os.path.join(__graalpython__.home, subdir)
145145
try:
146146
if not os.path.exists(mp):
@@ -159,25 +159,28 @@ def get_download_dir(parsed_args):
159159

160160

161161
def create_native_exec(parsed_args):
162-
artifacts = ["org.graalvm.python.python-embedding"]
163-
164162
target_dir = tempfile.mkdtemp()
165163
try:
166164
ni, jc = get_tools(target_dir, parsed_args)
167165
if parsed_args.ce:
168-
artifacts.append("org.graalvm.polyglot.python-community")
166+
artifact = "org.graalvm.polyglot.python-community"
169167
else:
170-
artifacts.append("org.graalvm.polyglot.python")
168+
artifact = "org.graalvm.polyglot.python"
171169

172170
modules_path = get_download_dir(parsed_args)
173-
for artifact in artifacts:
174-
download_maven_artifact(modules_path, artifact, parsed_args)
171+
legacy_embedding_path = None
172+
if not download_maven_artifact(modules_path, "org.graalvm.python.python-embedding", parsed_args, version=MVN_GRAALPY_VERSION, fail_if_not_found=False):
173+
legacy_embedding_dir = get_download_dir(parsed_args, subdir='downloaded_standalone_resources_legacy')
174+
download_maven_artifact(legacy_embedding_dir, "org.graalvm.python.python-embedding", parsed_args, version=LEGACY_EMBEDDING_VERSION)
175+
legacy_embedding_path = os.path.join(legacy_embedding_dir, f"org.graalvm.python-python-embedding-{LEGACY_EMBEDDING_VERSION}.jar")
176+
177+
download_maven_artifact(modules_path, artifact, parsed_args, version=MVN_GRAALPY_VERSION)
175178

176179
launcher_file = os.path.join(target_dir, NATIVE_EXEC_LAUNCHER_FILE)
177180
create_target_directory(target_dir, launcher_file, parsed_args)
178181

179182
index_vfs(target_dir)
180-
build_binary(target_dir, ni, jc, modules_path, launcher_file, parsed_args)
183+
build_binary(target_dir, ni, jc, modules_path, legacy_embedding_path, launcher_file, parsed_args)
181184
finally:
182185
if not parsed_args.keep_temp:
183186
shutil.rmtree(target_dir)
@@ -368,16 +371,17 @@ def get_tools(target_dir, parsed_args):
368371
return ni, jc
369372

370373

371-
def download_maven_artifact(modules_path, artifact, parsed_args):
374+
def download_maven_artifact(modules_path, artifact, parsed_args, version=MVN_GRAALPY_VERSION, fail_if_not_found=True):
372375
mvnd = get_executable(os.path.join(__graalpython__.home, "libexec", "graalpy-polyglot-get"))
373376
cmd = [mvnd]
374377

375378
if MVN_REPOSITORY:
376379
cmd += ["-r", MVN_REPOSITORY]
377380
cmd += ["-a", artifact.rsplit(".", 1)[1]]
378381
cmd += ["-g", artifact.rsplit(".", 1)[0]]
379-
cmd += ["-v", MVN_GRAALPY_VERSION]
382+
cmd += ["-v", version]
380383
cmd += ["-o", modules_path]
384+
381385
if parsed_args.verbose:
382386
print(f"downloading graalpython maven artifacts: {' '.join(cmd)}")
383387

@@ -387,19 +391,28 @@ def download_maven_artifact(modules_path, artifact, parsed_args):
387391
p = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
388392

389393
if p.returncode != 0:
390-
if not parsed_args.verbose:
394+
if fail_if_not_found and not parsed_args.verbose:
391395
print(p.stdout.decode())
392396
print(p.stderr.decode())
393-
exit(1)
397+
if fail_if_not_found:
398+
exit(1)
399+
return False
400+
return True
394401

395402

396-
def build_binary(target_dir, ni, jc, modules_path, launcher_file, parsed_args):
403+
def build_binary(target_dir, ni, jc, modules_path, legacy_embedding_path, launcher_file, parsed_args):
397404
cwd = os.getcwd()
398405
output = os.path.abspath(parsed_args.output)
399406
os.chdir(target_dir)
400407

401408
try:
402-
cmd = [jc, "-cp", f"{modules_path}/*", launcher_file]
409+
legacy_embedding_cp = ''
410+
legacy_embedding_modules = []
411+
if legacy_embedding_path:
412+
legacy_embedding_cp = f"{os.pathsep}{legacy_embedding_path}"
413+
legacy_embedding_modules = [legacy_embedding_path]
414+
415+
cmd = [jc, "-cp", f"{modules_path}/*{legacy_embedding_cp}", launcher_file]
403416
if parsed_args.verbose:
404417
print(f"Compiling code for Python standalone entry point: {' '.join(cmd)}")
405418
p = subprocess.run(cmd, cwd=target_dir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
@@ -408,7 +421,7 @@ def build_binary(target_dir, ni, jc, modules_path, launcher_file, parsed_args):
408421
print(p.stderr.decode())
409422
exit(1)
410423

411-
ni_modules = os.pathsep.join([os.path.join(modules_path, f) for f in os.listdir(modules_path) if f.endswith(".jar")] + [target_dir])
424+
ni_modules = os.pathsep.join([os.path.join(modules_path, f) for f in os.listdir(modules_path) if f.endswith(".jar")] + legacy_embedding_modules + [target_dir])
412425
cmd = [ni, "-cp", ni_modules] + parsed_args.ni_args[:]
413426

414427
if parsed_args.Os:

0 commit comments

Comments
 (0)