From bd9287f766bded2022036a63d12fb86a2f7174a0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bastian=20K=C3=B6cher?= <git@kchr.de>
Date: Mon, 22 Apr 2024 21:28:27 +0200
Subject: [PATCH] wasm-builder: Make it easier to build a WASM binary (#4177)

Basically combines all the recommended calls into one
`build_using_defaults()` call or `init_with_defaults()` when there are
some custom changes required.
---
 .../runtimes/assets/asset-hub-rococo/build.rs |  6 +---
 .../assets/asset-hub-westend/build.rs         |  6 +---
 .../collectives/collectives-westend/build.rs  |  6 +---
 .../contracts/contracts-rococo/build.rs       |  6 +---
 .../runtimes/glutton/glutton-westend/build.rs |  6 +---
 .../runtimes/testing/penpal/build.rs          |  6 +---
 .../testing/rococo-parachain/build.rs         |  6 +---
 cumulus/test/runtime/build.rs                 | 10 ++----
 polkadot/runtime/rococo/build.rs              | 11 ++-----
 polkadot/runtime/test-runtime/build.rs        |  6 +---
 polkadot/runtime/westend/build.rs             |  6 +---
 prdoc/pr_4177.prdoc                           | 12 +++++++
 substrate/utils/wasm-builder/src/builder.rs   | 33 +++++++++++++++++++
 substrate/utils/wasm-builder/src/lib.rs       | 12 ++-----
 templates/minimal/runtime/build.rs            |  6 +---
 templates/parachain/runtime/build.rs          |  6 +---
 templates/solochain/runtime/build.rs          |  6 +---
 17 files changed, 64 insertions(+), 86 deletions(-)
 create mode 100644 prdoc/pr_4177.prdoc

diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/build.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/build.rs
index 60f8a125129..239ccac19ec 100644
--- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/build.rs
+++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/build.rs
@@ -15,11 +15,7 @@
 
 #[cfg(feature = "std")]
 fn main() {
-	substrate_wasm_builder::WasmBuilder::new()
-		.with_current_project()
-		.export_heap_base()
-		.import_memory()
-		.build()
+	substrate_wasm_builder::WasmBuilder::build_using_defaults();
 }
 
 #[cfg(not(feature = "std"))]
diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/build.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/build.rs
index 60f8a125129..239ccac19ec 100644
--- a/cumulus/parachains/runtimes/assets/asset-hub-westend/build.rs
+++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/build.rs
@@ -15,11 +15,7 @@
 
 #[cfg(feature = "std")]
 fn main() {
-	substrate_wasm_builder::WasmBuilder::new()
-		.with_current_project()
-		.export_heap_base()
-		.import_memory()
-		.build()
+	substrate_wasm_builder::WasmBuilder::build_using_defaults();
 }
 
 #[cfg(not(feature = "std"))]
diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/build.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/build.rs
index 60f8a125129..239ccac19ec 100644
--- a/cumulus/parachains/runtimes/collectives/collectives-westend/build.rs
+++ b/cumulus/parachains/runtimes/collectives/collectives-westend/build.rs
@@ -15,11 +15,7 @@
 
 #[cfg(feature = "std")]
 fn main() {
-	substrate_wasm_builder::WasmBuilder::new()
-		.with_current_project()
-		.export_heap_base()
-		.import_memory()
-		.build()
+	substrate_wasm_builder::WasmBuilder::build_using_defaults();
 }
 
 #[cfg(not(feature = "std"))]
diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/build.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/build.rs
index 60f8a125129..239ccac19ec 100644
--- a/cumulus/parachains/runtimes/contracts/contracts-rococo/build.rs
+++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/build.rs
@@ -15,11 +15,7 @@
 
 #[cfg(feature = "std")]
 fn main() {
-	substrate_wasm_builder::WasmBuilder::new()
-		.with_current_project()
-		.export_heap_base()
-		.import_memory()
-		.build()
+	substrate_wasm_builder::WasmBuilder::build_using_defaults();
 }
 
 #[cfg(not(feature = "std"))]
diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/build.rs b/cumulus/parachains/runtimes/glutton/glutton-westend/build.rs
index 1580e6f07be..2f311357403 100644
--- a/cumulus/parachains/runtimes/glutton/glutton-westend/build.rs
+++ b/cumulus/parachains/runtimes/glutton/glutton-westend/build.rs
@@ -16,9 +16,5 @@
 use substrate_wasm_builder::WasmBuilder;
 
 fn main() {
-	WasmBuilder::new()
-		.with_current_project()
-		.export_heap_base()
-		.import_memory()
-		.build()
+	WasmBuilder::build_using_defaults();
 }
diff --git a/cumulus/parachains/runtimes/testing/penpal/build.rs b/cumulus/parachains/runtimes/testing/penpal/build.rs
index 9c9cde9a25a..c2fa89aa702 100644
--- a/cumulus/parachains/runtimes/testing/penpal/build.rs
+++ b/cumulus/parachains/runtimes/testing/penpal/build.rs
@@ -16,11 +16,7 @@
 
 #[cfg(feature = "std")]
 fn main() {
-	substrate_wasm_builder::WasmBuilder::new()
-		.with_current_project()
-		.export_heap_base()
-		.import_memory()
-		.build()
+	substrate_wasm_builder::WasmBuilder::build_using_defaults();
 }
 
 #[cfg(not(feature = "std"))]
diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/build.rs b/cumulus/parachains/runtimes/testing/rococo-parachain/build.rs
index 60f8a125129..239ccac19ec 100644
--- a/cumulus/parachains/runtimes/testing/rococo-parachain/build.rs
+++ b/cumulus/parachains/runtimes/testing/rococo-parachain/build.rs
@@ -15,11 +15,7 @@
 
 #[cfg(feature = "std")]
 fn main() {
-	substrate_wasm_builder::WasmBuilder::new()
-		.with_current_project()
-		.export_heap_base()
-		.import_memory()
-		.build()
+	substrate_wasm_builder::WasmBuilder::build_using_defaults();
 }
 
 #[cfg(not(feature = "std"))]
diff --git a/cumulus/test/runtime/build.rs b/cumulus/test/runtime/build.rs
index 5e5f6a35a50..ebd5c178cba 100644
--- a/cumulus/test/runtime/build.rs
+++ b/cumulus/test/runtime/build.rs
@@ -18,16 +18,10 @@
 fn main() {
 	use substrate_wasm_builder::WasmBuilder;
 
-	WasmBuilder::new()
-		.with_current_project()
-		.export_heap_base()
-		.import_memory()
-		.build();
+	WasmBuilder::build_using_defaults();
 
-	WasmBuilder::new()
-		.with_current_project()
+	WasmBuilder::init_with_defaults()
 		.enable_feature("increment-spec-version")
-		.import_memory()
 		.set_file_name("wasm_binary_spec_version_incremented.rs")
 		.build();
 }
diff --git a/polkadot/runtime/rococo/build.rs b/polkadot/runtime/rococo/build.rs
index 0b7ee77b0d0..403c31ff21c 100644
--- a/polkadot/runtime/rococo/build.rs
+++ b/polkadot/runtime/rococo/build.rs
@@ -16,18 +16,11 @@
 
 #[cfg(feature = "std")]
 fn main() {
-	substrate_wasm_builder::WasmBuilder::new()
-		.with_current_project()
-		.import_memory()
-		.export_heap_base()
-		.build();
+	substrate_wasm_builder::WasmBuilder::build_using_defaults();
 
-	substrate_wasm_builder::WasmBuilder::new()
-		.with_current_project()
+	substrate_wasm_builder::WasmBuilder::init_with_defaults()
 		.set_file_name("fast_runtime_binary.rs")
 		.enable_feature("fast-runtime")
-		.import_memory()
-		.export_heap_base()
 		.build();
 }
 
diff --git a/polkadot/runtime/test-runtime/build.rs b/polkadot/runtime/test-runtime/build.rs
index 404ba3f2fdb..caf24317d0b 100644
--- a/polkadot/runtime/test-runtime/build.rs
+++ b/polkadot/runtime/test-runtime/build.rs
@@ -17,9 +17,5 @@
 use substrate_wasm_builder::WasmBuilder;
 
 fn main() {
-	WasmBuilder::new()
-		.with_current_project()
-		.import_memory()
-		.export_heap_base()
-		.build()
+	WasmBuilder::build_using_defaults();
 }
diff --git a/polkadot/runtime/westend/build.rs b/polkadot/runtime/westend/build.rs
index 428c971bc13..0b3e12c78c7 100644
--- a/polkadot/runtime/westend/build.rs
+++ b/polkadot/runtime/westend/build.rs
@@ -17,9 +17,5 @@
 use substrate_wasm_builder::WasmBuilder;
 
 fn main() {
-	WasmBuilder::new()
-		.with_current_project()
-		.import_memory()
-		.export_heap_base()
-		.build()
+	WasmBuilder::build_using_defaults();
 }
diff --git a/prdoc/pr_4177.prdoc b/prdoc/pr_4177.prdoc
new file mode 100644
index 00000000000..29d011c9351
--- /dev/null
+++ b/prdoc/pr_4177.prdoc
@@ -0,0 +1,12 @@
+title: "wasm-builder: Make it easier to build a WASM binary"
+
+doc:
+  - audience: [Runtime Dev, Node Dev]
+    description: |
+      Combines all the recommended calls of the `WasmBuilder` into
+      `build_using_defaults()` or `init_with_defaults()` if more changes are required.
+      Otherwise the interface doesn't change and users can still continue to use
+      the "old" interface.
+
+crates:
+  - name: substrate-wasm-builder
diff --git a/substrate/utils/wasm-builder/src/builder.rs b/substrate/utils/wasm-builder/src/builder.rs
index d2aaff448bc..163703fbec6 100644
--- a/substrate/utils/wasm-builder/src/builder.rs
+++ b/substrate/utils/wasm-builder/src/builder.rs
@@ -116,6 +116,39 @@ impl WasmBuilder {
 		WasmBuilderSelectProject { _ignore: () }
 	}
 
+	/// Build the WASM binary using the recommended default values.
+	///
+	/// This is the same as calling:
+	/// ```no_run
+	/// substrate_wasm_builder::WasmBuilder::new()
+	///    .with_current_project()
+	///    .import_memory()
+	///    .export_heap_base()
+	///    .build();
+	/// ```
+	pub fn build_using_defaults() {
+		WasmBuilder::new()
+			.with_current_project()
+			.import_memory()
+			.export_heap_base()
+			.build();
+	}
+
+	/// Init the wasm builder with the recommended default values.
+	///
+	/// In contrast to [`Self::build_using_defaults`] it does not build the WASM binary directly.
+	///
+	/// This is the same as calling:
+	/// ```no_run
+	/// substrate_wasm_builder::WasmBuilder::new()
+	///    .with_current_project()
+	///    .import_memory()
+	///    .export_heap_base();
+	/// ```
+	pub fn init_with_defaults() -> Self {
+		WasmBuilder::new().with_current_project().import_memory().export_heap_base()
+	}
+
 	/// Enable exporting `__heap_base` as global variable in the WASM binary.
 	///
 	/// This adds `-Clink-arg=--export=__heap_base` to `RUST_FLAGS`.
diff --git a/substrate/utils/wasm-builder/src/lib.rs b/substrate/utils/wasm-builder/src/lib.rs
index 178e499e8f5..9ebab38b9cb 100644
--- a/substrate/utils/wasm-builder/src/lib.rs
+++ b/substrate/utils/wasm-builder/src/lib.rs
@@ -33,15 +33,9 @@
 //! use substrate_wasm_builder::WasmBuilder;
 //!
 //! fn main() {
-//!     WasmBuilder::new()
-//!         // Tell the builder to build the project (crate) this `build.rs` is part of.
-//!         .with_current_project()
-//!         // Make sure to export the `heap_base` global, this is required by Substrate
-//!         .export_heap_base()
-//!         // Build the Wasm file so that it imports the memory (need to be provided by at instantiation)
-//!         .import_memory()
-//!         // Build it.
-//!         .build()
+//!     // Builds the WASM binary using the recommended defaults.
+//!     // If you need more control, you can call `new` or `init_with_defaults`.
+//!     WasmBuilder::build_using_defaults();
 //! }
 //! ```
 //!
diff --git a/templates/minimal/runtime/build.rs b/templates/minimal/runtime/build.rs
index b7676a70dfe..e6f92757e22 100644
--- a/templates/minimal/runtime/build.rs
+++ b/templates/minimal/runtime/build.rs
@@ -18,10 +18,6 @@
 fn main() {
 	#[cfg(feature = "std")]
 	{
-		substrate_wasm_builder::WasmBuilder::new()
-			.with_current_project()
-			.export_heap_base()
-			.import_memory()
-			.build();
+		substrate_wasm_builder::WasmBuilder::build_using_defaults();
 	}
 }
diff --git a/templates/parachain/runtime/build.rs b/templates/parachain/runtime/build.rs
index 02d6973f29c..bb05afe02b1 100644
--- a/templates/parachain/runtime/build.rs
+++ b/templates/parachain/runtime/build.rs
@@ -1,10 +1,6 @@
 #[cfg(feature = "std")]
 fn main() {
-	substrate_wasm_builder::WasmBuilder::new()
-		.with_current_project()
-		.export_heap_base()
-		.import_memory()
-		.build()
+	substrate_wasm_builder::WasmBuilder::build_using_defaults();
 }
 
 /// The wasm builder is deactivated when compiling
diff --git a/templates/solochain/runtime/build.rs b/templates/solochain/runtime/build.rs
index c03d618535b..f262c320393 100644
--- a/templates/solochain/runtime/build.rs
+++ b/templates/solochain/runtime/build.rs
@@ -1,10 +1,6 @@
 fn main() {
 	#[cfg(feature = "std")]
 	{
-		substrate_wasm_builder::WasmBuilder::new()
-			.with_current_project()
-			.export_heap_base()
-			.import_memory()
-			.build();
+		substrate_wasm_builder::WasmBuilder::build_using_defaults();
 	}
 }
-- 
GitLab