mirror of
https://github.com/italicsjenga/ash-molten.git
synced 2025-01-27 04:16:33 +11:00
parent
dd57ac272f
commit
74914007cc
4 changed files with 152 additions and 53 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -1,3 +1,4 @@
|
|||
/target
|
||||
**/*.rs.bk
|
||||
Cargo.lock
|
||||
Cargo.lock
|
||||
MoltenVK
|
|
@ -7,6 +7,7 @@ license = "MIT/Apache-2.0"
|
|||
readme = "README.md"
|
||||
keywords = ["vulkan", "metal"]
|
||||
repository = "https://github.com/EmbarkStudios/ash-molten"
|
||||
homepage = "https://github.com/EmbarkStudios/ash-molten"
|
||||
documentation = "https://docs.rs/ash-molten"
|
||||
|
||||
[dependencies]
|
||||
|
|
196
build.rs
196
build.rs
|
@ -1,58 +1,160 @@
|
|||
use std::path::PathBuf;
|
||||
// Iterator over target_os cfg flags
|
||||
fn target_os() -> impl Iterator<Item = String> {
|
||||
std::env::vars().filter_map(|(flag, val)| {
|
||||
const NAME: &'static str = "CARGO_CFG_TARGET_OS";
|
||||
if flag.starts_with(NAME) {
|
||||
Some(val)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
}
|
||||
// Features are not used inside build scripts, so we have to explicitly query them from the
|
||||
// enviroment
|
||||
fn is_external_enabled() -> bool {
|
||||
std::env::vars()
|
||||
.filter_map(|(flag, _)| {
|
||||
const NAME: &'static str = "CARGO_FEATURE_";
|
||||
if flag.starts_with(NAME) {
|
||||
let feature = flag.split(NAME).nth(1).expect("").to_string();
|
||||
println!("{:?}", feature);
|
||||
return Some(feature);
|
||||
#[cfg(any(target_os = "macos", target_os = "ios"))]
|
||||
mod mac {
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
// Features are not used inside build scripts, so we have to explicitly query them from the
|
||||
// enviroment
|
||||
pub(crate) fn is_external_enabled() -> bool {
|
||||
std::env::vars()
|
||||
.filter_map(|(flag, _)| {
|
||||
const NAME: &'static str = "CARGO_FEATURE_";
|
||||
if flag.starts_with(NAME) {
|
||||
let feature = flag.split(NAME).nth(1).expect("").to_string();
|
||||
println!("{:?}", feature);
|
||||
return Some(feature);
|
||||
}
|
||||
None
|
||||
})
|
||||
.find(|f| f == "EXTERNAL")
|
||||
.is_some()
|
||||
}
|
||||
|
||||
pub(crate) fn build_molten<P: AsRef<Path>>(target_dir: &P) -> &'static str {
|
||||
use std::{
|
||||
process::Command,
|
||||
sync::{
|
||||
atomic::{AtomicBool, Ordering},
|
||||
Arc,
|
||||
},
|
||||
};
|
||||
|
||||
let exit = Arc::new(AtomicBool::new(false));
|
||||
let wants_exit = exit.clone();
|
||||
|
||||
// Periodically emit log messages so that Travis doesn't make a sad
|
||||
let handle = std::thread::spawn(move || {
|
||||
let mut counter = 0;
|
||||
while !wants_exit.load(Ordering::Acquire) {
|
||||
std::thread::sleep(std::time::Duration::from_millis(100));
|
||||
counter += 100;
|
||||
|
||||
if counter >= 30 * 1000 {
|
||||
counter = 0;
|
||||
println!("still building MoltenVK");
|
||||
}
|
||||
}
|
||||
None
|
||||
})
|
||||
.find(|f| f == "EXTERNAL")
|
||||
.is_some()
|
||||
}
|
||||
fn main() {
|
||||
let supported_platforms = ["macos", "ios"];
|
||||
let is_mac_or_ios = target_os()
|
||||
.find(|target| supported_platforms.contains(&target.as_str()))
|
||||
.is_some();
|
||||
if !is_mac_or_ios {
|
||||
panic!("ash-molten can only be built on macOS or of iOS");
|
||||
}
|
||||
// The 'external' feature was not enabled. Molten will be built automaticaly.
|
||||
if !is_external_enabled() {
|
||||
let mut build = std::process::Command::new("bash")
|
||||
.arg("build_molten.sh")
|
||||
});
|
||||
|
||||
let git_status = if Path::new("MoltenVK").exists() {
|
||||
Command::new("git")
|
||||
.arg("pull")
|
||||
.spawn()
|
||||
.expect("failed to spawn git")
|
||||
.wait()
|
||||
.expect("failed to pull MoltenVK")
|
||||
} else {
|
||||
Command::new("git")
|
||||
.arg("clone")
|
||||
.arg("https://github.com/KhronosGroup/MoltenVK.git")
|
||||
.spawn()
|
||||
.expect("failed to spawn git")
|
||||
.wait()
|
||||
.expect("failed to clone MoltenVK")
|
||||
};
|
||||
|
||||
assert!(git_status.success(), "failed to clone MoltenVK");
|
||||
|
||||
let status = Command::new("sh")
|
||||
.current_dir("MoltenVK")
|
||||
.arg("fetchDependencies")
|
||||
.spawn()
|
||||
.expect("Unable to build molten");
|
||||
while build.try_wait().unwrap().is_none() {
|
||||
println!("Still building MoltenVK");
|
||||
std::thread::sleep(std::time::Duration::from_secs(30));
|
||||
.expect("failed to spawn fetchDependencies")
|
||||
.wait()
|
||||
.expect("failed to fetchDependencies");
|
||||
|
||||
assert!(status.success(), "failed to fetchDependencies");
|
||||
|
||||
// These (currently) match the identifiers used by moltenvk
|
||||
let (target_name, dir) = match std::env::var("CARGO_CFG_TARGET_OS") {
|
||||
Ok(target) => match target.as_ref() {
|
||||
"macos" => ("macos", "macOS"),
|
||||
"ios" => ("ios", "iOS"),
|
||||
target => panic!("unknown target '{}'", target),
|
||||
},
|
||||
Err(e) => panic!("failed to determinte target os '{}'", e),
|
||||
};
|
||||
|
||||
let status = Command::new("make")
|
||||
.current_dir("MoltenVK")
|
||||
.arg(target_name)
|
||||
.spawn()
|
||||
.expect("failed to spawn fetchDependencies")
|
||||
.wait()
|
||||
.expect("failed to fetchDependencies");
|
||||
|
||||
assert!(status.success(), "failed to fetchDependencies");
|
||||
|
||||
let src = {
|
||||
let mut pb = PathBuf::new();
|
||||
pb.push("MoltenVK");
|
||||
pb.push("Package/Release/MoltenVK");
|
||||
pb.push(dir);
|
||||
pb.push("static/libMoltenVK.a");
|
||||
pb
|
||||
};
|
||||
|
||||
let target = {
|
||||
let mut pb = PathBuf::new();
|
||||
pb.push(target_dir);
|
||||
pb.push(format!("lib{}MoltenVK.a", target_name));
|
||||
pb
|
||||
};
|
||||
|
||||
if let Err(e) = std::fs::copy(&src, &target) {
|
||||
panic!("failed to copy {:?} to {:?}: {}", src, target, e);
|
||||
}
|
||||
let project_dir =
|
||||
PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap()).join("native");
|
||||
println!("cargo:rustc-link-search=native={}", project_dir.display());
|
||||
|
||||
exit.store(true, Ordering::Release);
|
||||
handle.join().unwrap();
|
||||
target_name
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(any(target_os = "macos", target_os = "ios"))]
|
||||
fn main() {
|
||||
use crate::mac::*;
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
// The 'external' feature was not enabled. Molten will be built automaticaly.
|
||||
let target_name = if !is_external_enabled() {
|
||||
let target_dir = Path::new("native");
|
||||
|
||||
let target_name = build_molten(&target_dir);
|
||||
let project_dir = PathBuf::from(
|
||||
std::env::var("CARGO_MANIFEST_DIR").expect("unable to find env:CARGO_MANIFEST_DIR"),
|
||||
)
|
||||
.join(target_dir);
|
||||
println!("cargo:rustc-link-search=native={}", project_dir.display());
|
||||
|
||||
target_name
|
||||
} else if cfg!(target_os = "macos") {
|
||||
"macos"
|
||||
} else if cfg!(target_os = "ios") {
|
||||
"ios"
|
||||
} else {
|
||||
unreachable!();
|
||||
};
|
||||
|
||||
println!("cargo:rustc-link-lib=framework=Metal");
|
||||
println!("cargo:rustc-link-lib=framework=AppKit");
|
||||
println!("cargo:rustc-link-lib=framework=QuartzCore");
|
||||
println!("cargo:rustc-link-lib=framework=IOKit");
|
||||
println!("cargo:rustc-link-lib=framework=IOSurface");
|
||||
println!("cargo:rustc-link-lib=dylib=c++");
|
||||
println!("cargo:rustc-link-lib=static=MoltenVK");
|
||||
println!("cargo:rustc-link-lib=static={}MoltenVK", target_name);
|
||||
}
|
||||
|
||||
#[cfg(not(any(target_os = "macos", target_os = "ios")))]
|
||||
fn main() {
|
||||
eprintln!("ash-molten requires either 'macos' or 'ios' target");
|
||||
}
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
git clone https://github.com/KhronosGroup/MoltenVK.git
|
||||
cd MoltenVK
|
||||
sh fetchDependencies
|
||||
make macos
|
||||
cp Package/Release/MoltenVK/macOS/static/libMoltenVK.a ../native
|
Loading…
Add table
Reference in a new issue