From 41add82f1750e4c477b941cd076ad12e3a150a99 Mon Sep 17 00:00:00 2001 From: Emma Harper Smith Date: Wed, 4 Feb 2026 02:32:33 +0000 Subject: [PATCH 1/2] WIP test for new build system design --- Cargo.lock | 15 ++++++ Cargo.toml | 2 +- Makefile.pre.in | 3 +- Modules/_base64/Cargo.toml | 6 ++- Modules/_base64/build.rs | 5 ++ Modules/cpython-build-helper/Cargo.toml | 7 +++ Modules/cpython-build-helper/README.md | 4 ++ Modules/cpython-build-helper/src/lib.rs | 17 +++++++ Modules/cpython-rust-staticlib/Cargo.toml | 11 +++++ Modules/cpython-rust-staticlib/src/lib.rs | 1 + Modules/makesetup | 60 +++++++++++------------ configure | 43 +++++++++++----- configure.ac | 40 ++++++++++----- 13 files changed, 153 insertions(+), 61 deletions(-) create mode 100644 Modules/_base64/build.rs create mode 100644 Modules/cpython-build-helper/Cargo.toml create mode 100644 Modules/cpython-build-helper/README.md create mode 100644 Modules/cpython-build-helper/src/lib.rs create mode 100644 Modules/cpython-rust-staticlib/Cargo.toml create mode 100644 Modules/cpython-rust-staticlib/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index afc3744abd1cb6..b2080d8d0da80b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,6 +6,7 @@ version = 4 name = "_base64" version = "0.1.0" dependencies = [ + "cpython-build-helper", "cpython-sys", ] @@ -70,6 +71,20 @@ dependencies = [ "libloading", ] +[[package]] +name = "cpython-build-helper" +version = "0.1.0" +dependencies = [ + "shlex", +] + +[[package]] +name = "cpython-rust-staticlib" +version = "0.1.0" +dependencies = [ + "_base64", +] + [[package]] name = "cpython-sys" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 8b75182b7a596a..768d289fd77653 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "3" members = [ - "Modules/_base64", + "Modules/_base64", "Modules/cpython-build-helper", "Modules/cpython-rust-staticlib", "Modules/cpython-sys" ] diff --git a/Makefile.pre.in b/Makefile.pre.in index 10f299819cd40f..0f2553f1fcf737 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -178,7 +178,8 @@ CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(LDVERSION) SHLIB_SUFFIX= @SHLIB_SUFFIX@ EXT_SUFFIX= @EXT_SUFFIX@ LDSHARED= @LDSHARED@ $(PY_LDFLAGS) -BLDSHARED= @BLDSHARED@ $(PY_CORE_LDFLAGS) +BLDSHARED_EXE= @BLDSHARED_EXE@ +BLDSHARED_ARGS= @BLDSHARED_ARGS@ $(PY_CORE_LDFLAGS) LDCXXSHARED= @LDCXXSHARED@ $(PY_LDFLAGS) DESTSHARED= $(BINLIBDEST)/lib-dynload diff --git a/Modules/_base64/Cargo.toml b/Modules/_base64/Cargo.toml index 0810b787ab2773..f90350624729d6 100644 --- a/Modules/_base64/Cargo.toml +++ b/Modules/_base64/Cargo.toml @@ -6,6 +6,10 @@ edition = "2024" [dependencies] cpython-sys ={ path = "../cpython-sys" } +[build-dependencies] +cpython-build-helper = { path = "../cpython-build-helper" } + [lib] name = "_base64" -crate-type = ["staticlib"] +# For shared builds, we generate a c dynamic library. Static builds use the rlib +crate-type = ["cdylib", "rlib"] diff --git a/Modules/_base64/build.rs b/Modules/_base64/build.rs new file mode 100644 index 00000000000000..8cca32f8f8c3df --- /dev/null +++ b/Modules/_base64/build.rs @@ -0,0 +1,5 @@ +use cpython_build_helper::print_linker_args; + +fn main() { + print_linker_args(); +} diff --git a/Modules/cpython-build-helper/Cargo.toml b/Modules/cpython-build-helper/Cargo.toml new file mode 100644 index 00000000000000..1369020965012a --- /dev/null +++ b/Modules/cpython-build-helper/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "cpython-build-helper" +version = "0.1.0" +edition = "2024" + +[dependencies] +shlex = "1.3" diff --git a/Modules/cpython-build-helper/README.md b/Modules/cpython-build-helper/README.md new file mode 100644 index 00000000000000..f42946cfefc31c --- /dev/null +++ b/Modules/cpython-build-helper/README.md @@ -0,0 +1,4 @@ +# cpython-build-helper + +This crate is used in Rust modules `build.rs` files to help do common tasks such +as passing necessary link arguments. \ No newline at end of file diff --git a/Modules/cpython-build-helper/src/lib.rs b/Modules/cpython-build-helper/src/lib.rs new file mode 100644 index 00000000000000..f9fc5b2e77fc46 --- /dev/null +++ b/Modules/cpython-build-helper/src/lib.rs @@ -0,0 +1,17 @@ +use std::env; + +/// Print necessary link arguments for the library depending on the build +/// configuration (static or shared) +pub fn print_linker_args() { + let shared_build = env::var("RUST_SHARED_BUILD").expect("RUST_SHARED_BUILD not set in Makefile?"); + if shared_build == "1" { + let build_shared_args = + env::var("BLDSHARED_ARGS").expect("BLDSHARED_ARGS not set in Makefile?"); + // TODO(emmatyping): Ideally, we would not need to split the args here and take shlex + // as a dependency. + for arg in shlex::split(&build_shared_args).expect("Invalid BUILDSHARED_ARGS") { + println!("cargo:rustc-link-arg={}", arg); + } + } + // Static linker configuration is in cpython-rust-staticlib +} diff --git a/Modules/cpython-rust-staticlib/Cargo.toml b/Modules/cpython-rust-staticlib/Cargo.toml new file mode 100644 index 00000000000000..d7f52b0f3e9602 --- /dev/null +++ b/Modules/cpython-rust-staticlib/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "cpython-rust-staticlib" +version = "0.1.0" +edition = "2024" + +[dependencies] +_base64 ={ path = "../_base64" } + +[lib] +name = "cpython_rust_staticlib" +crate-type = ["staticlib"] diff --git a/Modules/cpython-rust-staticlib/src/lib.rs b/Modules/cpython-rust-staticlib/src/lib.rs new file mode 100644 index 00000000000000..a440707833f65d --- /dev/null +++ b/Modules/cpython-rust-staticlib/src/lib.rs @@ -0,0 +1 @@ +pub use _base64::PyInit__base64; diff --git a/Modules/makesetup b/Modules/makesetup index bd33c8fb2804c7..25b091cde689c1 100755 --- a/Modules/makesetup +++ b/Modules/makesetup @@ -232,7 +232,6 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | yes) continue;; esac objs='' - custom_ldflags='' if test "x$rust" = "x"; then for src in $srcs do @@ -272,6 +271,22 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | esac echo "$rule" >>$rulesf done + case $doconfig in + yes) OBJS="$OBJS $objs";; + esac + for mod in $mods + do + file="$srcdir/$mod\$(EXT_SUFFIX)" + case $doconfig in + no) + SHAREDMODS="$SHAREDMODS $file" + BUILT_SHARED="$BUILT_SHARED $mod" + ;; + esac + rule="$file: $objs \$(MODULE_${mods_upper}_LDEPS)" + rule="$rule; \$(BLDSHARED_EXE) \$(BLDSHARED_ARGS) $objs $libs \$(LIBPYTHON) -o $file" + echo "$rule" >>$rulesf + done else prefixed_srcs= for src in $srcs @@ -279,44 +294,25 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | prefixed_srcs="$prefixed_srcs $srcdir/$src" done objs= - # there's actually only one obj, so just set it to the lib - for lib in $libs - do - objs="target/\$(if \$(CARGO_TARGET),\$(CARGO_TARGET)/\$(CARGO_TARGET_DIR),\$(CARGO_TARGET_DIR))/$lib" - done libs= - # depends on the headers through cpython-sys - rule="$objs: cpython-sys \$(srcdir)/Cargo.toml \$(srcdir)/Cargo.lock \$(srcdir)/$srcdir/$manifest $prefixed_srcs \$(PYTHON_HEADERS)" - rule="$rule; CARGO_TARGET_DIR=\$(abs_builddir)/target PYTHON_BUILD_DIR=\$(abs_builddir) \$(CARGO_HOME)/bin/cargo build --lib --locked --package ${mods} --profile \$(CARGO_PROFILE) \$(if \$(CARGO_TARGET),--target=\$(CARGO_TARGET)) --manifest-path \$(srcdir)/Cargo.toml" - echo "$rule" >>$rulesf + for mod in $mods do - case $UNAME_SYSTEM in - Darwin*) - custom_ldflags="$custom_ldflags -Wl,-u,_PyInit_$mod" - ;; - *) - custom_ldflags="$custom_ldflags -Wl,--defsym=PyInit_$mod=PyInit_$mod" + rust_shared="target/\$(if \$(CARGO_TARGET),\$(CARGO_TARGET)/\$(CARGO_TARGET_DIR),\$(CARGO_TARGET_DIR))/lib$mod\$(SHLIB_SUFFIX)" + file="$srcdir/$mod\$(EXT_SUFFIX)" + case $doconfig in + no) + SHAREDMODS="$SHAREDMODS $file" + BUILT_SHARED="$BUILT_SHARED $mod" ;; esac + # depends on the headers through cpython-sys + rule="$rust_shared: cpython-sys \$(srcdir)/Cargo.toml \$(srcdir)/Cargo.lock \$(srcdir)/$srcdir/$manifest $prefixed_srcs \$(PYTHON_HEADERS) \$(MODULE_${mods_upper}_LDEPS) \$(LIBRARY)" + rule="$rule; CARGO_TARGET_DIR=\$(abs_builddir)/target PYTHON_BUILD_DIR=\$(abs_builddir) RUST_SHARED_BUILD=\$(PY_ENABLE_SHARED) \$(CARGO_HOME)/bin/cargo build -vvv --lib --locked --package ${mod} --profile \$(CARGO_PROFILE) \$(if \$(CARGO_TARGET),--target=\$(CARGO_TARGET)) --manifest-path \$(srcdir)/Cargo.toml" + echo "$rule" >>$rulesf + echo "$file: $rust_shared; mv $rust_shared $file" >>$rulesf done fi - case $doconfig in - yes) OBJS="$OBJS $objs";; - esac - for mod in $mods - do - file="$srcdir/$mod\$(EXT_SUFFIX)" - case $doconfig in - no) - SHAREDMODS="$SHAREDMODS $file" - BUILT_SHARED="$BUILT_SHARED $mod" - ;; - esac - rule="$file: $objs \$(MODULE_${mods_upper}_LDEPS)" - rule="$rule; \$(BLDSHARED) $custom_ldflags $objs $libs \$(LIBPYTHON) -o $file" - echo "$rule" >>$rulesf - done done case $SHAREDMODS in diff --git a/configure b/configure index 5b09de36f9a0b8..911577c444b79c 100755 --- a/configure +++ b/configure @@ -908,7 +908,8 @@ SHLIBS CFLAGSFORSHARED LINKFORSHARED CCSHARED -BLDSHARED +BLDSHARED_ARGS +BLDSHARED_EXE LDCXXSHARED LDSHARED SHLIB_SUFFIX @@ -13503,6 +13504,7 @@ fi + # SHLIB_SUFFIX is the extension of shared libraries `(including the dot!) # -- usually .so, .sl on HP-UX, .dll on Cygwin { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the extension of shared libraries" >&5 @@ -13532,7 +13534,8 @@ if test -z "$LDSHARED" then case $ac_sys_system/$ac_sys_release in AIX*) - BLDSHARED="Modules/ld_so_aix \$(CC) -bI:Modules/python.exp" + BLDSHARED_EXE="Modules/ld_so_aix" + BLDSHARED_ARGS="\$(CC) -bI:Modules/python.exp" LDSHARED="\$(LIBPL)/ld_so_aix \$(CC) -bI:\$(LIBPL)/python.exp" ;; SunOS/5*) @@ -13556,7 +13559,8 @@ then LDCXXSHARED='$(CXX) -bundle' if test "$enable_framework" ; then # Link against the framework. All externals should be defined. - BLDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + BLDSHARED_EXE="$LDSHARED" + BLDSHARED_ARGS='$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LDCXXSHARED="$LDCXXSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' else @@ -13567,14 +13571,15 @@ then Darwin/1.4*|Darwin/5.*|Darwin/6.*) LDSHARED='$(CC) -bundle' LDCXXSHARED='$(CXX) -bundle' + BLDSHARED_EXE="$LDSHARED" if test "$enable_framework" ; then # Link against the framework. All externals should be defined. - BLDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + BLDSHARED_ARGS='$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LDCXXSHARED="$LDCXXSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' else # No framework, use the Python app as bundle-loader - BLDSHARED="$LDSHARED "'-bundle_loader $(BUILDPYTHON)' + BLDSHARED_ARGS='-bundle_loader $(BUILDPYTHON)' LDSHARED="$LDSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)' LDCXXSHARED="$LDCXXSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)' fi ;; @@ -13595,13 +13600,15 @@ then # building for OS X 10.3 and later LDSHARED='$(CC) -bundle -undefined dynamic_lookup' LDCXXSHARED='$(CXX) -bundle -undefined dynamic_lookup' - BLDSHARED="$LDSHARED" + BLDSHARED_EXE="$LDSHARED" + BLDSHARED_ARGS="" fi ;; iOS/*) LDSHARED='$(CC) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)' LDCXXSHARED='$(CXX) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)' - BLDSHARED="$LDSHARED" + BLDSHARED_EXE="$LDSHARED" + BLDSHARED_ARGS="" ;; Emscripten*|WASI*) LDSHARED='$(CC) -shared' @@ -13661,18 +13668,25 @@ fi;; fi if test "$enable_wasm_dynamic_linking" = "yes" -a "$ac_sys_system" = "Emscripten"; then - BLDSHARED='$(CC) -shared -sSIDE_MODULE=1' + BLDSHARED_EXE='$(CC) -shared' + BLDSHARED_ARGS='-sSIDE_MODULE=1' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LDSHARED" >&5 printf "%s\n" "$LDSHARED" >&6; } LDCXXSHARED=${LDCXXSHARED-$LDSHARED} -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking BLDSHARED flags" >&5 -printf %s "checking BLDSHARED flags... " >&6; } -BLDSHARED=${BLDSHARED-$LDSHARED} -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BLDSHARED" >&5 -printf "%s\n" "$BLDSHARED" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking BLDSHARED_EXE executable" >&5 +printf %s "checking BLDSHARED_EXE executable... " >&6; } +BLDSHARED_EXE=${BLDSHARED_EXE-$LDSHARED} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BLDSHARED_EXE" >&5 +printf "%s\n" "$BLDSHARED_EXE" >&6; } + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking BLDSHARED_ARGS flags" >&5 +printf %s "checking BLDSHARED_ARGS flags... " >&6; } +BLDSHARED_ARGS=${BLDSHARED_ARGS-} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BLDSHARED_ARGS" >&5 +printf "%s\n" "$BLDSHARED_ARGS" >&6; } # CCSHARED are the C *flags* used to create objects to go into a shared # library (module) -- this is only needed for a few systems @@ -16106,6 +16120,8 @@ else CARGO_PROFILE='dev' fi # Set CARGO_TARGET for cross-compilation + # TODO(emmatyping): derive this in platform-triplet.c and set the Rust triple + # higher up case "$host" in aarch64-apple-ios-simulator) CARGO_TARGET="aarch64-apple-ios-sim" @@ -36187,3 +36203,4 @@ if test "$ac_cv_header_stdatomic_h" != "yes"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Your compiler or platform does have a working C11 stdatomic.h. A future version of Python may require stdatomic.h." >&5 printf "%s\n" "$as_me: Your compiler or platform does have a working C11 stdatomic.h. A future version of Python may require stdatomic.h." >&6;} fi + diff --git a/configure.ac b/configure.ac index 1561c6f9b2e99f..852d7c83718d21 100644 --- a/configure.ac +++ b/configure.ac @@ -3379,7 +3379,8 @@ with_tsan="no" AC_SUBST([SHLIB_SUFFIX]) AC_SUBST([LDSHARED]) AC_SUBST([LDCXXSHARED]) -AC_SUBST([BLDSHARED]) +AC_SUBST([BLDSHARED_EXE]) +AC_SUBST([BLDSHARED_ARGS]) AC_SUBST([CCSHARED]) AC_SUBST([LINKFORSHARED]) @@ -3409,7 +3410,8 @@ if test -z "$LDSHARED" then case $ac_sys_system/$ac_sys_release in AIX*) - BLDSHARED="Modules/ld_so_aix \$(CC) -bI:Modules/python.exp" + BLDSHARED_EXE="Modules/ld_so_aix" + BLDSHARED_ARGS="\$(CC) -bI:Modules/python.exp" LDSHARED="\$(LIBPL)/ld_so_aix \$(CC) -bI:\$(LIBPL)/python.exp" ;; SunOS/5*) @@ -3433,7 +3435,8 @@ then LDCXXSHARED='$(CXX) -bundle' if test "$enable_framework" ; then # Link against the framework. All externals should be defined. - BLDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + BLDSHARED_EXE="$LDSHARED" + BLDSHARED_ARGS='$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LDCXXSHARED="$LDCXXSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' else @@ -3444,14 +3447,15 @@ then Darwin/1.4*|Darwin/5.*|Darwin/6.*) LDSHARED='$(CC) -bundle' LDCXXSHARED='$(CXX) -bundle' + BLDSHARED_EXE="$LDSHARED" if test "$enable_framework" ; then # Link against the framework. All externals should be defined. - BLDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + BLDSHARED_ARGS='$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LDCXXSHARED="$LDCXXSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' else # No framework, use the Python app as bundle-loader - BLDSHARED="$LDSHARED "'-bundle_loader $(BUILDPYTHON)' + BLDSHARED_ARGS='-bundle_loader $(BUILDPYTHON)' LDSHARED="$LDSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)' LDCXXSHARED="$LDCXXSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)' fi ;; @@ -3472,13 +3476,15 @@ then # building for OS X 10.3 and later LDSHARED='$(CC) -bundle -undefined dynamic_lookup' LDCXXSHARED='$(CXX) -bundle -undefined dynamic_lookup' - BLDSHARED="$LDSHARED" + BLDSHARED_EXE="$LDSHARED" + BLDSHARED_ARGS="" fi ;; iOS/*) LDSHARED='$(CC) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)' LDCXXSHARED='$(CXX) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)' - BLDSHARED="$LDSHARED" + BLDSHARED_EXE="$LDSHARED" + BLDSHARED_ARGS="" ;; Emscripten*|WASI*) LDSHARED='$(CC) -shared' @@ -3535,18 +3541,24 @@ then esac fi -dnl Emscripten's emconfigure sets LDSHARED. Set BLDSHARED outside the -dnl test -z $LDSHARED block to configure BLDSHARED for side module support. +dnl Emscripten's emconfigure sets LDSHARED. Set BLDSHARED_EXE and BLDSHARED_ARGS +dnl outside the test -z $LDSHARED block to configure BLDSHARED for side module +dnl support. if test "$enable_wasm_dynamic_linking" = "yes" -a "$ac_sys_system" = "Emscripten"; then - BLDSHARED='$(CC) -shared -sSIDE_MODULE=1' + BLDSHARED_EXE='$(CC) -shared' + BLDSHARED_ARGS='-sSIDE_MODULE=1' fi AC_MSG_RESULT([$LDSHARED]) LDCXXSHARED=${LDCXXSHARED-$LDSHARED} -AC_MSG_CHECKING([BLDSHARED flags]) -BLDSHARED=${BLDSHARED-$LDSHARED} -AC_MSG_RESULT([$BLDSHARED]) +AC_MSG_CHECKING([BLDSHARED_EXE executable]) +BLDSHARED_EXE=${BLDSHARED_EXE-$LDSHARED} +AC_MSG_RESULT([$BLDSHARED_EXE]) + +AC_MSG_CHECKING([BLDSHARED_ARGS flags]) +BLDSHARED_ARGS=${BLDSHARED_ARGS-} +AC_MSG_RESULT([$BLDSHARED_ARGS]) # CCSHARED are the C *flags* used to create objects to go into a shared # library (module) -- this is only needed for a few systems @@ -4329,6 +4341,8 @@ else CARGO_PROFILE='dev' fi # Set CARGO_TARGET for cross-compilation + # TODO(emmatyping): derive this in platform-triplet.c and set the Rust triple + # higher up case "$host" in aarch64-apple-ios-simulator) CARGO_TARGET="aarch64-apple-ios-sim" From 363f9acf35461ae5e265608188b149e864eec875 Mon Sep 17 00:00:00 2001 From: Emma Harper Smith Date: Wed, 4 Feb 2026 05:15:23 +0000 Subject: [PATCH 2/2] Also pass whether or not the build is shared to cpython-sys --- Cargo.lock | 1 + Makefile.pre.in | 2 +- Modules/cpython-sys/Cargo.toml | 3 ++- Modules/cpython-sys/build.rs | 3 +++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b2080d8d0da80b..f6a41e2ba1b555 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -90,6 +90,7 @@ name = "cpython-sys" version = "0.1.0" dependencies = [ "bindgen", + "cpython-build-helper", ] [[package]] diff --git a/Makefile.pre.in b/Makefile.pre.in index 0f2553f1fcf737..d41e5c1c320aa6 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -3375,7 +3375,7 @@ Python/thread.o: @THREADHEADERS@ $(srcdir)/Python/condvar.h # Module dependencies and platform-specific files cpython-sys: Modules/cpython-sys/Cargo.toml Modules/cpython-sys/build.rs Modules/cpython-sys/wrapper.h Modules/cpython-sys/parser.h - CARGO_TARGET_DIR=$(abs_builddir)/target PYTHON_BUILD_DIR=$(abs_builddir) \$(CARGO_HOME)/bin/cargo build --lib --locked --package cpython-sys --profile $(CARGO_PROFILE) $(if $(CARGO_TARGET),--target=$(CARGO_TARGET)) --manifest-path $(srcdir)/Cargo.toml + CARGO_TARGET_DIR=$(abs_builddir)/target PYTHON_BUILD_DIR=$(abs_builddir) RUST_SHARED_BUILD=\$(PY_ENABLE_SHARED) \$(CARGO_HOME)/bin/cargo build --lib --locked --package cpython-sys --profile $(CARGO_PROFILE) $(if $(CARGO_TARGET),--target=$(CARGO_TARGET)) --manifest-path $(srcdir)/Cargo.toml # force rebuild when header file or module build flavor (static/shared) is changed MODULE_DEPS_STATIC=Modules/config.c diff --git a/Modules/cpython-sys/Cargo.toml b/Modules/cpython-sys/Cargo.toml index de0b88d5d5b723..f0e9b5bc888b79 100644 --- a/Modules/cpython-sys/Cargo.toml +++ b/Modules/cpython-sys/Cargo.toml @@ -6,4 +6,5 @@ edition = "2024" [dependencies] [build-dependencies] -bindgen = "0.72.1" \ No newline at end of file +bindgen = "0.72.1" +cpython-build-helper = { path = "../cpython-build-helper" } \ No newline at end of file diff --git a/Modules/cpython-sys/build.rs b/Modules/cpython-sys/build.rs index a681e498171675..ae71f9c0aebe4b 100644 --- a/Modules/cpython-sys/build.rs +++ b/Modules/cpython-sys/build.rs @@ -1,7 +1,10 @@ use std::env; use std::path::{Path, PathBuf}; +use cpython_build_helper::print_linker_args; + fn main() { + print_linker_args(); let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()); let srcdir = manifest_dir .parent()