const FLAGS: &[&str] = &[
"-w",
"-fno-exceptions",
"-fno-strict-aliasing",
];
const DEFINES: &[(&str, &str)] = &[
("BASISD_SUPPORT_DXT1", "0"), ("BASISD_SUPPORT_PVRTC1", "0"),
("BASISD_SUPPORT_ATC", "0"),
("BASISD_SUPPORT_FXT1", "0"),
("BASISD_SUPPORT_PVRTC2", "0"),
];
const SRCS: &[&str] = &[
"vendor/basis_universal/encoder/basisu_astc_hdr_6x6_enc.cpp",
"vendor/basis_universal/encoder/basisu_astc_hdr_common.cpp",
"vendor/basis_universal/encoder/basisu_astc_ldr_common.cpp",
"vendor/basis_universal/encoder/basisu_astc_ldr_encode.cpp",
"vendor/basis_universal/encoder/basisu_backend.cpp",
"vendor/basis_universal/encoder/basisu_basis_file.cpp",
"vendor/basis_universal/encoder/basisu_bc7enc.cpp",
"vendor/basis_universal/encoder/basisu_comp.cpp",
"vendor/basis_universal/encoder/basisu_enc.cpp",
"vendor/basis_universal/encoder/basisu_etc.cpp",
"vendor/basis_universal/encoder/basisu_frontend.cpp",
"vendor/basis_universal/encoder/basisu_gpu_texture.cpp",
"vendor/basis_universal/encoder/basisu_kernels_sse.cpp",
"vendor/basis_universal/encoder/basisu_opencl.cpp",
"vendor/basis_universal/encoder/basisu_pvrtc1_4.cpp",
"vendor/basis_universal/encoder/basisu_resample_filters.cpp",
"vendor/basis_universal/encoder/basisu_resampler.cpp",
"vendor/basis_universal/encoder/basisu_ssim.cpp",
"vendor/basis_universal/encoder/basisu_uastc_enc.cpp",
"vendor/basis_universal/encoder/basisu_uastc_hdr_4x4_enc.cpp",
"vendor/basis_universal/encoder/basisu_wasm_api.cpp",
"vendor/basis_universal/encoder/basisu_wasm_transcoder_api.cpp",
"vendor/basis_universal/encoder/jpgd.cpp",
"vendor/basis_universal/encoder/pvpngreader.cpp",
"vendor/basis_universal/encoder/3rdparty/android_astc_decomp.cpp",
"vendor/basis_universal/encoder/3rdparty/tinyexr.cpp",
"vendor/basis_universal/transcoder/basisu_transcoder.cpp",
"vendor/basis_universal/zstd/zstd.c",
];
fn main() {
bindgen();
let target = std::env::var("TARGET").unwrap();
if target != "wasm32-unknown-unknown" {
compile_basisu_static();
} else {
panic!("basisu_c_sys doesn't support wasm32-unknown-unknown yet");
}
println!("cargo::rerun-if-changed=vendor/");
}
#[derive(Debug)]
struct MacroTypeCallbacks;
#[derive(Debug)]
struct WasmBoolRenameCallbacks;
impl bindgen::callbacks::ParseCallbacks for MacroTypeCallbacks {
fn int_macro(&self, name: &str, _value: i64) -> Option<bindgen::callbacks::IntKind> {
if name.starts_with("BU_COMP_FLAGS_") {
Some(bindgen::callbacks::IntKind::U64)
} else if name.starts_with("BU_EFFORT_") || name.starts_with("BU_QUALITY_") {
Some(bindgen::callbacks::IntKind::I32)
} else if name.starts_with("BTF_")
|| name.starts_with("TF_")
|| name.starts_with("DECODE_FLAGS_")
{
Some(bindgen::callbacks::IntKind::U32)
} else {
None
}
}
}
impl bindgen::callbacks::ParseCallbacks for WasmBoolRenameCallbacks {
fn item_name(&self, item_info: bindgen::callbacks::ItemInfo) -> Option<String> {
if item_info.name == "wasm_bool_t" {
Some("Bool32".to_string())
} else {
None
}
}
}
fn bindgen() {
let binding_file =
std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap()).join("basisu_api_common.rs");
bindgen::Builder::default()
.clang_args(&["-fvisibility=default"])
.header("vendor/basis_universal/encoder/basisu_wasm_api_common.h")
.use_core()
.allowlist_var("^(BU_QUALITY_.*)$")
.allowlist_var("^(BU_EFFORT_.*)$")
.allowlist_var("^(BU_COMP_FLAGS_.*)$")
.allowlist_var("^(BTF_.*)$")
.allowlist_var("^(TF_.*)$")
.allowlist_var("^(DECODE_FLAGS_.*)$")
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.parse_callbacks(Box::new(MacroTypeCallbacks))
.generate()
.expect("Unable to generate bindings")
.write_to_file(binding_file)
.expect("Couldn't write bindings!");
let binding_file =
std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap()).join("basisu_c_api.rs");
bindgen::Builder::default()
.clang_args(&["-fvisibility=default"])
.header("vendor/basis_universal/encoder/basisu_wasm_api.h")
.use_core()
.must_use_type("wasm_bool_t")
.new_type_alias("Bool32")
.allowlist_function("^(bu_.*)$")
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.parse_callbacks(Box::new(WasmBoolRenameCallbacks))
.generate()
.expect("Unable to generate bindings")
.write_to_file(binding_file)
.expect("Couldn't write bindings!");
let binding_file = std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap())
.join("basisu_c_transcoder_api.rs");
bindgen::Builder::default()
.clang_args(&["-fvisibility=default"])
.header("vendor/basis_universal/encoder/basisu_wasm_transcoder_api.h")
.use_core()
.must_use_type("wasm_bool_t")
.new_type_alias("Bool32")
.allowlist_function("^(bt_.*)$")
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.parse_callbacks(Box::new(WasmBoolRenameCallbacks))
.generate()
.expect("Unable to generate bindings")
.write_to_file(binding_file)
.expect("Couldn't write bindings!");
}
fn compile_basisu_static() {
let mut build = cc::Build::new();
let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap();
if target_os == "android" {
build.cpp_link_stdlib("c++_static").flag("-U_GNU_SOURCE");
}
build.cpp(true).std("c++17");
for f in FLAGS {
build.flag_if_supported(f);
}
for (define, value) in DEFINES {
build.define(define, *value);
}
build.files(SRCS).compile("basisu_c_api_vendor");
}