Skip to content

RFC: Convert to Cargo workspace

Ezekiel Newren via GitGitGadget git 1 version New

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 Latest13 patches 0 repliesNew

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/13make: undo Patrick's changes concerning RustMakefile shared.mak+0 -500 replies
2/13meson: undo Patrick's changes concerning Rustmeson.build meson_options.txt src/cargo-meson.sh +1 more+4 -990 replies
3/13cargo: convert from a crate to a workspaceCargo.toml rust/gitcore/Cargo.toml rust/gitcore/src/lib.rs +1 more+15 -100 replies
4/13build: build Rust with Makefile and MesonMakefile meson.build rust/build-crate.sh+197 -150 replies
5/13.gitignore: ignore /generated/.gitignore Makefile+2 -10 replies
6/13cargo: create crate generate-headersCargo.toml rust/cbindgen-template.toml rust/generate-headers/Cargo.toml +1 more+70 -00 replies
7/13cargo: create crate link-with-crust/link-with-c/Cargo.toml rust/link-with-c/src/lib.rs+86 -00 replies
8/13rust/gitcore: link with cCargo.toml rust/gitcore/Cargo.toml rust/gitcore/build.rs+12 -20 replies
9/13varint.h: unsigned char -> uint8_tvarint.h+2 -20 replies
10/13make: delete files in generated/Makefile+1 -10 replies
11/13github-workflows: unify with rust parameters in make and mesonci/run-build-and-tests.sh+2 -20 replies
12/13github workflows: install Rust.github/workflows/main.yml ci/install-dependencies.sh ci/install-rust-toolchain.sh +3 more+145 -80 replies
13/13rust/build-rust.sh: update dir_git_root variable instantiationMakefile meson.build rust/build-crate.sh+15 -70 replies

Reviews trailers per patch

No Reviewed-by, Acked-by or Tested-by trailers for v1 yet.

Read the v1 thread

Cover letter [PATCH 00/13] RFC: Convert to Cargo workspace

The goal of this patch series is to get feedback on converting from a single cargo crate to a cargo workspace. This series is incomplete, and as such, is marked as RFC.

Why using a cargo workspace is better than a single crate:

* Better modularity.
* Since a crate is the smallest unit of compilation in Rust (not individual files), multiple crates avoid recompiling everything
* A C header is created for each crate by cbindgen (if requested), avoiding a single monolithic C header from all Rust sources.
* This separates the dependencies of each crate, which is important if we’re forced to take an old or new dependency for a non-library crate, for example, and don’t want those altered dependencies affecting other crates.

I am particularly interested in feedback on the known issues below:

* github workflow rust-analysis: broken because I removed the rust-version statement in Cargo.toml. The minimum Rust version supported by Git should be documented, but we shouldn’t require building with that minimum version.
* win+Meson build: failing because it can't find the static library
* Rust unit testing: not implemented yet, Make and Meson need to call cargo test
* Conflicts with Brian's "SHA-1/SHA-256 interoperability" patch series

Much of Patrick's earlier work needed to be removed because it assumed a single-crate layout.

The Rust crates are located under rust/, but cargo build must be invoked from the top-level Git directory. cbindgen is included as part of this series, but nothing uses it yet. The generated/ directory is where cbindgen places the generated C header files.

Ezekiel Newren (13):
make: undo Patrick's changes concerning Rust
meson: undo Patrick's changes concerning Rust
cargo: convert from a crate to a workspace
build: build Rust with Makefile and Meson .gitignore: ignore /generated/
cargo: create crate generate-headers
cargo: create crate link-with-c
rust/gitcore: link with c
varint.h: unsigned char -> uint8_t
make: delete files in generated/
github-workflows: unify with rust parameters in make and meson github workflows: install Rust
rust/build-rust.sh: update dir_git_root variable instantiation

 .github/workflows/main.yml          |  62 ++++++++++++++-
 .gitignore                          |   1 +
 Cargo.toml                          |  17 ++--
 Makefile                            | 118 ++++++++++++++++------------
 ci/install-dependencies.sh          |  14 ++--
 ci/install-rust-toolchain.sh        |  30 +++++++
 ci/install-rustup.sh                |  25 ++++++
 ci/make-test-artifacts.sh           |   9 +++
 ci/run-build-and-tests.sh           |  17 +++-
 meson.build                         |  83 ++++++++++++++-----
 meson_options.txt                   |   4 +-
 rust/build-crate.sh                 |  63 +++++++++++++++
 rust/cbindgen-template.toml         |  13 +++
 rust/generate-headers/Cargo.toml    |  12 +++
 rust/generate-headers/src/main.rs   |  44 +++++++++++
 rust/gitcore/Cargo.toml             |  12 +++
 rust/gitcore/build.rs               |   7 ++
 {src => rust/gitcore/src}/lib.rs    |   0
 {src => rust/gitcore/src}/varint.rs |   0
 rust/link-with-c/Cargo.toml         |   9 +++
 rust/link-with-c/src/lib.rs         |  77 ++++++++++++++++++
 shared.mak                          |   1 -
 src/cargo-meson.sh                  |  39 ---------
 src/meson.build                     |  41 ----------
 varint.h                            |   4 +-
 25 files changed, 528 insertions(+), 174 deletions(-)
 create mode 100755 ci/install-rust-toolchain.sh
 create mode 100755 ci/install-rustup.sh
 create mode 100755 rust/build-crate.sh
 create mode 100644 rust/cbindgen-template.toml
 create mode 100644 rust/generate-headers/Cargo.toml
 create mode 100644 rust/generate-headers/src/main.rs
 create mode 100644 rust/gitcore/Cargo.toml
 create mode 100644 rust/gitcore/build.rs
 rename {src => rust/gitcore/src}/lib.rs (100%)
 rename {src => rust/gitcore/src}/varint.rs (100%)
 create mode 100644 rust/link-with-c/Cargo.toml
 create mode 100644 rust/link-with-c/src/lib.rs
 delete mode 100755 src/cargo-meson.sh
 delete mode 100644 src/meson.build

base-commit: a99f379adf116d53eb11957af5bab5214915f91d
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2110%2Fezekielnewren%2Fcargo-workspace-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2110/ezekielnewren/cargo-workspace-v1
Pull-Request: https://github.com/git/git/pull/2110

Signature · 1 line
gitgitgadget