1use std::{
2 collections::HashMap,
3 path::{Path, PathBuf},
4 process::{Command, Stdio},
5};
6
7use anyhow::Result;
8
9use crate::{
10 cli::pretty,
11 config::{brick::BrickLang, lib::Lib, overrides::OverrideDatabase},
12};
13
14use super::tools::{get_archiver, get_compiler};
15
16pub fn binary(
17 libs: &HashMap<String, Lib>,
18 compile_paths: &[PathBuf],
19 target: &Path,
20 override_db: &OverrideDatabase,
21 ldflags: &str,
22 lang: BrickLang,
23 silent: bool,
24) -> Result<Option<PathBuf>> {
25 if !silent {
26 pretty::msg("link", target.display());
27 }
28
29 let mut cmd = &mut Command::new(get_compiler(lang));
30 cmd = cmd.stderr(Stdio::inherit());
31
32 for path in compile_paths {
33 cmd = cmd.arg(path);
34 }
35
36 for (name, lib) in libs {
37 cmd = cmd.args(lib.lib_links(name, override_db)?.split(" "));
38 cmd = cmd.args(lib.headers(name, override_db)?.split(" "));
39 }
40
41 cmd.args(ldflags.split_whitespace().collect::<Vec<&str>>());
42
43 cmd = cmd.arg("-o").arg(target);
44
45 let _status = cmd.status()?;
46
47 Ok(Some(target.to_path_buf()))
48}
49
50pub fn library(
51 libs: &HashMap<String, Lib>,
52 compile_paths: &[PathBuf],
53 target: &Path,
54 override_db: &OverrideDatabase,
55 ldflags: &str,
56 _lang: BrickLang,
57 silent: bool,
58) -> Result<Option<PathBuf>> {
59 if !silent {
60 pretty::msg("link", target.display());
61 }
62
63 let mut cmd = &mut Command::new(get_archiver());
64 cmd = cmd.stderr(Stdio::inherit()).arg("crus").arg(target);
65
66 for path in compile_paths {
67 cmd = cmd.arg(path);
68 }
69
70 for (name, lib) in libs {
71 cmd = cmd.args(lib.lib_links(name, override_db)?.split(" "));
72 cmd = cmd.args(lib.headers(name, override_db)?.split(" "));
73 }
74
75 cmd.args(ldflags.split_whitespace().collect::<Vec<&str>>());
76
77 let _status = cmd.status()?;
78
79 Ok(Some(target.to_path_buf()))
80}