allow building scrap with pkg-config libraries

Signed-off-by: Lauren N. Liberda <lauren@selfisekai.rocks>
This commit is contained in:
Lauren N. Liberda 2023-05-20 07:19:28 +02:00
parent 4b27bc6804
commit 100ea34baa
No known key found for this signature in database
GPG Key ID: 734C629FD04BD319
2 changed files with 31 additions and 1 deletions

View File

@ -12,6 +12,7 @@ edition = "2018"
[features] [features]
wayland = ["gstreamer", "gstreamer-app", "gstreamer-video", "dbus", "tracing"] wayland = ["gstreamer", "gstreamer-app", "gstreamer-video", "dbus", "tracing"]
mediacodec = ["ndk"] mediacodec = ["ndk"]
linux-pkg-config = ["dep:pkg-config"]
[dependencies] [dependencies]
block = "0.1" block = "0.1"
@ -43,6 +44,7 @@ quest = "0.3"
[build-dependencies] [build-dependencies]
target_build_utils = "0.3" target_build_utils = "0.3"
bindgen = "0.65" bindgen = "0.65"
pkg-config = { version = "0.3.27", optional = true }
[target.'cfg(target_os = "linux")'.dependencies] [target.'cfg(target_os = "linux")'.dependencies]
dbus = { version = "0.9", optional = true } dbus = { version = "0.9", optional = true }

View File

@ -1,8 +1,28 @@
use std::{ use std::{
env, fs, env, fs,
path::{Path, PathBuf}, path::{Path, PathBuf},
println,
}; };
#[cfg(all(target_os = "linux", feature = "linux-pkg-config"))]
fn link_pkg_config(name: &str) -> Vec<PathBuf> {
// sometimes an override is needed
let pc_name = match name {
"libvpx" => "vpx",
_ => name,
};
let lib = pkg_config::probe_library(pc_name)
.expect(format!(
"unable to find '{pc_name}' development headers with pkg-config (feature linux-pkg-config is enabled).
try installing '{pc_name}-dev' from your system package manager.").as_str());
lib.include_paths
}
#[cfg(not(all(target_os = "linux", feature = "linux-pkg-config")))]
fn link_pkg_config(_name: &str) -> Vec<PathBuf> {
unimplemented!()
}
/// Link vcppkg package. /// Link vcppkg package.
fn link_vcpkg(mut path: PathBuf, name: &str) -> PathBuf { fn link_vcpkg(mut path: PathBuf, name: &str) -> PathBuf {
let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap(); let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap();
@ -102,8 +122,16 @@ fn link_homebrew_m1(name: &str) -> PathBuf {
} }
/// Find package. By default, it will try to find vcpkg first, then homebrew(currently only for Mac M1). /// Find package. By default, it will try to find vcpkg first, then homebrew(currently only for Mac M1).
/// If building for linux and feature "linux-pkg-config" is enabled, will try to use pkg-config
/// unless check fails (e.g. NO_PKG_CONFIG_libyuv=1)
fn find_package(name: &str) -> Vec<PathBuf> { fn find_package(name: &str) -> Vec<PathBuf> {
if let Ok(vcpkg_root) = std::env::var("VCPKG_ROOT") { let no_pkg_config_var_name = format!("NO_PKG_CONFIG_{name}");
println!("cargo:rerun-if-env-changed={no_pkg_config_var_name}");
if cfg!(all(target_os = "linux", feature = "linux-pkg-config"))
&& std::env::var(no_pkg_config_var_name).as_deref() != Ok("1") {
link_pkg_config(name)
} else if let Ok(vcpkg_root) = std::env::var("VCPKG_ROOT") {
vec![link_vcpkg(vcpkg_root.into(), name)] vec![link_vcpkg(vcpkg_root.into(), name)]
} else { } else {
// Try using homebrew // Try using homebrew