use std::env;
use std::io::{Error, ErrorKind};
use std::path::Path;
use std::process::Command;
fn make_and_install(source_dir: &str, build_dir: &str, install_dir: &str) -> std::io::Result<()> {
let cmake_install_prefix = format!("-DCMAKE_INSTALL_PREFIX={}", install_dir);
let cmake_prefix_path = format!("-DCMAKE_PREFIX_PATH={}", install_dir);
for iceoryx_component in &["iceoryx_hoofs", "iceoryx_posh"] {
let component_source_dir = format!("{}/{}", source_dir, iceoryx_component);
let component_build_dir = format!("{}/{}", build_dir, iceoryx_component);
if !Command::new("mkdir")
.args(&["-p", &component_build_dir])
.status()?
.success()
{
return Err(Error::new(
ErrorKind::Other,
format!("Could not create build dir for '{}'!", iceoryx_component),
));
}
if !Command::new("cmake")
.current_dir(&component_build_dir)
.args(&[
"-DCMAKE_BUILD_TYPE=Release",
"-DBUILD_SHARED_LIBS=OFF",
"-DROUDI_ENVIRONMENT=ON",
&cmake_prefix_path,
&cmake_install_prefix,
&component_source_dir,
])
.status()?
.success()
{
return Err(Error::new(
ErrorKind::Other,
format!("Could not run cmake for '{}'!", iceoryx_component),
));
}
if !Command::new("cmake")
.current_dir(&component_build_dir)
.args(&["--build", ".", "--target", "install"])
.status()?
.success()
{
return Err(Error::new(
ErrorKind::Other,
format!("Could not build '{}'!", iceoryx_component),
));
}
}
Ok(())
}
fn clone_repo(repo: &str, branch: &str, source_dir: &str) -> std::io::Result<()> {
if !Path::new(source_dir).join(".git").exists() {
Command::new("git")
.args(&[
"clone",
repo,
&format!("--branch={}", branch),
"--recursive",
source_dir,
])
.output()
.map_err(|out| {
println!("{:?}", out);
out
})
.map(|out| println!("{:?}", out))?;
} else {
Command::new("git")
.current_dir(source_dir)
.args(&["checkout", branch])
.output()
.map_err(|out| {
println!("{:?}", out);
out
})
.map(|out| println!("{:?}", out))?;
}
Ok(())
}
fn main() -> std::io::Result<()> {
let out_dir = env::var("OUT_DIR").expect("Target output directory");
let iceoryx_source_dir = format!("{}/{}", out_dir, "iceoryx-git");
let iceoryx_build_dir = format!("{}/{}", out_dir, "iceoryx-build");
let iceoryx_install_dir = format!("{}/{}", out_dir, "iceoryx-install");
const ICEORYX_VERSION: &str = "v2.0.2";
const ICEORYX_GIT_BRANCH: &str = ICEORYX_VERSION;
clone_repo(
"https://github.com/eclipse-iceoryx/iceoryx.git",
ICEORYX_GIT_BRANCH,
&iceoryx_source_dir,
)?;
make_and_install(
&iceoryx_source_dir,
&iceoryx_build_dir,
&iceoryx_install_dir,
)?;
let iceoryx_include_dir = format!(
"{}/{}/iceoryx/{}",
iceoryx_install_dir, "include", ICEORYX_VERSION
);
let iceoryx_lib_dir = format!("{}/{}", iceoryx_install_dir, "lib");
#[cfg(not(any(target_os = "windows")))]
cpp_build::Config::new()
.include(iceoryx_include_dir)
.flag("-Wno-noexcept-type")
.flag("-std=c++17")
.build("src/lib.rs");
#[cfg(target_os = "windows")]
cpp_build::Config::new()
.include(iceoryx_include_dir)
.flag("/std:c++17")
.flag("/MD")
.build("src/lib.rs");
println!("cargo:rustc-link-search={}", iceoryx_lib_dir);
println!("cargo:rustc-link-lib=iceoryx_posh_testing");
println!("cargo:rustc-link-lib=iceoryx_posh_roudi");
println!("cargo:rustc-link-lib=iceoryx_posh");
println!("cargo:rustc-link-lib=iceoryx_hoofs");
println!("cargo:rustc-link-lib=iceoryx_platform");
#[cfg(target_os = "linux")]
println!("cargo:rustc-link-lib=acl");
#[cfg(not(any(target_os = "windows", target_os = "macos")))]
println!("cargo:rustc-link-lib=stdc++");
#[cfg(any(target_os = "macos"))]
println!("cargo:rustc-link-lib=c++");
Ok(())
}