Skip to content

Commit e40d3aa

Browse files
committed
Properly pass linker arguments and set up static library building
1 parent 363f9ac commit e40d3aa

File tree

8 files changed

+64
-25
lines changed

8 files changed

+64
-25
lines changed

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Makefile.pre.in

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ CARGO_HOME=@CARGO_HOME@
6262
CARGO_TARGET_DIR=@CARGO_TARGET_DIR@
6363
CARGO_PROFILE=@CARGO_PROFILE@
6464
CARGO_TARGET=@CARGO_TARGET@
65+
CARGO_TARGET_LINKER_ENV=@CARGO_TARGET_LINKER_ENV@
66+
RUST_STATICLIB_DEP=@RUST_STATICLIB_DEP@
6567

6668
GNULD= @GNULD@
6769

@@ -989,7 +991,7 @@ clinic-tests: check-clean-src $(srcdir)/Lib/test/clinic.test.c
989991
$(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py -f $(srcdir)/Lib/test/clinic.test.c
990992

991993
# Build the interpreter
992-
$(BUILDPYTHON): Programs/python.o $(LINK_PYTHON_DEPS)
994+
$(BUILDPYTHON): Programs/python.o $(LINK_PYTHON_DEPS) $(RUST_STATICLIB_DEP)
993995
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(LINK_PYTHON_OBJS) $(LIBS) $(MODLIBS) $(SYSLIBS)
994996

995997
platform: $(PYTHON_FOR_BUILD_DEPS) pybuilddir.txt
@@ -3375,7 +3377,12 @@ Python/thread.o: @THREADHEADERS@ $(srcdir)/Python/condvar.h
33753377
# Module dependencies and platform-specific files
33763378

33773379
cpython-sys: Modules/cpython-sys/Cargo.toml Modules/cpython-sys/build.rs Modules/cpython-sys/wrapper.h Modules/cpython-sys/parser.h
3378-
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
3380+
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
3381+
3382+
RUST_STATICLIB_A= target/$(if $(CARGO_TARGET),$(CARGO_TARGET)/$(CARGO_TARGET_DIR),$(CARGO_TARGET_DIR))/libcpython_rust_staticlib.a
3383+
3384+
cpython-rust-staticlib: cpython-sys
3385+
CARGO_TARGET_DIR=$(abs_builddir)/target PYTHON_BUILD_DIR=$(abs_builddir) $(CARGO_HOME)/bin/cargo build --lib --locked --package cpython-rust-staticlib --profile $(CARGO_PROFILE) $(if $(CARGO_TARGET),--target=$(CARGO_TARGET)) --manifest-path $(srcdir)/Cargo.toml
33793386

33803387
# force rebuild when header file or module build flavor (static/shared) is changed
33813388
MODULE_DEPS_STATIC=Modules/config.c

Modules/_base64/src/lib.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ impl Drop for BorrowedBuffer {
115115
/// # Safety
116116
/// `module` must be a valid pointer of PyObject representing the module.
117117
/// `args` must be a valid pointer to an array of valid PyObject pointers with length `nargs`.
118-
#[unsafe(no_mangle)]
119118
pub unsafe extern "C" fn standard_b64encode(
120119
_module: *mut PyObject,
121120
args: *mut *mut PyObject,
@@ -193,13 +192,11 @@ fn standard_b64encode_impl(source: &PyObject) -> Result<*mut PyObject, ()> {
193192
Ok(result)
194193
}
195194

196-
#[unsafe(no_mangle)]
197195
pub extern "C" fn _base64_clear(_obj: *mut PyObject) -> c_int {
198196
//TODO
199197
0
200198
}
201199

202-
#[unsafe(no_mangle)]
203200
pub extern "C" fn _base64_free(_o: *mut c_void) {
204201
//TODO
205202
}

Modules/cpython-sys/Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,4 @@ edition = "2024"
66
[dependencies]
77

88
[build-dependencies]
9-
bindgen = "0.72.1"
10-
cpython-build-helper = { path = "../cpython-build-helper" }
9+
bindgen = "0.72.1"

Modules/cpython-sys/build.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
use std::env;
22
use std::path::{Path, PathBuf};
33

4-
use cpython_build_helper::print_linker_args;
5-
64
fn main() {
7-
print_linker_args();
85
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
96
let srcdir = manifest_dir
107
.parent()

Modules/makesetup

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -296,22 +296,30 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
296296
objs=
297297
libs=
298298

299-
for mod in $mods
300-
do
301-
rust_shared="target/\$(if \$(CARGO_TARGET),\$(CARGO_TARGET)/\$(CARGO_TARGET_DIR),\$(CARGO_TARGET_DIR))/lib$mod\$(SHLIB_SUFFIX)"
302-
file="$srcdir/$mod\$(EXT_SUFFIX)"
303-
case $doconfig in
304-
no)
299+
case $doconfig in
300+
no)
301+
# Shared build: build each Rust module as a cdylib (.so)
302+
for mod in $mods
303+
do
304+
rust_shared="target/\$(if \$(CARGO_TARGET),\$(CARGO_TARGET)/\$(CARGO_TARGET_DIR),\$(CARGO_TARGET_DIR))/lib$mod\$(SHLIB_SUFFIX)"
305+
file="$srcdir/$mod\$(EXT_SUFFIX)"
305306
SHAREDMODS="$SHAREDMODS $file"
306307
BUILT_SHARED="$BUILT_SHARED $mod"
307-
;;
308-
esac
309-
# depends on the headers through cpython-sys
310-
rule="$rust_shared: cpython-sys \$(srcdir)/Cargo.toml \$(srcdir)/Cargo.lock \$(srcdir)/$srcdir/$manifest $prefixed_srcs \$(PYTHON_HEADERS) \$(MODULE_${mods_upper}_LDEPS) \$(LIBRARY)"
311-
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"
312-
echo "$rule" >>$rulesf
313-
echo "$file: $rust_shared; mv $rust_shared $file" >>$rulesf
314-
done
308+
# depends on the headers through cpython-sys
309+
rule="$rust_shared: cpython-sys \$(srcdir)/Cargo.toml \$(srcdir)/Cargo.lock \$(srcdir)/$srcdir/$manifest $prefixed_srcs \$(PYTHON_HEADERS) \$(MODULE_${mods_upper}_LDEPS) \$(LIBRARY)"
310+
rule="$rule; CARGO_TARGET_DIR=\$(abs_builddir)/target PYTHON_BUILD_DIR=\$(abs_builddir) RUST_SHARED_BUILD=\$(PY_ENABLE_SHARED) BLDSHARED_ARGS=\"\$(BLDSHARED_ARGS)\" \$(if \$(CARGO_TARGET_LINKER_ENV),\$(CARGO_TARGET_LINKER_ENV)=\$(CC)) \$(CARGO_HOME)/bin/cargo build -vvv --lib --locked --package ${mod} --profile \$(CARGO_PROFILE) \$(if \$(CARGO_TARGET),--target=\$(CARGO_TARGET)) --manifest-path \$(srcdir)/Cargo.toml"
311+
echo "$rule" >>$rulesf
312+
echo "$file: $rust_shared; mv $rust_shared $file" >>$rulesf
313+
done
314+
;;
315+
yes)
316+
# Static build: Rust modules are built as part of cpython-rust-staticlib.
317+
# The dependency on cpython-rust-staticlib is in Makefile.pre.in
318+
# (via RUST_STATICLIB_DEP on the BUILDPYTHON rule).
319+
rust_staticlib="target/\$(if \$(CARGO_TARGET),\$(CARGO_TARGET)/\$(CARGO_TARGET_DIR),\$(CARGO_TARGET_DIR))/libcpython_rust_staticlib.a"
320+
LIBS="$LIBS $rust_staticlib"
321+
;;
322+
esac
315323
fi
316324
done
317325

configure

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

configure.ac

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4364,10 +4364,18 @@ else
43644364
;;
43654365
esac
43664366
fi
4367+
dnl Compute the CARGO_TARGET_<triple>_LINKER env var name so we can
4368+
dnl tell Cargo which linker to use for the target platform.
4369+
if test -n "$CARGO_TARGET"; then
4370+
CARGO_TARGET_LINKER_ENV="CARGO_TARGET_$(echo "$CARGO_TARGET" | tr 'a-z-' 'A-Z_')_LINKER"
4371+
else
4372+
CARGO_TARGET_LINKER_ENV=""
4373+
fi
43674374
AC_SUBST([CARGO_HOME])
43684375
AC_SUBST([CARGO_TARGET_DIR])
43694376
AC_SUBST([CARGO_PROFILE])
43704377
AC_SUBST([CARGO_TARGET])
4378+
AC_SUBST([CARGO_TARGET_LINKER_ENV])
43714379

43724380

43734381
dnl detect sqlite3 from Emscripten emport
@@ -7882,6 +7890,15 @@ AS_CASE([$host_cpu],
78827890
)
78837891
AC_SUBST([MODULE_BUILDTYPE])
78847892

7893+
dnl Set RUST_STATICLIB_DEP to cpython-rust-staticlib when building Rust
7894+
dnl modules statically so that the python binary depends on it.
7895+
if test "$HAVE_CARGO" != "no" -a "$MODULE_BUILDTYPE" = "static"; then
7896+
RUST_STATICLIB_DEP=cpython-rust-staticlib
7897+
else
7898+
RUST_STATICLIB_DEP=
7899+
fi
7900+
AC_SUBST([RUST_STATICLIB_DEP])
7901+
78857902
dnl _MODULE_BLOCK_ADD([VAR], [VALUE])
78867903
dnl internal: adds $1=quote($2) to MODULE_BLOCK
78877904
AC_DEFUN([_MODULE_BLOCK_ADD], [AS_VAR_APPEND([MODULE_BLOCK], ["$1=_AS_QUOTE([$2])$as_nl"])])

0 commit comments

Comments
 (0)