From a1b4cf73789185b8be6bbbe78f98a79fee3c09a7 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Thu, 26 Jan 2023 15:12:28 +0000 Subject: [PATCH 01/12] Use package name instead of lib name, default to "rlib" --- crates/build/src/crate_metadata.rs | 19 ++++++------------- crates/build/src/lib.rs | 1 + crates/build/templates/new/_Cargo.toml | 7 ++++--- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/crates/build/src/crate_metadata.rs b/crates/build/src/crate_metadata.rs index 2e025d61f..ac0414fa7 100644 --- a/crates/build/src/crate_metadata.rs +++ b/crates/build/src/crate_metadata.rs @@ -68,32 +68,25 @@ impl CrateMetadata { // Normalize the package and lib name. let package_name = root_package.name.replace('-', "_"); - let lib_name = &root_package - .targets - .iter() - .find(|target| target.kind.iter().any(|t| t == "cdylib")) - .expect("lib name not found") - .name - .replace('-', "_"); let absolute_manifest_path = manifest_path.absolute_directory()?; let absolute_workspace_root = metadata.workspace_root.canonicalize()?; if absolute_manifest_path != absolute_workspace_root { // If the contract is a package in a workspace, we use the package name // as the name of the sub-folder where we put the `.contract` bundle. - target_directory = target_directory.join(package_name); + target_directory = target_directory.join(package_name.clone()); } - // {target_dir}/wasm32-unknown-unknown/release/{lib_name}.wasm + // {target_dir}/wasm32-unknown-unknown/release/{package_name}.wasm let mut original_wasm = target_directory.clone(); original_wasm.push("wasm32-unknown-unknown"); original_wasm.push("release"); - original_wasm.push(lib_name.clone()); + original_wasm.push(package_name.clone()); original_wasm.set_extension("wasm"); - // {target_dir}/{lib_name}.wasm + // {target_dir}/{package_name}.wasm let mut dest_wasm = target_directory.clone(); - dest_wasm.push(lib_name.clone()); + dest_wasm.push(package_name.clone()); dest_wasm.set_extension("wasm"); let ink_version = metadata @@ -121,7 +114,7 @@ impl CrateMetadata { manifest_path: manifest_path.clone(), cargo_meta: metadata, root_package, - contract_artifact_name: lib_name.to_string(), + contract_artifact_name: package_name.to_string(), original_wasm: original_wasm.into(), dest_wasm: dest_wasm.into(), ink_version, diff --git a/crates/build/src/lib.rs b/crates/build/src/lib.rs index b6e16ef5d..d0fb2cbae 100644 --- a/crates/build/src/lib.rs +++ b/crates/build/src/lib.rs @@ -288,6 +288,7 @@ fn exec_cargo_for_wasm_target( Workspace::new(&crate_metadata.cargo_meta, &crate_metadata.root_package.id)? .with_root_package_manifest(|manifest| { manifest + .with_added_crate_type("cdylib")? .with_removed_crate_type("rlib")? .with_profile_release_defaults(Profile::default_contract_release())? .with_workspace()?; diff --git a/crates/build/templates/new/_Cargo.toml b/crates/build/templates/new/_Cargo.toml index f69f6d194..202db27a5 100644 --- a/crates/build/templates/new/_Cargo.toml +++ b/crates/build/templates/new/_Cargo.toml @@ -11,11 +11,12 @@ scale = { package = "parity-scale-codec", version = "3", default-features = fals scale-info = { version = "2.3", default-features = false, features = ["derive"], optional = true } [lib] -name = "{{name}}" path = "lib.rs" crate-type = [ - # Used for normal contract Wasm blobs. - "cdylib", + # Defaults to "rlib" so this contract can be used as a dependency. + # Replace with "cdylib" for Wasm builds. + # This is done automatically by `cargo-contract`. + "rlib", ] [features] From 8c2d7f1fc419f18792ae9457de89f82b9f3e04f5 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Thu, 26 Jan 2023 17:15:04 +0000 Subject: [PATCH 02/12] Clippy --- crates/build/src/crate_metadata.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/build/src/crate_metadata.rs b/crates/build/src/crate_metadata.rs index ac0414fa7..0b26bb576 100644 --- a/crates/build/src/crate_metadata.rs +++ b/crates/build/src/crate_metadata.rs @@ -114,7 +114,7 @@ impl CrateMetadata { manifest_path: manifest_path.clone(), cargo_meta: metadata, root_package, - contract_artifact_name: package_name.to_string(), + contract_artifact_name: package_name, original_wasm: original_wasm.into(), dest_wasm: dest_wasm.into(), ink_version, From df924108026dc6a3b2d3ba07809d07d8a2fe7cac Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Thu, 26 Jan 2023 17:27:01 +0000 Subject: [PATCH 03/12] Remove lib/package name test --- crates/build/src/tests.rs | 38 -------------------------------------- 1 file changed, 38 deletions(-) diff --git a/crates/build/src/tests.rs b/crates/build/src/tests.rs index de0fb2241..2ceb179ea 100644 --- a/crates/build/src/tests.rs +++ b/crates/build/src/tests.rs @@ -66,7 +66,6 @@ build_tests!( check_must_not_output_contract_artifacts_in_project_dir, optimization_passes_from_cli_must_take_precedence_over_profile, optimization_passes_from_profile_must_be_used, - contract_lib_name_different_from_package_name_must_build, building_template_in_debug_mode_must_work, building_template_in_release_mode_must_work, keep_debug_symbols_in_debug_mode, @@ -225,43 +224,6 @@ fn optimization_passes_from_profile_must_be_used( Ok(()) } -fn contract_lib_name_different_from_package_name_must_build( - manifest_path: &ManifestPath, -) -> Result<()> { - // given - let mut manifest = TestContractManifest::new(manifest_path.clone())?; - manifest.set_lib_name("some_lib_name")?; - manifest.set_package_name("some_package_name")?; - manifest.write()?; - - // when - let args = ExecuteArgs { - manifest_path: manifest_path.clone(), - verbosity: Verbosity::Default, - features: Default::default(), - build_mode: Default::default(), - network: Default::default(), - build_artifact: BuildArtifacts::All, - unstable_flags: Default::default(), - optimization_passes: Some(OptimizationPasses::Zero), - keep_debug_symbols: false, - lint: false, - output_type: OutputType::HumanReadable, - skip_wasm_validation: false, - }; - let res = crate::execute(args).expect("build failed"); - - // then - assert_eq!( - res.dest_wasm - .expect("`dest_wasm` does not exist") - .file_name(), - Some(OsStr::new("some_lib_name.wasm")) - ); - - Ok(()) -} - fn building_template_in_debug_mode_must_work(manifest_path: &ManifestPath) -> Result<()> { // given let args = ExecuteArgs { From 3d6f83f6aae86f544b61b453a0878d443ae676ca Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Thu, 26 Jan 2023 17:27:30 +0000 Subject: [PATCH 04/12] Unused import --- crates/build/src/tests.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/build/src/tests.rs b/crates/build/src/tests.rs index 2ceb179ea..e37b88610 100644 --- a/crates/build/src/tests.rs +++ b/crates/build/src/tests.rs @@ -31,7 +31,6 @@ use serde_json::{ Value, }; use std::{ - ffi::OsStr, fmt::Write, fs, path::{ From ec0153e7de1985d30d569e22f91e1412b4ecbbad Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Thu, 26 Jan 2023 17:33:39 +0000 Subject: [PATCH 05/12] Clippy --- crates/build/build.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/build/build.rs b/crates/build/build.rs index 290ede0ec..227ef7418 100644 --- a/crates/build/build.rs +++ b/crates/build/build.rs @@ -51,7 +51,7 @@ fn main() { match res { Ok(()) => std::process::exit(0), Err(err) => { - eprintln!("Encountered error: {:?}", err); + eprintln!("Encountered error: {err:?}"); std::process::exit(1) } } From e2587fcec19f47b72e46d635d306b773bf3e5041 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Fri, 27 Jan 2023 11:16:10 +0000 Subject: [PATCH 06/12] Add crate-type section if not present --- crates/build/src/workspace/manifest.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/build/src/workspace/manifest.rs b/crates/build/src/workspace/manifest.rs index 3bc72514f..f815fd504 100644 --- a/crates/build/src/workspace/manifest.rs +++ b/crates/build/src/workspace/manifest.rs @@ -153,9 +153,12 @@ impl Manifest { .toml .get_mut("lib") .ok_or_else(|| anyhow::anyhow!("lib section not found"))?; + let crate_types = lib - .get_mut("crate-type") - .ok_or_else(|| anyhow::anyhow!("crate-type section not found"))?; + .as_table_mut() + .ok_or_else(|| anyhow::anyhow!("lib section should be a table"))? + .entry("crate-type") + .or_insert(value::Value::Array(Default::default())); crate_types .as_array_mut() From 169684e43956186d190c9f915f4fc7cb8d7d4d87 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Fri, 27 Jan 2023 11:20:31 +0000 Subject: [PATCH 07/12] Remove crate-type section from new template manifest --- crates/build/templates/new/_Cargo.toml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/crates/build/templates/new/_Cargo.toml b/crates/build/templates/new/_Cargo.toml index 955a71575..292b48367 100644 --- a/crates/build/templates/new/_Cargo.toml +++ b/crates/build/templates/new/_Cargo.toml @@ -12,12 +12,6 @@ scale-info = { version = "2.3", default-features = false, features = ["derive"], [lib] path = "lib.rs" -crate-type = [ - # Defaults to "rlib" so this contract can be used as a dependency. - # Replace with "cdylib" for Wasm builds. - # This is done automatically by `cargo-contract`. - "rlib", -] [features] default = ["std"] From f79c6ee738a0f9bcd2cbd627e5e70fb6c0998ac8 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Fri, 27 Jan 2023 11:44:37 +0000 Subject: [PATCH 08/12] Warn in case the user relies on the previous behaviour --- crates/build/src/crate_metadata.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/crates/build/src/crate_metadata.rs b/crates/build/src/crate_metadata.rs index 7a167894f..d54450662 100644 --- a/crates/build/src/crate_metadata.rs +++ b/crates/build/src/crate_metadata.rs @@ -66,9 +66,29 @@ impl CrateMetadata { let (metadata, root_package) = get_cargo_metadata(manifest_path)?; let mut target_directory = metadata.target_directory.as_path().join("ink"); - // Normalize the package and lib name. + // Normalize the package name. let package_name = root_package.name.replace('-', "_"); + if let Some(lib_name) = &root_package + .targets + .iter() + .find(|target| target.kind.iter().any(|t| t == "cdylib")) + { + if lib_name.name != root_package.name { + // warn user if they still specify a lib name different from the + // package name + use colored::Colorize; + eprintln!( + "{} {}", + "warning:".yellow().bold(), + "the `name` field in the `[lib]` section of the `Cargo.toml`, \ + is no longer used for the name of generated contract artifacts. \ + The package name is used instead. Remove the `[lib] name` to \ + stop this warning." + ); + } + } + let absolute_manifest_path = manifest_path.absolute_directory()?; let absolute_workspace_root = metadata.workspace_root.canonicalize()?; if absolute_manifest_path != absolute_workspace_root { From c2f4de02219c7825a8c11c337f18c4fbed677987 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Fri, 27 Jan 2023 12:45:04 +0000 Subject: [PATCH 09/12] Clippy --- crates/build/src/crate_metadata.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/crates/build/src/crate_metadata.rs b/crates/build/src/crate_metadata.rs index d54450662..93d09b0fc 100644 --- a/crates/build/src/crate_metadata.rs +++ b/crates/build/src/crate_metadata.rs @@ -79,12 +79,11 @@ impl CrateMetadata { // package name use colored::Colorize; eprintln!( - "{} {}", - "warning:".yellow().bold(), - "the `name` field in the `[lib]` section of the `Cargo.toml`, \ + "{} the `name` field in the `[lib]` section of the `Cargo.toml`, \ is no longer used for the name of generated contract artifacts. \ The package name is used instead. Remove the `[lib] name` to \ - stop this warning." + stop this warning.", + "warning:".yellow().bold(), ); } } From 410dd279d7cf3a666816022d8db0b3237d743a16 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Fri, 27 Jan 2023 13:14:24 +0000 Subject: [PATCH 10/12] Use variable in format string for metadata_gen --- crates/build/templates/generate-metadata/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/build/templates/generate-metadata/main.rs b/crates/build/templates/generate-metadata/main.rs index e675b457e..c26034861 100644 --- a/crates/build/templates/generate-metadata/main.rs +++ b/crates/build/templates/generate-metadata/main.rs @@ -9,6 +9,6 @@ extern "Rust" { fn main() -> Result<(), std::io::Error> { let metadata = unsafe { __ink_generate_metadata() }; let contents = serde_json::to_string_pretty(&metadata)?; - print!("{}", contents); + print!("{contents}"); Ok(()) } From 568a4461cab614ab312bad24b03300d508f8e9cf Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Fri, 27 Jan 2023 18:32:35 +0000 Subject: [PATCH 11/12] Replace all crate types with cdylib --- crates/build/src/lib.rs | 3 +-- crates/build/src/workspace/manifest.rs | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/crates/build/src/lib.rs b/crates/build/src/lib.rs index af3f058cd..d44992e68 100644 --- a/crates/build/src/lib.rs +++ b/crates/build/src/lib.rs @@ -288,8 +288,7 @@ fn exec_cargo_for_wasm_target( Workspace::new(&crate_metadata.cargo_meta, &crate_metadata.root_package.id)? .with_root_package_manifest(|manifest| { manifest - .with_added_crate_type("cdylib")? - .with_removed_crate_type("rlib")? + .with_crate_types(["cdylib"])? .with_profile_release_defaults(Profile::default_contract_release())? .with_workspace()?; Ok(()) diff --git a/crates/build/src/workspace/manifest.rs b/crates/build/src/workspace/manifest.rs index 9a462cab3..f867ce72c 100644 --- a/crates/build/src/workspace/manifest.rs +++ b/crates/build/src/workspace/manifest.rs @@ -165,6 +165,21 @@ impl Manifest { .ok_or_else(|| anyhow::anyhow!("crate-types should be an Array")) } + /// Set the contents of the `[lib] crate-types = []` section. + /// + /// Overwrites any existing crate types. + pub fn with_crate_types<'a, I>(&mut self, new_crate_types: I) -> Result<&mut Self> + where + I: IntoIterator, + { + let existing_crate_types = self.get_crate_types_mut()?; + existing_crate_types.clear(); + for crate_type in new_crate_types.into_iter() { + existing_crate_types.push(crate_type.into()) + } + Ok(self) + } + /// Add a value to the `[lib] crate-types = []` section. /// /// If the value already exists, does nothing. From 166aa83aef218c61cd1e42a1b77d3a62d9f41c96 Mon Sep 17 00:00:00 2001 From: andrew Date: Mon, 30 Jan 2023 19:14:57 +0100 Subject: [PATCH 12/12] Fix lib target predicate --- crates/build/src/crate_metadata.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/build/src/crate_metadata.rs b/crates/build/src/crate_metadata.rs index 93d09b0fc..14e5cd5e3 100644 --- a/crates/build/src/crate_metadata.rs +++ b/crates/build/src/crate_metadata.rs @@ -72,7 +72,7 @@ impl CrateMetadata { if let Some(lib_name) = &root_package .targets .iter() - .find(|target| target.kind.iter().any(|t| t == "cdylib")) + .find(|target| target.kind.iter().any(|t| t == "lib")) { if lib_name.name != root_package.name { // warn user if they still specify a lib name different from the