From 58ce78dbbb98e95f20b64346d68229e720da6f1c Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Tue, 22 Jul 2025 12:37:55 +0200 Subject: [PATCH 1/3] gh-136976: Emscripten: Add _decimal and libmpdec --- Tools/wasm/emscripten/__main__.py | 60 +++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/Tools/wasm/emscripten/__main__.py b/Tools/wasm/emscripten/__main__.py index b25cbb01dedd31..dca61a40b0f154 100644 --- a/Tools/wasm/emscripten/__main__.py +++ b/Tools/wasm/emscripten/__main__.py @@ -8,6 +8,7 @@ import subprocess import sys import sysconfig +import hashlib import tempfile from urllib.request import urlopen from pathlib import Path @@ -164,20 +165,59 @@ def make_build_python(context, working_dir): print(f"🎉 {binary} {version}") -@subdir(HOST_BUILD_DIR, clean_ok=True) -def make_emscripten_libffi(context, working_dir): - shutil.rmtree(working_dir / "libffi-3.4.6", ignore_errors=True) +def check_shasum(file: str, expected_shasum: str): + with open(file, "rb") as f: + digest = hashlib.file_digest(f, "sha256") + if digest.hexdigest() != expected_shasum: + raise RuntimeError(f"Unexpected shasum for {file}") + + +def download_and_unpack(working_dir: Path, url: str, expected_shasum: str): with tempfile.NamedTemporaryFile(suffix=".tar.gz", delete_on_close=False) as tmp_file: - with urlopen( - "https://github.com/libffi/libffi/releases/download/v3.4.6/libffi-3.4.6.tar.gz" - ) as response: + with urlopen(url) as response: shutil.copyfileobj(response, tmp_file) tmp_file.close() + check_shasum(tmp_file.name, expected_shasum) shutil.unpack_archive(tmp_file.name, working_dir) + + +@subdir(HOST_BUILD_DIR, clean_ok=True) +def make_emscripten_libffi(context, working_dir): + ver = "3.4.6" + libffi_dir = working_dir / f"libffi-{ver}" + shutil.rmtree(libffi_dir, ignore_errors=True) + download_and_unpack(working_dir, f"https://github.com/libffi/libffi/releases/download/v{ver}/libffi-{ver}.tar.gz", "b0dea9df23c863a7a50e825440f3ebffabd65df1497108e5d437747843895a4e") call( [EMSCRIPTEN_DIR / "make_libffi.sh"], env=updated_env({"PREFIX": PREFIX_DIR}), - cwd=working_dir / "libffi-3.4.6", + cwd=libffi_dir, + quiet=context.quiet, + ) + + +@subdir(HOST_BUILD_DIR, clean_ok=True) +def make_mpdec(context, working_dir): + ver = "4.0.1" + mpdec_dir = working_dir / f"mpdecimal-{ver}" + shutil.rmtree(mpdec_dir, ignore_errors=True) + download_and_unpack(working_dir, f"https://www.bytereef.org/software/mpdecimal/releases/mpdecimal-{ver}.tar.gz", "96d33abb4bb0070c7be0fed4246cd38416188325f820468214471938545b1ac8") + call( + [ + "emconfigure", + mpdec_dir / "configure", + "--prefix", + PREFIX_DIR, + "--disable-shared", + ], + cwd=mpdec_dir, + quiet=context.quiet, + ) + call( + [ + "make", + "install" + ], + cwd=mpdec_dir, quiet=context.quiet, ) @@ -315,6 +355,7 @@ def build_all(context): configure_build_python, make_build_python, make_emscripten_libffi, + make_mpdec, configure_emscripten_python, make_emscripten_python, ] @@ -343,6 +384,9 @@ def main(): configure_build = subcommands.add_parser( "configure-build-python", help="Run `configure` for the " "build Python" ) + make_mpdec_cmd = subcommands.add_parser( + "make-mpdec", help="Clone libffi repo, configure and build it for emscripten" + ) make_libffi_cmd = subcommands.add_parser( "make-libffi", help="Clone libffi repo, configure and build it for emscripten" ) @@ -363,6 +407,7 @@ def main(): build, configure_build, make_libffi_cmd, + make_mpdec_cmd, make_build, configure_host, make_host, @@ -400,6 +445,7 @@ def main(): dispatch = { "make-libffi": make_emscripten_libffi, + "make-mpdec": make_mpdec, "configure-build-python": configure_build_python, "make-build-python": make_build_python, "configure-host": configure_emscripten_python, From d5eff2de8fe155d838191aa27f8089eba20a2141 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 23 Jul 2025 10:52:47 +0200 Subject: [PATCH 2/3] Compile mpdec with -fPIC --- Tools/wasm/emscripten/__main__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tools/wasm/emscripten/__main__.py b/Tools/wasm/emscripten/__main__.py index dca61a40b0f154..76e56e1f416f28 100644 --- a/Tools/wasm/emscripten/__main__.py +++ b/Tools/wasm/emscripten/__main__.py @@ -205,6 +205,7 @@ def make_mpdec(context, working_dir): [ "emconfigure", mpdec_dir / "configure", + "CFLAGS=-fPIC", "--prefix", PREFIX_DIR, "--disable-shared", From a9472aa4f393dd95ea57e37c15a1baa32f2f9602 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Thu, 24 Jul 2025 14:06:37 +0800 Subject: [PATCH 3/3] Correct help string for mpdec option. --- Tools/wasm/emscripten/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/wasm/emscripten/__main__.py b/Tools/wasm/emscripten/__main__.py index 76e56e1f416f28..202dd298199b56 100644 --- a/Tools/wasm/emscripten/__main__.py +++ b/Tools/wasm/emscripten/__main__.py @@ -386,7 +386,7 @@ def main(): "configure-build-python", help="Run `configure` for the " "build Python" ) make_mpdec_cmd = subcommands.add_parser( - "make-mpdec", help="Clone libffi repo, configure and build it for emscripten" + "make-mpdec", help="Clone mpdec repo, configure and build it for emscripten" ) make_libffi_cmd = subcommands.add_parser( "make-libffi", help="Clone libffi repo, configure and build it for emscripten" pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy