extern crate cc;
#[cfg(feature = "egl")] extern crate gl_generator;
use std::env;
use std::path::PathBuf;
mod build_data;
fn main() {
build_angle();
generate_bindings();
}
fn build_angle() {
let target = env::var("TARGET").unwrap();
let egl = env::var("CARGO_FEATURE_EGL").is_ok() && target.contains("windows");
let data = if egl { build_data::EGL } else { build_data::TRANSLATOR };
let repo = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap());
env::set_current_dir(repo).unwrap();
let mut build = cc::Build::new();
for &(k, v) in data.defines {
build.define(k, v);
}
for file in data.includes {
build.include(fixup_path(file));
}
for file in data.sources {
build.file(fixup_path(file));
}
for &(os, source) in &[
("darwin", "gfx/angle/checkout/src/common/system_utils_mac.cpp"),
("linux", "gfx/angle/checkout/src/common/system_utils_linux.cpp"),
("windows", "gfx/angle/checkout/src/common/system_utils_win.cpp"),
] {
if target.contains(os) {
build.file(source);
break
}
}
build
.file("src/shaders/glslang-c.cpp")
.cpp(true)
.warnings(false)
.flag("-std=c++11")
.flag_if_supported("-msse2") .flag_if_supported("-arch:SSE2") .compile("angle");
for lib in data.os_libs {
println!("cargo:rustc-link-lib={}", lib);
}
println!("cargo:rerun-if-changed=src/shaders/glslang-c.cpp");
println!("cargo:rerun-if-changed=gfx");
}
fn fixup_path(path: &str) -> String {
let prefix = "../../";
assert!(path.starts_with(prefix));
format!("gfx/angle/{}", &path[prefix.len()..])
}
#[cfg(not(feature = "egl"))]
fn generate_bindings() {}
#[cfg(feature = "egl")]
fn generate_bindings() {
use gl_generator::{Registry, Api, Profile, Fallbacks};
use std::fs::File;
let target = env::var("TARGET").unwrap();
if !target.contains("windows") {
return
}
let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap());
let mut file = File::create(&out_dir.join("egl_bindings.rs")).unwrap();
Registry::new(Api::Egl, (1, 5), Profile::Core, Fallbacks::All, [
"EGL_ANGLE_device_d3d",
"EGL_EXT_platform_base",
"EGL_EXT_platform_device",
"EGL_KHR_create_context",
"EGL_EXT_create_context_robustness",
"EGL_KHR_create_context_no_error",
])
.write_bindings(gl_generator::StaticGenerator, &mut file)
.unwrap();
let mut file = File::create(&out_dir.join("gles_bindings.rs")).unwrap();
Registry::new(Api::Gles2, (2, 0), Profile::Core, Fallbacks::None, [])
.write_bindings(gl_generator::StaticGenerator, &mut file)
.unwrap();
}