Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added toolchain check to rustc_codegen_spirv #919

Merged
merged 4 commits into from
Sep 23, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions crates/rustc_codegen_spirv/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ use-installed-tools = ["spirv-tools/use-installed-tools"]
# If enabled will compile and link the C++ code for the spirv tools, the compiled
# version is preferred if both this and `use-installed-tools` are enabled
use-compiled-tools = ["spirv-tools/use-compiled-tools"]
# If enabled, this will not check whether the current rustc version is set to the
# appropriate channel. rustc_cogeden_spirv requires a specific nightly version,
# and will likely produce compile errors when built against a different toolchain.
# Enable this feature to be able to experiment with other versions.
skip-toolchain-check = []


[dependencies]
# HACK(eddyb) these only exist to unify features across dependency trees,
Expand Down
70 changes: 70 additions & 0 deletions crates/rustc_codegen_spirv/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
//! This custom build script merely checks whether we're compiling with the appropriate Rust toolchain

#![allow(clippy::string_add)]

use std::error::Error;
use std::process::{Command, ExitCode};

/// Current `rust-toolchain` file
/// Unfortunately, directly including the actual workspace `rust-toolchain` doesn't work together with
/// `cargo publish`. We need to figure out a way to do this properly, but let's hardcode it for now :/
//const REQUIRED_RUST_TOOLCHAIN: &str = include_str!("../../rust-toolchain");
const REQUIRED_RUST_TOOLCHAIN: &str = r#"[toolchain]
channel = "nightly-2022-08-29"
components = ["rust-src", "rustc-dev", "llvm-tools-preview"]
# commit_hash = ce36e88256f09078519f8bc6b21e4dc88f88f523"#;

fn get_rustc_commit_hash() -> Result<String, Box<dyn Error>> {
let rustc = std::env::var("RUSTC").unwrap_or_else(|_| String::from("rustc"));
String::from_utf8(Command::new(rustc).arg("-vV").output()?.stdout)?
.lines()
.find_map(|l| l.strip_prefix("commit-hash: "))
.map(|s| s.to_string())
.ok_or_else(|| Box::<dyn Error>::from("`commit-hash` not found in `rustc -vV` output"))
}

fn get_required_commit_hash() -> Result<String, Box<dyn Error>> {
REQUIRED_RUST_TOOLCHAIN
.lines()
.find_map(|l| l.strip_prefix("# commit_hash = "))
.map(|s| s.to_string())
.ok_or_else(|| Box::<dyn Error>::from("`commit_hash` not found in `rust-toolchain`"))
}

fn check_toolchain_version() -> Result<(), Box<dyn Error>> {
if !cfg!(feature = "skip-toolchain-check") {
// gets the commit hash from current rustc

let current_hash = get_rustc_commit_hash()?;
let required_hash = get_required_commit_hash()?;
if current_hash != required_hash {
let stripped_toolchain = REQUIRED_RUST_TOOLCHAIN
.lines()
.filter(|l| !l.trim().is_empty() && !l.starts_with("# "))
.map(|l| l.to_string())
.reduce(|a, b| a + "\n" + &b)
.unwrap_or_default();

return Err(Box::<dyn Error>::from(format!(
r#"
error: wrong toolchain detected (found commit hash `{current_hash}`, expected `{required_hash}`).
Make sure your `rust_toolchain` file contains the following:
-------------
{stripped_toolchain}
-------------"#
)));
}
}

Ok(())
}

fn main() -> ExitCode {
match check_toolchain_version() {
Ok(_) => ExitCode::SUCCESS,
Err(e) => {
eprint!("{}", e);
ExitCode::FAILURE
}
}
}
1 change: 1 addition & 0 deletions crates/spirv-builder/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ description = "Helper for building shaders with rust-gpu"
default = ["use-compiled-tools"]
use-installed-tools = ["rustc_codegen_spirv/use-installed-tools"]
use-compiled-tools = ["rustc_codegen_spirv/use-compiled-tools"]
skip-toolchain-check = ["rustc_codegen_spirv/skip-toolchain-check"]
watch = ["notify"]

[dependencies]
Expand Down
5 changes: 5 additions & 0 deletions rust-toolchain
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,8 @@
[toolchain]
channel = "nightly-2022-08-29"
components = ["rust-src", "rustc-dev", "llvm-tools-preview"]
# commit_hash = ce36e88256f09078519f8bc6b21e4dc88f88f523

# Whenever changing the nightly channel, update the commit hash above, and make
# sure to change REQUIRED_TOOLCHAIN in crates/rustc_codegen_spirv/src/build.rs also.