blob: 160accf743eabbbf8db00058daa342a45541d4be [file] [log] [blame]
// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use std::env::{self};
use std::path::{Path, PathBuf};
mod bindgen_gen;
use bindgen_gen::vaapi_gen_builder;
/// Environment variable that can be set to point to the directory containing the `va.h`, `va_drm.h` and `va_drmcommon.h`
/// files to use to generate the bindings.
const CROS_LIBVA_H_PATH_ENV: &str = "CROS_LIBVA_H_PATH";
const CROS_LIBVA_LIB_PATH_ENV: &str = "CROS_LIBVA_LIB_PATH";
/// Wrapper file to use as input of bindgen.
const WRAPPER_PATH: &str = "libva-wrapper.h";
fn main() {
// Do not require dependencies when generating docs.
if std::env::var("CARGO_DOC").is_ok() || std::env::var("DOCS_RS").is_ok() {
return;
}
let va_h_path = env::var(CROS_LIBVA_H_PATH_ENV).unwrap_or_default();
let va_lib_path = env::var(CROS_LIBVA_LIB_PATH_ENV).unwrap_or_default();
// Check the path exists.
if !va_h_path.is_empty() {
assert!(
Path::new(&va_h_path).exists(),
"{} doesn't exist",
va_h_path
);
}
if !va_lib_path.is_empty() {
assert!(
Path::new(&va_h_path).exists(),
"{} doesn't exist",
va_h_path
);
println!("cargo:rustc-link-arg=-Wl,-rpath={}", va_lib_path);
}
// Tell cargo to link va and va-drm objects dynamically.
println!("cargo:rustc-link-lib=dylib=va");
println!("cargo:rustc-link-lib=dylib=va-drm"); // for the vaGetDisplayDRM entrypoint
let mut bindings_builder = vaapi_gen_builder(bindgen::builder()).header(WRAPPER_PATH);
if !va_h_path.is_empty() {
bindings_builder = bindings_builder.clang_arg(format!("-I{}", va_h_path));
}
let bindings = bindings_builder
.generate()
.expect("unable to generate bindings");
let out_path = PathBuf::from(env::var("OUT_DIR").expect("`OUT_DIR` is not set"));
bindings
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings!");
}