fn musl_copyright_line(text: &str) -> String {
text.lines()
.find_map(|line| line.strip_prefix("Copyright © "))
.expect("licences/musl/COPYRIGHT must state its own copyright line")
.trim()
.to_owned()
}
fn extra_packages() -> Vec<list_my_licence::build::ResolvedPackage> {
let manifest_dir =
std::path::PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap());
let musl_dir = manifest_dir.join("licences/musl");
let musl_copyright = std::fs::read_to_string(musl_dir.join("COPYRIGHT"))
.expect("licences/musl/COPYRIGHT must exist");
vec![list_my_licence::build::ResolvedPackage {
name: "musl".into(),
version: "1.2.5".into(),
manifest_dir: musl_dir,
licence: Some("MIT".into()),
licence_file: None,
authors: vec![musl_copyright_line(&musl_copyright)],
repository: Some("https://git.musl-libc.org/cgit/musl".into()),
}]
}
fn refresh_or_check_copyright(
outcome: &list_my_licence::build::Outcome,
checking: bool,
) -> std::io::Result<()> {
let packages: Vec<list_my_licence::build::Reproduced<'_>> = outcome
.packages
.iter()
.map(|(package, verdict)| (package, verdict))
.collect();
let expected = list_my_licence::build::Emitter::dep5(&packages);
let path = std::path::Path::new("debian/copyright");
if !checking {
if let Some(parent) = path.parent() {
std::fs::create_dir_all(parent)?;
}
return std::fs::write(path, expected);
}
match std::fs::read_to_string(path) {
Ok(found) if found == expected => Ok(()),
_ => Err(std::io::Error::other(format!(
"{} is missing or out of date",
path.display()
))),
}
}
fn targets_musl() -> bool {
std::env::var("TARGET").is_ok_and(|target| target.ends_with("-musl"))
}
fn strip_musl_from_embedding(checking: bool) {
if targets_musl() {
return;
}
if let Err(error) = list_my_licence::build::Builder::new()
.checking(checking)
.run()
{
panic!("{error}");
}
}
fn main() {
let checking = std::env::var_os("CI").is_some();
let outcome = match list_my_licence::build::Builder::new()
.publish("THIRDPARTY.md")
.checking(checking)
.extra(extra_packages())
.run()
{
Ok(outcome) => outcome,
Err(error) => panic!("{error}"),
};
if let Err(error) = refresh_or_check_copyright(&outcome, checking) {
panic!("{error}");
}
strip_musl_from_embedding(checking);
}