//! Embedding-ABI M1 CLI (spec §5): `ail build --emit=staticlib` //! produces `lib.a` (program-only) + a separate //! `libailang_rt.a`, and emits NO executable / NO `@main`. use ailang_test_support::workspace_root; use std::process::Command; fn ail_bin() -> &'static str { env!("CARGO_BIN_EXE_ail") } #[test] fn staticlib_emit_produces_two_archives() { let fixture = workspace_root().join("examples").join("embed_backtest_step.ail"); let outdir = std::env::temp_dir() .join(format!("ail-embed-cli-{}", std::process::id())); std::fs::create_dir_all(&outdir).unwrap(); let out = Command::new(ail_bin()) .args([ "build", fixture.to_str().unwrap(), "--emit=staticlib", "-o", outdir.to_str().unwrap(), ]) .output().expect("ail build --emit=staticlib"); assert!(out.status.success(), "staticlib build failed: stdout={} stderr={}", String::from_utf8_lossy(&out.stdout), String::from_utf8_lossy(&out.stderr)); assert!(outdir.join("libembed_backtest_step.a").exists(), "expected libembed_backtest_step.a in {outdir:?}"); assert!(outdir.join("libailang_rt.a").exists(), "expected separate libailang_rt.a in {outdir:?}"); } #[test] fn staticlib_emit_requires_an_export() { // embed_noentry_baseline has no `(export …)` fn. let fixture = workspace_root().join("examples") .join("embed_noentry_baseline.ail"); let outdir = std::env::temp_dir() .join(format!("ail-embed-noexp-{}", std::process::id())); std::fs::create_dir_all(&outdir).unwrap(); let out = Command::new(ail_bin()) .args(["build", fixture.to_str().unwrap(), "--emit=staticlib", "-o", outdir.to_str().unwrap()]) .output().expect("ail build"); assert!(!out.status.success(), "staticlib build with zero exports must fail"); assert!(String::from_utf8_lossy(&out.stderr) .contains("at least one `(export"), "expected the zero-export staticlib error; got {}", String::from_utf8_lossy(&out.stderr)); }