Skip to content

Commit

Permalink
feat(blueprint-build-utils): utilities lib for build scripts (#442)
Browse files Browse the repository at this point in the history
  • Loading branch information
Tjemmmic authored Nov 5, 2024
1 parent c25447c commit 71ea78a
Show file tree
Hide file tree
Showing 8 changed files with 88 additions and 102 deletions.
6 changes: 6 additions & 0 deletions Cargo.lock

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

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
[workspace]
resolver = "2"
members = [
"blueprint-build-utils",
"blueprint-metadata",
"blueprints/incredible-squaring",
"blueprints/incredible-squaring-eigenlayer",
Expand Down Expand Up @@ -54,6 +55,7 @@ tangle-raw-event-listener-blueprint = { path = "./blueprints/tangle-raw-event-li
gadget-blueprint-proc-macro = { path = "./macros/blueprint-proc-macro", default-features = false, version = "0.2.3" }
gadget-blueprint-proc-macro-core = { path = "./macros/blueprint-proc-macro-core", default-features = false, version = "0.1.5" }
gadget-context-derive = { path = "./macros/context-derive", default-features = false, version = "0.1.3" }
blueprint-build-utils = { path = "./blueprint-build-utils", default-features = false, version = "0.1.0" }
blueprint-metadata = { path = "./blueprint-metadata", default-features = false, version = "0.1.6" }
cargo-tangle = { path = "./cli", version = "0.2.1" }
cargo_metadata = { version = "0.18.1" }
Expand Down
13 changes: 13 additions & 0 deletions blueprint-build-utils/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[package]
name = "blueprint-build-utils"
version = "0.1.0"
authors.workspace = true
edition.workspace = true
license.workspace = true
homepage.workspace = true
repository.workspace = true

[dependencies]

[lints]
workspace = true
61 changes: 61 additions & 0 deletions blueprint-build-utils/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
use std::env;
use std::path::PathBuf;
use std::process::Command;

/// Build the Smart contracts at the specified directories, automatically rerunning if changes are
/// detected in this crates Smart Contracts (`./contracts/lib`).
///
/// # Panics
/// - If the Cargo Manifest directory is not found.
/// - If the `forge` executable is not found.
pub fn build_contracts(contract_dirs: Vec<&str>) {
println!("cargo::rerun-if-changed=contracts/lib/*");
println!("cargo::rerun-if-changed=contracts/src/*");

// Get the project root directory
let root = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());

// Try to find the `forge` executable dynamically
let forge_executable = match Command::new("which").arg("forge").output() {
Ok(output) => {
let path = String::from_utf8_lossy(&output.stdout).trim().to_string();
assert!(
!path.is_empty(),
"Forge executable not found. Make sure Foundry is installed."
);
path
}
Err(e) => panic!("Failed to find `forge` executable: {e}"),
};

for dir in contract_dirs {
let full_path = root.join(dir).canonicalize().unwrap_or_else(|_| {
println!(
"Directory not found or inaccessible: {}",
root.join(dir).display()
);
root.join(dir)
});

if full_path.exists() {
println!("cargo:rerun-if-changed={}", full_path.display());

let status = Command::new(&forge_executable)
.current_dir(&full_path)
.arg("build")
.status()
.expect("Failed to execute Forge build");

assert!(
status.success(),
"Forge build failed for directory: {}",
full_path.display()
);
} else {
println!(
"Directory not found or does not exist: {}",
full_path.display()
);
}
}
}
3 changes: 3 additions & 0 deletions blueprints/incredible-squaring-eigenlayer/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ num-bigint = { workspace = true }
blueprint-test-utils = { workspace = true }
gadget-io = { workspace = true }

[build-dependencies]
blueprint-build-utils = { workspace = true }

[features]
default = ["std"]
std = []
52 changes: 1 addition & 51 deletions blueprints/incredible-squaring-eigenlayer/build.rs
Original file line number Diff line number Diff line change
@@ -1,60 +1,10 @@
use std::env;
use std::path::PathBuf;
use std::process::Command;

fn main() {
println!("cargo:rerun-if-changed=src/cli");
println!("cargo:rerun-if-changed=src/lib.rs");
println!("cargo:rerun-if-changed=src/main.rs");

let contract_dirs: Vec<&str> = vec![
"./contracts/lib/eigenlayer-middleware/lib/eigenlayer-contracts",
"./contracts/lib/eigenlayer-middleware",
"./contracts/lib/forge-std",
"./contracts",
];

// Get the project root directory
let root = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());

// Try to find the `forge` executable dynamically
let forge_executable = match Command::new("which").arg("forge").output() {
Ok(output) => {
let path = String::from_utf8_lossy(&output.stdout).trim().to_string();
if path.is_empty() {
panic!("Forge executable not found. Make sure Foundry is installed.");
}
path
}
Err(_) => panic!("Failed to locate `forge` executable. Make sure Foundry is installed."),
};

for dir in contract_dirs {
let full_path = root.join(dir).canonicalize().unwrap_or_else(|_| {
println!(
"Directory not found or inaccessible: {}",
root.join(dir).display()
);
root.join(dir)
});

if full_path.exists() {
println!("cargo:rerun-if-changed={}", full_path.display());

let status = Command::new(&forge_executable)
.current_dir(&full_path)
.arg("build")
.status()
.expect("Failed to execute Forge build");

if !status.success() {
panic!("Forge build failed for directory: {}", full_path.display());
}
} else {
println!(
"Directory not found or does not exist: {}",
full_path.display()
);
}
}
blueprint_build_utils::build_contracts(contract_dirs);
}
1 change: 1 addition & 0 deletions blueprints/incredible-squaring-symbiotic/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ lazy_static = { workspace = true }

[build-dependencies]
blueprint-metadata = { workspace = true }
blueprint-build-utils = { workspace = true }

[features]
default = ["std"]
Expand Down
52 changes: 1 addition & 51 deletions blueprints/incredible-squaring-symbiotic/build.rs
Original file line number Diff line number Diff line change
@@ -1,59 +1,9 @@
use std::env;
use std::path::PathBuf;
use std::process::Command;

fn main() {
println!("cargo:rerun-if-changed=src/cli");
println!("cargo:rerun-if-changed=src/lib.rs");
println!("cargo:rerun-if-changed=src/main.rs");

let contract_dirs: Vec<&str> = vec![
"./contracts/lib/core",
"./contracts/lib/forge-std",
"./contracts",
];

// Get the project root directory
let root = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
print!("root: {:?}", root);
// Try to find the `forge` executable dynamically
let forge_executable = match Command::new("which").arg("forge").output() {
Ok(output) => {
let path = String::from_utf8_lossy(&output.stdout).trim().to_string();
if path.is_empty() {
panic!("Forge executable not found. Make sure Foundry is installed.");
}
path
}
Err(_) => panic!("Failed to locate `forge` executable. Make sure Foundry is installed."),
};

for dir in contract_dirs {
let full_path = root.join(dir).canonicalize().unwrap_or_else(|_| {
println!(
"Directory not found or inaccessible: {}",
root.join(dir).display()
);
root.join(dir)
});

if full_path.exists() {
println!("cargo:rerun-if-changed={}", full_path.display());

let status = Command::new(&forge_executable)
.current_dir(&full_path)
.arg("build")
.status()
.expect("Failed to execute Forge build");

if !status.success() {
panic!("Forge build failed for directory: {}", full_path.display());
}
} else {
println!(
"Directory not found or does not exist: {}",
full_path.display()
);
}
}
blueprint_build_utils::build_contracts(contract_dirs);
}

0 comments on commit 71ea78a

Please sign in to comment.