filelock 0.7.0

Cross-platform file locking library for Rust
Documentation
use std::env;
use std::process::Command;

fn main() {
    println!("cargo:rerun-if-env-changed=RUSTC");
    println!("cargo:rerun-if-env-changed=FILELOCK_FORCE_BACKPORT");
    let version = rustc_version();
    let supports_check_cfg =
        matches!(version, Some((major, minor)) if major > 1 || (major == 1 && minor >= 80));
    if supports_check_cfg {
        println!("cargo:rustc-check-cfg=cfg(filelock_has_std_lock)");
        println!("cargo:rustc-check-cfg=cfg(filelock_std_lock)");
    }

    let has_std_lock =
        matches!(version, Some((major, minor)) if major > 1 || (major == 1 && minor >= 89));
    if has_std_lock {
        println!("cargo:rustc-cfg=filelock_has_std_lock");
    }

    let force_backport =
        matches!(env::var_os("FILELOCK_FORCE_BACKPORT"), Some(value) if value == "1");
    if has_std_lock && !force_backport {
        println!("cargo:rustc-cfg=filelock_std_lock");
    }
}

fn rustc_version() -> Option<(u32, u32)> {
    let rustc = env::var_os("RUSTC")?;
    let output = Command::new(rustc).arg("--version").output().ok()?;
    if !output.status.success() {
        return None;
    }

    let version = std::str::from_utf8(&output.stdout)
        .ok()?
        .split_whitespace()
        .nth(1)?;
    let mut components = version.split('.');
    let major = components.next()?.parse::<u32>().ok()?;
    let minor = components.next()?.parse::<u32>().ok()?;
    Some((major, minor))
}