elf_magic/
lib.rs

1pub mod builder;
2pub mod codegen;
3pub mod domain;
4pub mod io;
5
6use domain::{ElfMagicError, GenerationResult};
7use std::{env, path::PathBuf};
8
9use crate::domain::ProgramFilter;
10
11/// Main entry point for elf-magic code generation
12///
13/// This function orchestrates the entire process:
14/// 1. Parse manifest configuration from package.metadata.elf-magic
15/// 2. Discover workspace and find Solana programs
16/// 3. Build each program with cargo build-sbf
17/// 4. Generate clean Rust code for ELF exports
18/// 5. Write the generated lib.rs file
19/// 6. Set up incremental build dependencies
20pub fn generate() -> Result<GenerationResult, ElfMagicError> {
21    let cargo_manifest_dir = env::var("CARGO_MANIFEST_DIR")
22        .map(PathBuf::from)
23        .map_err(|e| {
24            ElfMagicError::WorkspaceDiscovery(format!("CARGO_MANIFEST_DIR not set: {}", e))
25        })?;
26
27    let cargo_target_dir = env::var("CARGO_TARGET_DIR")
28        .map(PathBuf::from)
29        .unwrap_or_else(|_| env::temp_dir().join("elf-magic-target"));
30
31    let workspace = io::discover_workspace(&cargo_manifest_dir)?;
32
33    let manifest_config = io::parse_manifest_config(&cargo_manifest_dir)?;
34    let filter = ProgramFilter::from(&manifest_config);
35    let programs = workspace.find_solana_programs(&filter);
36
37    builder::build_programs(&cargo_target_dir, &programs)?;
38
39    io::write_lib_file(&cargo_manifest_dir, &programs)?;
40
41    io::setup_incremental_builds(&programs)?;
42
43    Ok(GenerationResult::new(programs))
44}
45
46/// This function is only available when the "testing" feature is enabled.
47#[cfg(feature = "testing")]
48pub fn generate_with_manifest_dir(
49    cargo_manifest_dir: &str,
50) -> Result<GenerationResult, ElfMagicError> {
51    temp_env::with_var("CARGO_MANIFEST_DIR", Some(cargo_manifest_dir), generate)
52}