#[cfg(feature = "mysql-admutils-compatibility")] use anyhow::anyhow; #[cfg(feature = "mysql-admutils-compatibility")] use std::{env, os::unix::fs::symlink, path::PathBuf}; fn get_git_commit() -> Option { let repo = git2::Repository::discover(".").ok()?; let head = repo.head().ok()?; let commit = head.peel_to_commit().ok()?; Some(commit.id().to_string()) } fn embed_build_time_info() { let commit = option_env!("GIT_COMMIT") .map(|s| s.to_string()) .or_else(get_git_commit) .unwrap_or_else(|| "unknown".to_string()); let build_profile = std::env::var("OUT_DIR") .unwrap_or_else(|_| "unknown".to_string()) .split(std::path::MAIN_SEPARATOR) .nth_back(3) .unwrap_or("unknown") .to_string(); println!("cargo:rustc-env=GIT_COMMIT={}", commit); println!("cargo:rustc-env=BUILD_PROFILE={}", build_profile); } fn generate_mysql_admutils_symlinks() -> anyhow::Result<()> { // NOTE: This is slightly illegal, and depends on implementation details. // But it is only here for ease of testing the compatibility layer, // and not critical in any way. Considering the code is never going // to be used as a library, it should be fine. let target_profile_dir: PathBuf = PathBuf::from(env::var("OUT_DIR")?) .parent() .and_then(|p| p.parent()) .and_then(|p| p.parent()) .ok_or(anyhow!("Could not resolve target profile directory"))? .to_path_buf(); if !target_profile_dir.exists() { std::fs::create_dir_all(&target_profile_dir)?; } if !target_profile_dir.join("mysql-useradm").exists() { symlink( PathBuf::from("./muscl"), target_profile_dir.join("mysql-useradm"), ) .ok(); } if !target_profile_dir.join("mysql-dbadm").exists() { symlink( PathBuf::from("./muscl"), target_profile_dir.join("mysql-dbadm"), ) .ok(); } Ok(()) } fn main() -> anyhow::Result<()> { #[cfg(feature = "mysql-admutils-compatibility")] generate_mysql_admutils_symlinks()?; embed_build_time_info(); Ok(()) }