diff --git a/gha-matrix-gen/action.yml b/gha-matrix-gen/action.yml index 3580007..2c1dfca 100644 --- a/gha-matrix-gen/action.yml +++ b/gha-matrix-gen/action.yml @@ -50,6 +50,9 @@ runs: if 'clang-aarch64' not in entry['prefix']: entry['packages'].append(f"{ entry['prefix'] }-gdb") + if 'i686' not in entry['prefix']: + entry['packages'].append(f"{ entry['prefix'] }-python-setuptools-rust") + if entry['cc'] != "gcc": entry['packages'].extend([ f"{ entry['prefix'] }-lld", @@ -78,6 +81,7 @@ runs: 'gcc', 'python', 'python-setuptools', + 'python-setuptools-rust', 'cython', 'autotools', 'ruby', diff --git a/python/setuptools-rust/.gitignore b/python/setuptools-rust/.gitignore new file mode 100644 index 0000000..c7d4ccc --- /dev/null +++ b/python/setuptools-rust/.gitignore @@ -0,0 +1,5 @@ +target/ +setuptools_rust_test/__pycache__/ +setuptools_rust_test/*.dll +setuptools_rust_test/*.pyd +build/ \ No newline at end of file diff --git a/python/setuptools-rust/Cargo.lock b/python/setuptools-rust/Cargo.lock new file mode 100644 index 0000000..c37f0c1 --- /dev/null +++ b/python/setuptools-rust/Cargo.lock @@ -0,0 +1,172 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indoc" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] + +[[package]] +name = "libc" +version = "0.2.178" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "portable-atomic" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" + +[[package]] +name = "proc-macro2" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9695f8df41bb4f3d222c95a67532365f569318332d03d5f3f67f37b20e6ebdf0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pyo3" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab53c047fcd1a1d2a8820fe84f05d6be69e9526be40cb03b73f86b6b03e6d87d" +dependencies = [ + "indoc", + "libc", + "memoffset", + "once_cell", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-build-config" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b455933107de8642b4487ed26d912c2d899dec6114884214a0b3bb3be9261ea6" +dependencies = [ + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c85c9cbfaddf651b1221594209aed57e9e5cff63c4d11d1feead529b872a089" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5b10c9bf9888125d917fb4d2ca2d25c8df94c7ab5a52e13313a07e050a3b02" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b51720d314836e53327f5871d4c0cfb4fb37cc2c4a11cc71907a86342c40f9" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "setuptools_rust_test" +version = "0.1.0" +dependencies = [ + "pyo3", +] + +[[package]] +name = "syn" +version = "2.0.112" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21f182278bf2d2bcb3c88b1b08a37df029d71ce3d3ae26168e3c653b213b99d4" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "target-lexicon" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1dd07eb858a2067e2f3c7155d54e929265c264e6f37efe3ee7a8d1b5a1dd0ba" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unindent" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" diff --git a/python/setuptools-rust/Cargo.toml b/python/setuptools-rust/Cargo.toml new file mode 100644 index 0000000..3504f6b --- /dev/null +++ b/python/setuptools-rust/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "setuptools_rust_test" +version = "0.1.0" +edition = "2021" + +[lib] +name = "_lib" +crate-type = ["cdylib"] + +[dependencies] +pyo3 = { version = "0.27.2" } diff --git a/python/setuptools-rust/setup.py b/python/setuptools-rust/setup.py new file mode 100644 index 0000000..f79e8d1 --- /dev/null +++ b/python/setuptools-rust/setup.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +from setuptools import setup +from setuptools_rust import Binding, RustExtension + +setup( + name="setuptools_rust_test", + version="0.1.0", + rust_extensions=[RustExtension("setuptools_rust_test._lib", binding=Binding.PyO3)], + packages=["setuptools_rust_test"], + zip_safe=False, +) \ No newline at end of file diff --git a/python/setuptools-rust/setuptools_rust_test/__main__.py b/python/setuptools-rust/setuptools_rust_test/__main__.py new file mode 100644 index 0000000..db6c97b --- /dev/null +++ b/python/setuptools-rust/setuptools_rust_test/__main__.py @@ -0,0 +1,4 @@ +from ._lib import hello + +if __name__ == "__main__": + print(hello()) diff --git a/python/setuptools-rust/src/lib.rs b/python/setuptools-rust/src/lib.rs new file mode 100644 index 0000000..349194c --- /dev/null +++ b/python/setuptools-rust/src/lib.rs @@ -0,0 +1,12 @@ +use pyo3::prelude::*; + +#[pyfunction] +fn hello() -> PyResult { + Ok("Hello from Rust!".to_string()) +} + +#[pymodule] +fn _lib(m: &Bound<'_, PyModule>) -> PyResult<()> { + m.add_function(wrap_pyfunction!(hello, m)?)?; + Ok(()) +} \ No newline at end of file diff --git a/python/setuptools-rust/test.sh b/python/setuptools-rust/test.sh new file mode 100644 index 0000000..9762a01 --- /dev/null +++ b/python/setuptools-rust/test.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +set -e + +if [[ "$MSYSTEM" == "MINGW32" ]]; then + echo "skipped on $MSYSTEM" + exit 0; +fi + +# should be fixed in the next pyo3 version (0.28) +link_arg=$(python -c "import sysconfig; print(sysconfig.get_config_var('LIBPYTHON'))") +export RUSTFLAGS="-C link-arg=$link_arg" + +./setup.py build_rust --inplace +python -m setuptools_rust_test diff --git a/python/test.sh b/python/test.sh index df7285f..6227da3 100644 --- a/python/test.sh +++ b/python/test.sh @@ -6,6 +6,7 @@ python --version (cd setuptools-cext && ./test.sh) (cd setuptools-cython && ./test.sh) +(cd setuptools-rust && ./test.sh) if [[ "$MSYSTEM" == "MSYS" ]]; then # Make sure python does not give away that we are not cygwin