-
Notifications
You must be signed in to change notification settings - Fork 81
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Convert shell scripts to Rust (#891)
`cargo.sh` is now a thin wrapper around a new `cargo-zerocopy` tool located in the `tools` directory. README generation is now done by a similar `generate-readme` tool. A wrapper script for running `cargo-zerocopy` on Windows has been added as `win-cargo.bat`, effectively allowing the test suites to be run on Windows.
- Loading branch information
Showing
13 changed files
with
404 additions
and
196 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,135 +1,12 @@ | ||
#!/bin/bash | ||
# | ||
# Copyright 2023 The Fuchsia Authors | ||
# Copyright 2024 The Fuchsia Authors | ||
# | ||
# Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 | ||
# <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT | ||
# license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option. | ||
# This file may not be copied, modified, or distributed except according to | ||
# those terms. | ||
|
||
# This script is a thin wrapper around Cargo that provides human-friendly | ||
# toolchain names which are automatically translated to the toolchain versions | ||
# we have pinned in CI. | ||
# | ||
# cargo.sh --version <toolchain-name> # looks up the version for the named toolchain | ||
# cargo.sh +<toolchain-name> [...] # runs cargo commands with the named toolchain | ||
# cargo.sh +all [...] # runs cargo commands with each toolchain | ||
# | ||
# The meta-toolchain "all" instructs this script to run the provided command | ||
# once for each "major" toolchain (msrv, stable, nightly). This does not include | ||
# any toolchain which is listed in the `package.metadata.build-rs` Cargo.toml | ||
# section. | ||
# | ||
# A common task that is especially annoying to perform by hand is to update | ||
# trybuild's stderr files. Using this script: | ||
# | ||
# TRYBUILD=overwrite ./cargo.sh +all test --workspace | ||
|
||
set -eo pipefail | ||
|
||
function print-usage-and-exit { | ||
echo "Usage:" >&2 | ||
echo " $0 --version <toolchain-name>" >&2 | ||
echo " $0 +<toolchain-name> [...]" >&2 | ||
echo " $0 +all [...]" >&2 | ||
exit 1 | ||
} | ||
|
||
[[ $# -gt 0 ]] || print-usage-and-exit | ||
|
||
function pkg-meta { | ||
# NOTE(#547): We set `CARGO_TARGET_DIR` here because `cargo metadata` | ||
# sometimes causes the `cargo-metadata` crate to be rebuilt from source using | ||
# the default toolchain. This has the effect of clobbering any existing build | ||
# artifacts from whatever toolchain the user has specified (e.g., `+nightly`), | ||
# causing the subsequent `cargo` invocation to rebuild unnecessarily. By | ||
# specifying a separate build directory here, we ensure that this never | ||
# clobbers the build artifacts used by the later `cargo` invocation. | ||
# | ||
# In CI, make sure to use the default stable toolchain. If we're testing on | ||
# our MSRV, then we also have our MSRV toolchain installed. As of this | ||
# writing, our MSRV is low enough that the correspoding Rust toolchain's Cargo | ||
# doesn't know about the `rust-version` field, and so if we were to use Cargo | ||
# with that toolchain, `pkg-meta` would return `null` when asked to retrieve | ||
# the `rust-version` field. This also requires `RUSTFLAGS=''` to override any | ||
# unstable `RUSTFLAGS` set by the caller. | ||
RUSTFLAGS='' CARGO_TARGET_DIR=target/cargo-sh cargo +stable metadata --format-version 1 | jq -r ".packages[] | select(.name == \"zerocopy\").$1" | ||
} | ||
|
||
function lookup-version { | ||
VERSION="$1" | ||
case "$VERSION" in | ||
msrv) | ||
pkg-meta rust_version | ||
;; | ||
stable) | ||
pkg-meta 'metadata.ci."pinned-stable"' | ||
;; | ||
nightly) | ||
pkg-meta 'metadata.ci."pinned-nightly"' | ||
;; | ||
*) | ||
TOOLCHAIN=$(pkg-meta "metadata.\"build-rs\".\"${VERSION}\"") | ||
if [ "$TOOLCHAIN" != "null" ]; then | ||
echo "$TOOLCHAIN" | ||
else | ||
echo "Unrecognized toolchain name: '$VERSION' (options are 'msrv', 'stable', 'nightly', and any value in Cargo.toml's 'metadata.build-rs' table)" >&2 | ||
return 1 | ||
fi | ||
;; | ||
esac | ||
} | ||
|
||
function get-rustflags { | ||
[ "$1" == nightly ] && echo "--cfg __INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS" | ||
} | ||
|
||
function prompt { | ||
PROMPT="$1" | ||
YES="$2" | ||
while true; do | ||
read -p "$PROMPT " yn | ||
case "$yn" in | ||
[Yy]) $YES; return $?; ;; | ||
[Nn]) return 1; ;; | ||
*) break; ;; | ||
esac | ||
done | ||
} | ||
|
||
case "$1" in | ||
# cargo.sh --version <toolchain-name> | ||
--version) | ||
[[ $# -eq 2 ]] || print-usage-and-exit | ||
lookup-version "$2" | ||
;; | ||
# cargo.sh +all [...] | ||
+all) | ||
echo "[cargo.sh] warning: running the same command for each toolchain (msrv, stable, nightly)" >&2 | ||
for toolchain in msrv stable nightly; do | ||
echo "[cargo.sh] running with toolchain: $toolchain" >&2 | ||
$0 "+$toolchain" ${@:2} | ||
done | ||
exit 0 | ||
;; | ||
# cargo.sh +<toolchain-name> [...] | ||
+*) | ||
TOOLCHAIN="$(lookup-version ${1:1})" | ||
|
||
cargo "+$TOOLCHAIN" version &>/dev/null && \ | ||
rustup "+$TOOLCHAIN" component list | grep '^rust-src (installed)$' >/dev/null || { | ||
echo "[cargo.sh] missing either toolchain '$TOOLCHAIN' or component 'rust-src'" >&2 | ||
# If we're running in a GitHub action, then it's better to bail than to | ||
# hang waiting for input we're never going to get. | ||
[ -z ${GITHUB_RUN_ID+x} ] || exit 1 | ||
prompt "[cargo.sh] would you like to install toolchain '$TOOLCHAIN' and component 'rust-src' via 'rustup'?" \ | ||
"rustup toolchain install $TOOLCHAIN -c rust-src" | ||
} || exit 1 | ||
|
||
RUSTFLAGS="$(get-rustflags ${1:1}) $RUSTFLAGS" cargo "+$TOOLCHAIN" ${@:2} | ||
;; | ||
*) | ||
print-usage-and-exit | ||
;; | ||
esac | ||
# Build `cargo-zerocopy` without any RUSTFLAGS set in the environment | ||
env -u RUSTFLAGS cargo +stable build --manifest-path tools/Cargo.toml -p cargo-zerocopy -q | ||
# Thin wrapper around the `cargo-zerocopy` binary in `tools/cargo-zerocopy` | ||
./tools/target/debug/cargo-zerocopy $@ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
# Copyright 2018 The Fuchsia Authors | ||
# | ||
# Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 | ||
# <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT | ||
# license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option. | ||
# This file may not be copied, modified, or distributed except according to | ||
# those terms. | ||
|
||
[workspace] | ||
members = [ | ||
"cargo-zerocopy", | ||
"generate-readme", | ||
] | ||
resolver = "2" | ||
|
||
[workspace.package] | ||
edition = "2021" | ||
version = "0.0.0" | ||
authors = ["Joshua Liebow-Feeser <[email protected]>"] | ||
license = "BSD-2-Clause OR Apache-2.0 OR MIT" | ||
publish = false | ||
|
||
[workspace.dependencies] | ||
regex = "1" | ||
serde_json = "1" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
# Copyright 2024 The Fuchsia Authors | ||
# | ||
# Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 | ||
# <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT | ||
# license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option. | ||
# This file may not be copied, modified, or distributed except according to | ||
# those terms. | ||
|
||
[package] | ||
edition.workspace = true | ||
name = "cargo-zerocopy" | ||
version.workspace = true | ||
authors.workspace = true | ||
license.workspace = true | ||
publish.workspace = true | ||
|
||
[dependencies] | ||
serde_json.workspace = true |
Oops, something went wrong.