diff --git a/crates/spirv-builder/src/lib.rs b/crates/spirv-builder/src/lib.rs index d3082dd327d..3bd3c18dec9 100644 --- a/crates/spirv-builder/src/lib.rs +++ b/crates/spirv-builder/src/lib.rs @@ -400,8 +400,16 @@ impl Default for ShaderCrateFeatures { #[cfg_attr(feature = "clap", derive(clap::Parser))] #[non_exhaustive] pub struct SpirvBuilder { + /// The path to the shader crate to compile #[cfg_attr(feature = "clap", clap(skip))] pub path_to_crate: Option, + /// The cargo command to run, formatted like `cargo {cargo_cmd} ...`. Defaults to `rustc`. + #[cfg_attr(feature = "clap", clap(skip))] + pub cargo_cmd: Option, + /// Whether the cargo command set in `cargo_cmd` behaves like `cargo rustc` and allows passing args such as + /// `--crate-type dylib`. Defaults to true if `cargo_cmd` is `None` or `Some("rustc")`. + #[cfg_attr(feature = "clap", clap(skip))] + pub cargo_cmd_like_rustc: Option, /// Whether to print build.rs cargo metadata (e.g. cargo:rustc-env=var=val). Defaults to [`MetadataPrintout::None`]. /// Within build scripts, set it to [`MetadataPrintout::DependencyOnly`] or [`MetadataPrintout::Full`] to ensure the build script is rerun on code changes. #[cfg_attr(feature = "clap", clap(skip))] @@ -497,6 +505,8 @@ impl Default for SpirvBuilder { fn default() -> Self { Self { path_to_crate: None, + cargo_cmd: None, + cargo_cmd_like_rustc: None, print_metadata: MetadataPrintout::default(), release: true, target: None, @@ -995,14 +1005,16 @@ fn invoke_rustc(builder: &SpirvBuilder) -> Result { .join(target_dir_path) }; - let profile = if builder.release { "release" } else { "dev" }; - let mut cargo = cargo_cmd::CargoCmd::new(); if let Some(toolchain) = &builder.toolchain_overwrite { cargo.arg(format!("+{toolchain}")); } + + let cargo_cmd = builder.cargo_cmd.as_ref().map_or("rustc", |s| s.as_str()); + let cargo_cmd_like_rustc = builder.cargo_cmd_like_rustc.unwrap_or(cargo_cmd == "rustc"); + let profile = if builder.release { "release" } else { "dev" }; cargo.args([ - "build", + cargo_cmd, "--lib", "--message-format=json-render-diagnostics", "-Zbuild-std=core", @@ -1010,6 +1022,14 @@ fn invoke_rustc(builder: &SpirvBuilder) -> Result { "--profile", profile, ]); + if cargo_cmd_like_rustc { + // About `crate-type`: We use it to determine whether the crate needs to be linked into shaders. For `rlib`, + // we're emitting regular rust libraries as is expected. For `dylib` or `cdylib`, we're linking all `rlib`s + // together, legalize them in many passes and emit a final `*.spv` file. Quirk: If you depend on a crate + // that has crate-type `dylib`, we also link it, and it will fail if it has no shaders, which may not be + // desired. (Gathered from reading source code and experimenting, @firestar99) + cargo.args(["--crate-type", "dylib"]); + } if let Ok(extra_cargoflags) = tracked_env_var_get("RUSTGPU_CARGOFLAGS") { cargo.args(extra_cargoflags.split_whitespace()); diff --git a/docs/src/writing-shader-crates.md b/docs/src/writing-shader-crates.md index 19d1b4884f4..83605773767 100644 --- a/docs/src/writing-shader-crates.md +++ b/docs/src/writing-shader-crates.md @@ -152,12 +152,9 @@ can give to a renderer. ## Writing your first shader -Configure your shader crate as a `"dylib"` type crate, and add `spirv-std` to its dependencies: +Add `spirv-std` to its dependencies: ```toml -[lib] -crate-type = ["dylib"] - [dependencies] spirv-std = { version = "0.9" } ``` diff --git a/examples/runners/wgpu/Cargo.toml b/examples/runners/wgpu/Cargo.toml index b4e240ebc3f..48243b9ff56 100644 --- a/examples/runners/wgpu/Cargo.toml +++ b/examples/runners/wgpu/Cargo.toml @@ -8,6 +8,7 @@ license.workspace = true repository.workspace = true [lib] +# required by cargo apk / Android crate-type = ["lib", "cdylib"] # See rustc_codegen_spirv/Cargo.toml for details on these features diff --git a/examples/shaders/compute-shader/Cargo.toml b/examples/shaders/compute-shader/Cargo.toml index 4a7d4324fef..67056a21a61 100644 --- a/examples/shaders/compute-shader/Cargo.toml +++ b/examples/shaders/compute-shader/Cargo.toml @@ -10,9 +10,6 @@ repository.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib", "lib"] - [dependencies] spirv-std = { workspace = true } diff --git a/examples/shaders/mouse-shader/Cargo.toml b/examples/shaders/mouse-shader/Cargo.toml index 1955c82de6a..e646de26c8b 100644 --- a/examples/shaders/mouse-shader/Cargo.toml +++ b/examples/shaders/mouse-shader/Cargo.toml @@ -10,9 +10,6 @@ repository.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - [dependencies] shared = { path = "../../shaders/shared" } spirv-std = { workspace = true } diff --git a/examples/shaders/reduce/Cargo.toml b/examples/shaders/reduce/Cargo.toml index a67f74232f0..d5d3fb84628 100644 --- a/examples/shaders/reduce/Cargo.toml +++ b/examples/shaders/reduce/Cargo.toml @@ -10,8 +10,5 @@ repository.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib", "lib"] - [dependencies] spirv-std = { workspace = true } diff --git a/examples/shaders/simplest-shader/Cargo.toml b/examples/shaders/simplest-shader/Cargo.toml index d86220025e0..6f8e461062e 100644 --- a/examples/shaders/simplest-shader/Cargo.toml +++ b/examples/shaders/simplest-shader/Cargo.toml @@ -10,9 +10,6 @@ repository.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - [dependencies] spirv-std = { workspace = true } shared = { path = "../shared" } diff --git a/examples/shaders/sky-shader/Cargo.toml b/examples/shaders/sky-shader/Cargo.toml index 3fbbe6061f8..67bf81339d0 100644 --- a/examples/shaders/sky-shader/Cargo.toml +++ b/examples/shaders/sky-shader/Cargo.toml @@ -10,9 +10,6 @@ repository.workspace = true [lints] workspace = true -[lib] -crate-type = ["lib", "dylib"] - [dependencies] shared = { path = "../../shaders/shared" } spirv-std = { workspace = true } diff --git a/tests/difftests/tests/arch/atomic_ops/atomic_ops-rust/Cargo.toml b/tests/difftests/tests/arch/atomic_ops/atomic_ops-rust/Cargo.toml index 431fdac31ae..eb7dc97be78 100644 --- a/tests/difftests/tests/arch/atomic_ops/atomic_ops-rust/Cargo.toml +++ b/tests/difftests/tests/arch/atomic_ops/atomic_ops-rust/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # Common deps [dependencies] diff --git a/tests/difftests/tests/arch/memory_barriers/memory_barriers-rust/Cargo.toml b/tests/difftests/tests/arch/memory_barriers/memory_barriers-rust/Cargo.toml index 6b7ea4ccd30..d48ae4a7063 100644 --- a/tests/difftests/tests/arch/memory_barriers/memory_barriers-rust/Cargo.toml +++ b/tests/difftests/tests/arch/memory_barriers/memory_barriers-rust/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # GPU deps [dependencies] spirv-std.workspace = true diff --git a/tests/difftests/tests/arch/push_constants/push_constants-rust/Cargo.toml b/tests/difftests/tests/arch/push_constants/push_constants-rust/Cargo.toml index 2ba5468de47..7c56b84c7f6 100644 --- a/tests/difftests/tests/arch/push_constants/push_constants-rust/Cargo.toml +++ b/tests/difftests/tests/arch/push_constants/push_constants-rust/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # GPU deps [dependencies] spirv-std.workspace = true diff --git a/tests/difftests/tests/arch/vector_extract_insert/vector_extract_insert-rust/Cargo.toml b/tests/difftests/tests/arch/vector_extract_insert/vector_extract_insert-rust/Cargo.toml index 2481bd472d9..69f627ec342 100644 --- a/tests/difftests/tests/arch/vector_extract_insert/vector_extract_insert-rust/Cargo.toml +++ b/tests/difftests/tests/arch/vector_extract_insert/vector_extract_insert-rust/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # GPU deps [dependencies] spirv-std.workspace = true diff --git a/tests/difftests/tests/arch/workgroup_memory/workgroup_memory-ash/Cargo.toml b/tests/difftests/tests/arch/workgroup_memory/workgroup_memory-ash/Cargo.toml index 93652986fd3..7c9886495ea 100644 --- a/tests/difftests/tests/arch/workgroup_memory/workgroup_memory-ash/Cargo.toml +++ b/tests/difftests/tests/arch/workgroup_memory/workgroup_memory-ash/Cargo.toml @@ -5,10 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -name = "workgroup_memory_ash_shader" -crate-type = ["dylib"] - # Common deps [dependencies] diff --git a/tests/difftests/tests/arch/workgroup_memory/workgroup_memory-rust/Cargo.toml b/tests/difftests/tests/arch/workgroup_memory/workgroup_memory-rust/Cargo.toml index 2e55e489b1c..f5ae49b68dc 100644 --- a/tests/difftests/tests/arch/workgroup_memory/workgroup_memory-rust/Cargo.toml +++ b/tests/difftests/tests/arch/workgroup_memory/workgroup_memory-rust/Cargo.toml @@ -5,10 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -name = "workgroup_memory_rust_shader" -crate-type = ["dylib"] - # Common deps [dependencies] diff --git a/tests/difftests/tests/lang/abi/vector_layout/rust-gpu/Cargo.toml b/tests/difftests/tests/lang/abi/vector_layout/rust-gpu/Cargo.toml index e178ce6d251..192bba3ce49 100644 --- a/tests/difftests/tests/lang/abi/vector_layout/rust-gpu/Cargo.toml +++ b/tests/difftests/tests/lang/abi/vector_layout/rust-gpu/Cargo.toml @@ -2,9 +2,6 @@ name = "abi-vector-layout-rust-gpu" edition.workspace = true -[lib] -crate-type = ["lib", "dylib"] - [lints] workspace = true diff --git a/tests/difftests/tests/lang/abi/vector_layout_cuda/rust-gpu/Cargo.toml b/tests/difftests/tests/lang/abi/vector_layout_cuda/rust-gpu/Cargo.toml index 2ae5c7a13f8..7ac8b0e0c03 100644 --- a/tests/difftests/tests/lang/abi/vector_layout_cuda/rust-gpu/Cargo.toml +++ b/tests/difftests/tests/lang/abi/vector_layout_cuda/rust-gpu/Cargo.toml @@ -2,9 +2,6 @@ name = "abi-vector-layout-cuda-rust-gpu" edition.workspace = true -[lib] -crate-type = ["lib", "dylib"] - [lints] workspace = true diff --git a/tests/difftests/tests/lang/abi/vector_layout_scalar_math/rust-gpu/Cargo.toml b/tests/difftests/tests/lang/abi/vector_layout_scalar_math/rust-gpu/Cargo.toml index 225553fd249..70619225235 100644 --- a/tests/difftests/tests/lang/abi/vector_layout_scalar_math/rust-gpu/Cargo.toml +++ b/tests/difftests/tests/lang/abi/vector_layout_scalar_math/rust-gpu/Cargo.toml @@ -2,9 +2,6 @@ name = "abi-vector-layout-scalar-math-rust-gpu" edition.workspace = true -[lib] -crate-type = ["lib", "dylib"] - [lints] workspace = true diff --git a/tests/difftests/tests/lang/control_flow/control_flow-rust/Cargo.toml b/tests/difftests/tests/lang/control_flow/control_flow-rust/Cargo.toml index 89b14e484bb..84b1678fa6f 100644 --- a/tests/difftests/tests/lang/control_flow/control_flow-rust/Cargo.toml +++ b/tests/difftests/tests/lang/control_flow/control_flow-rust/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # Common deps [dependencies] diff --git a/tests/difftests/tests/lang/control_flow_complex/control_flow_complex-rust/Cargo.toml b/tests/difftests/tests/lang/control_flow_complex/control_flow_complex-rust/Cargo.toml index 5cf19236fff..d2a046293eb 100644 --- a/tests/difftests/tests/lang/control_flow_complex/control_flow_complex-rust/Cargo.toml +++ b/tests/difftests/tests/lang/control_flow_complex/control_flow_complex-rust/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # GPU deps [dependencies] spirv-std.workspace = true diff --git a/tests/difftests/tests/lang/core/intrinsics/black_box_noop/with-black-box/Cargo.toml b/tests/difftests/tests/lang/core/intrinsics/black_box_noop/with-black-box/Cargo.toml index 42c5fe9c798..e415ed03489 100644 --- a/tests/difftests/tests/lang/core/intrinsics/black_box_noop/with-black-box/Cargo.toml +++ b/tests/difftests/tests/lang/core/intrinsics/black_box_noop/with-black-box/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # GPU deps [dependencies] spirv-std.workspace = true diff --git a/tests/difftests/tests/lang/core/intrinsics/black_box_noop/without-black-box/Cargo.toml b/tests/difftests/tests/lang/core/intrinsics/black_box_noop/without-black-box/Cargo.toml index c1f7123aaf7..f2aa58ed0b9 100644 --- a/tests/difftests/tests/lang/core/intrinsics/black_box_noop/without-black-box/Cargo.toml +++ b/tests/difftests/tests/lang/core/intrinsics/black_box_noop/without-black-box/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # GPU deps [dependencies] spirv-std.workspace = true diff --git a/tests/difftests/tests/lang/core/ops/bitwise_ops/bitwise_ops-rust/Cargo.toml b/tests/difftests/tests/lang/core/ops/bitwise_ops/bitwise_ops-rust/Cargo.toml index 2392c4f90d0..aeb163066f5 100644 --- a/tests/difftests/tests/lang/core/ops/bitwise_ops/bitwise_ops-rust/Cargo.toml +++ b/tests/difftests/tests/lang/core/ops/bitwise_ops/bitwise_ops-rust/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # GPU deps [dependencies] spirv-std.workspace = true diff --git a/tests/difftests/tests/lang/core/ops/const_fold_int/const-expr-shader/Cargo.toml b/tests/difftests/tests/lang/core/ops/const_fold_int/const-expr-shader/Cargo.toml index a2e86b99d32..4a72f4da217 100644 --- a/tests/difftests/tests/lang/core/ops/const_fold_int/const-expr-shader/Cargo.toml +++ b/tests/difftests/tests/lang/core/ops/const_fold_int/const-expr-shader/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # GPU deps [dependencies] const_fold_int-const-fold-cpu = { path = "../const-fold-cpu" } diff --git a/tests/difftests/tests/lang/core/ops/const_fold_int/const-fold-shader/Cargo.toml b/tests/difftests/tests/lang/core/ops/const_fold_int/const-fold-shader/Cargo.toml index 83d06ddc634..31127c8b01d 100644 --- a/tests/difftests/tests/lang/core/ops/const_fold_int/const-fold-shader/Cargo.toml +++ b/tests/difftests/tests/lang/core/ops/const_fold_int/const-fold-shader/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # GPU deps [dependencies] const_fold_int-const-fold-cpu = { path = "../const-fold-cpu" } diff --git a/tests/difftests/tests/lang/core/ops/const_fold_int/dynamic-values-shader/Cargo.toml b/tests/difftests/tests/lang/core/ops/const_fold_int/dynamic-values-shader/Cargo.toml index 99b20e4891d..6f8dd63b8d2 100644 --- a/tests/difftests/tests/lang/core/ops/const_fold_int/dynamic-values-shader/Cargo.toml +++ b/tests/difftests/tests/lang/core/ops/const_fold_int/dynamic-values-shader/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["rlib", "dylib"] - # GPU deps [dependencies] const_fold_int-const-fold-cpu = { path = "../const-fold-cpu" } diff --git a/tests/difftests/tests/lang/core/ops/math_ops/math_ops-rust/Cargo.toml b/tests/difftests/tests/lang/core/ops/math_ops/math_ops-rust/Cargo.toml index 86d05c7de4b..ee3eaba621d 100644 --- a/tests/difftests/tests/lang/core/ops/math_ops/math_ops-rust/Cargo.toml +++ b/tests/difftests/tests/lang/core/ops/math_ops/math_ops-rust/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # Common deps [dependencies] spirv-std.workspace = true diff --git a/tests/difftests/tests/lang/core/ops/matrix_ops/matrix_ops-rust/Cargo.toml b/tests/difftests/tests/lang/core/ops/matrix_ops/matrix_ops-rust/Cargo.toml index b4d32b8fcbe..15179bf50cf 100644 --- a/tests/difftests/tests/lang/core/ops/matrix_ops/matrix_ops-rust/Cargo.toml +++ b/tests/difftests/tests/lang/core/ops/matrix_ops/matrix_ops-rust/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # Common deps [dependencies] spirv-std.workspace = true diff --git a/tests/difftests/tests/lang/core/ops/trig_ops/trig_ops-rust/Cargo.toml b/tests/difftests/tests/lang/core/ops/trig_ops/trig_ops-rust/Cargo.toml index 229e9f24596..c7e191d8e06 100644 --- a/tests/difftests/tests/lang/core/ops/trig_ops/trig_ops-rust/Cargo.toml +++ b/tests/difftests/tests/lang/core/ops/trig_ops/trig_ops-rust/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # GPU deps [dependencies] spirv-std.workspace = true diff --git a/tests/difftests/tests/lang/core/ops/vector_ops/vector_ops-rust/Cargo.toml b/tests/difftests/tests/lang/core/ops/vector_ops/vector_ops-rust/Cargo.toml index 19e11d7a031..129d19170e4 100644 --- a/tests/difftests/tests/lang/core/ops/vector_ops/vector_ops-rust/Cargo.toml +++ b/tests/difftests/tests/lang/core/ops/vector_ops/vector_ops-rust/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - [dependencies] spirv-std.workspace = true difftest.workspace = true diff --git a/tests/difftests/tests/lang/core/ops/vector_swizzle/vector_swizzle-rust/Cargo.toml b/tests/difftests/tests/lang/core/ops/vector_swizzle/vector_swizzle-rust/Cargo.toml index 6cf5f5e2a3c..a678ce54651 100644 --- a/tests/difftests/tests/lang/core/ops/vector_swizzle/vector_swizzle-rust/Cargo.toml +++ b/tests/difftests/tests/lang/core/ops/vector_swizzle/vector_swizzle-rust/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # GPU deps [dependencies] spirv-std.workspace = true diff --git a/tests/difftests/tests/simple-compute/simple-compute-rust/Cargo.toml b/tests/difftests/tests/simple-compute/simple-compute-rust/Cargo.toml index ab34115943a..6241c2eba77 100644 --- a/tests/difftests/tests/simple-compute/simple-compute-rust/Cargo.toml +++ b/tests/difftests/tests/simple-compute/simple-compute-rust/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # Common deps [dependencies] diff --git a/tests/difftests/tests/storage_class/array_access/array_access-rust/Cargo.toml b/tests/difftests/tests/storage_class/array_access/array_access-rust/Cargo.toml index fb811e545d1..9a1e70401bb 100644 --- a/tests/difftests/tests/storage_class/array_access/array_access-rust/Cargo.toml +++ b/tests/difftests/tests/storage_class/array_access/array_access-rust/Cargo.toml @@ -5,9 +5,6 @@ edition.workspace = true [lints] workspace = true -[lib] -crate-type = ["dylib"] - # Common deps [dependencies]