1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2021 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker
5*bb4ee6a4SAndroid Build Coastguard Worker use std::env;
6*bb4ee6a4SAndroid Build Coastguard Worker use std::fs;
7*bb4ee6a4SAndroid Build Coastguard Worker use std::fs::File;
8*bb4ee6a4SAndroid Build Coastguard Worker use std::io::Write;
9*bb4ee6a4SAndroid Build Coastguard Worker use std::path::Path;
10*bb4ee6a4SAndroid Build Coastguard Worker use std::path::PathBuf;
11*bb4ee6a4SAndroid Build Coastguard Worker use std::process::Command;
12*bb4ee6a4SAndroid Build Coastguard Worker
13*bb4ee6a4SAndroid Build Coastguard Worker use anyhow::anyhow;
14*bb4ee6a4SAndroid Build Coastguard Worker use anyhow::bail;
15*bb4ee6a4SAndroid Build Coastguard Worker use anyhow::Context;
16*bb4ee6a4SAndroid Build Coastguard Worker use anyhow::Result;
17*bb4ee6a4SAndroid Build Coastguard Worker
is_native_build() -> bool18*bb4ee6a4SAndroid Build Coastguard Worker fn is_native_build() -> bool {
19*bb4ee6a4SAndroid Build Coastguard Worker env::var("HOST").unwrap() == env::var("TARGET").unwrap()
20*bb4ee6a4SAndroid Build Coastguard Worker }
21*bb4ee6a4SAndroid Build Coastguard Worker
use_system_minigbm() -> bool22*bb4ee6a4SAndroid Build Coastguard Worker fn use_system_minigbm() -> bool {
23*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rerun-if-env-changed=CROSVM_BUILD_VARIANT");
24*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rerun-if-env-changed=CROSVM_USE_SYSTEM_MINIGBM");
25*bb4ee6a4SAndroid Build Coastguard Worker env::var("CROSVM_BUILD_VARIANT").unwrap_or_default() == "chromeos"
26*bb4ee6a4SAndroid Build Coastguard Worker || env::var("CROSVM_USE_SYSTEM_MINIGBM").unwrap_or_else(|_| "0".to_string()) != "0"
27*bb4ee6a4SAndroid Build Coastguard Worker }
28*bb4ee6a4SAndroid Build Coastguard Worker
use_system_virglrenderer() -> bool29*bb4ee6a4SAndroid Build Coastguard Worker fn use_system_virglrenderer() -> bool {
30*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rerun-if-env-changed=CROSVM_BUILD_VARIANT");
31*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rerun-if-env-changed=CROSVM_USE_SYSTEM_VIRGLRENDERER");
32*bb4ee6a4SAndroid Build Coastguard Worker env::var("CROSVM_BUILD_VARIANT").unwrap_or_default() == "chromeos"
33*bb4ee6a4SAndroid Build Coastguard Worker || env::var("CROSVM_USE_SYSTEM_VIRGLRENDERER").unwrap_or_else(|_| "0".to_string()) != "0"
34*bb4ee6a4SAndroid Build Coastguard Worker }
35*bb4ee6a4SAndroid Build Coastguard Worker
36*bb4ee6a4SAndroid Build Coastguard Worker /// Returns the target triplet prefix for gcc commands. No prefix is required
37*bb4ee6a4SAndroid Build Coastguard Worker /// for native builds.
get_cross_compile_prefix() -> String38*bb4ee6a4SAndroid Build Coastguard Worker fn get_cross_compile_prefix() -> String {
39*bb4ee6a4SAndroid Build Coastguard Worker if is_native_build() {
40*bb4ee6a4SAndroid Build Coastguard Worker return String::from("");
41*bb4ee6a4SAndroid Build Coastguard Worker }
42*bb4ee6a4SAndroid Build Coastguard Worker
43*bb4ee6a4SAndroid Build Coastguard Worker let arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap();
44*bb4ee6a4SAndroid Build Coastguard Worker let os = env::var("CARGO_CFG_TARGET_OS").unwrap();
45*bb4ee6a4SAndroid Build Coastguard Worker let env = env::var("CARGO_CFG_TARGET_ENV").unwrap();
46*bb4ee6a4SAndroid Build Coastguard Worker format!("{}-{}-{}-", arch, os, env)
47*bb4ee6a4SAndroid Build Coastguard Worker }
48*bb4ee6a4SAndroid Build Coastguard Worker
49*bb4ee6a4SAndroid Build Coastguard Worker /// For cross-compilation with meson, we need to pick a cross-file, which
50*bb4ee6a4SAndroid Build Coastguard Worker /// live in /usr/local/share/meson/cross.
get_meson_cross_args() -> Vec<String>51*bb4ee6a4SAndroid Build Coastguard Worker fn get_meson_cross_args() -> Vec<String> {
52*bb4ee6a4SAndroid Build Coastguard Worker if is_native_build() {
53*bb4ee6a4SAndroid Build Coastguard Worker Vec::new()
54*bb4ee6a4SAndroid Build Coastguard Worker } else {
55*bb4ee6a4SAndroid Build Coastguard Worker vec![
56*bb4ee6a4SAndroid Build Coastguard Worker "--cross-file".to_string(),
57*bb4ee6a4SAndroid Build Coastguard Worker env::var("CARGO_CFG_TARGET_ARCH").unwrap(),
58*bb4ee6a4SAndroid Build Coastguard Worker ]
59*bb4ee6a4SAndroid Build Coastguard Worker }
60*bb4ee6a4SAndroid Build Coastguard Worker }
61*bb4ee6a4SAndroid Build Coastguard Worker
env_prepend_pkg_config_path(new_path: &Path) -> Result<()>62*bb4ee6a4SAndroid Build Coastguard Worker fn env_prepend_pkg_config_path(new_path: &Path) -> Result<()> {
63*bb4ee6a4SAndroid Build Coastguard Worker const KEY: &str = "PKG_CONFIG_PATH";
64*bb4ee6a4SAndroid Build Coastguard Worker let new_path_string = new_path
65*bb4ee6a4SAndroid Build Coastguard Worker .to_str()
66*bb4ee6a4SAndroid Build Coastguard Worker .ok_or(anyhow!("failed to convert path to string"))?;
67*bb4ee6a4SAndroid Build Coastguard Worker if let Ok(original_value) = env::var(KEY) {
68*bb4ee6a4SAndroid Build Coastguard Worker env::set_var(KEY, format!("{}:{}", new_path_string, original_value));
69*bb4ee6a4SAndroid Build Coastguard Worker } else {
70*bb4ee6a4SAndroid Build Coastguard Worker env::set_var(KEY, new_path);
71*bb4ee6a4SAndroid Build Coastguard Worker };
72*bb4ee6a4SAndroid Build Coastguard Worker Ok(())
73*bb4ee6a4SAndroid Build Coastguard Worker }
74*bb4ee6a4SAndroid Build Coastguard Worker
75*bb4ee6a4SAndroid Build Coastguard Worker /// Builds from pinned commit as static library and probes the generated pkgconfig file to emit
76*bb4ee6a4SAndroid Build Coastguard Worker /// cargo linking metadata
build_and_probe_minigbm(out_dir: &Path) -> Result<()>77*bb4ee6a4SAndroid Build Coastguard Worker fn build_and_probe_minigbm(out_dir: &Path) -> Result<()> {
78*bb4ee6a4SAndroid Build Coastguard Worker const SOURCE_DIR: &str = "../third_party/minigbm";
79*bb4ee6a4SAndroid Build Coastguard Worker let pkgconfig_file = out_dir.join("gbm.pc");
80*bb4ee6a4SAndroid Build Coastguard Worker
81*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rerun-if-changed={}", SOURCE_DIR);
82*bb4ee6a4SAndroid Build Coastguard Worker
83*bb4ee6a4SAndroid Build Coastguard Worker if !Path::new(SOURCE_DIR).join(".git").exists() {
84*bb4ee6a4SAndroid Build Coastguard Worker bail!(
85*bb4ee6a4SAndroid Build Coastguard Worker "{} source does not exist, did you forget to \
86*bb4ee6a4SAndroid Build Coastguard Worker `git submodule update --init`?",
87*bb4ee6a4SAndroid Build Coastguard Worker SOURCE_DIR
88*bb4ee6a4SAndroid Build Coastguard Worker );
89*bb4ee6a4SAndroid Build Coastguard Worker }
90*bb4ee6a4SAndroid Build Coastguard Worker
91*bb4ee6a4SAndroid Build Coastguard Worker // build static library
92*bb4ee6a4SAndroid Build Coastguard Worker let make_flags = env::var("CARGO_MAKEFLAGS").unwrap();
93*bb4ee6a4SAndroid Build Coastguard Worker let status = Command::new("make")
94*bb4ee6a4SAndroid Build Coastguard Worker .env("MAKEFLAGS", make_flags)
95*bb4ee6a4SAndroid Build Coastguard Worker .env("VERBOSE", "1")
96*bb4ee6a4SAndroid Build Coastguard Worker .env("CROSS_COMPILE", get_cross_compile_prefix())
97*bb4ee6a4SAndroid Build Coastguard Worker .env("PKG_CONFIG", "pkg-config")
98*bb4ee6a4SAndroid Build Coastguard Worker .arg(format!("OUT={}", out_dir.display()))
99*bb4ee6a4SAndroid Build Coastguard Worker .arg("CC_STATIC_LIBRARY(libminigbm.pie.a)")
100*bb4ee6a4SAndroid Build Coastguard Worker .current_dir(SOURCE_DIR)
101*bb4ee6a4SAndroid Build Coastguard Worker .status()?;
102*bb4ee6a4SAndroid Build Coastguard Worker if !status.success() {
103*bb4ee6a4SAndroid Build Coastguard Worker bail!("make failed with status: {}", status);
104*bb4ee6a4SAndroid Build Coastguard Worker }
105*bb4ee6a4SAndroid Build Coastguard Worker
106*bb4ee6a4SAndroid Build Coastguard Worker // copy headers to build output
107*bb4ee6a4SAndroid Build Coastguard Worker let src_dir = Path::new(SOURCE_DIR);
108*bb4ee6a4SAndroid Build Coastguard Worker fs::copy(src_dir.join("gbm.h"), out_dir.join("gbm.h"))?;
109*bb4ee6a4SAndroid Build Coastguard Worker fs::copy(
110*bb4ee6a4SAndroid Build Coastguard Worker src_dir.join("minigbm_helpers.h"),
111*bb4ee6a4SAndroid Build Coastguard Worker out_dir.join("minigbm_helpers.h"),
112*bb4ee6a4SAndroid Build Coastguard Worker )?;
113*bb4ee6a4SAndroid Build Coastguard Worker
114*bb4ee6a4SAndroid Build Coastguard Worker // minigbm will be linked using the name gbm, make sure it can be found.
115*bb4ee6a4SAndroid Build Coastguard Worker fs::copy(out_dir.join("libminigbm.pie.a"), out_dir.join("libgbm.a"))?;
116*bb4ee6a4SAndroid Build Coastguard Worker
117*bb4ee6a4SAndroid Build Coastguard Worker // write out a custom pkgconfig
118*bb4ee6a4SAndroid Build Coastguard Worker let mut conf = File::create(pkgconfig_file)?;
119*bb4ee6a4SAndroid Build Coastguard Worker let contents = format!(
120*bb4ee6a4SAndroid Build Coastguard Worker r#"prefix={install_dir}
121*bb4ee6a4SAndroid Build Coastguard Worker includedir=${{prefix}}
122*bb4ee6a4SAndroid Build Coastguard Worker libdir=${{prefix}}
123*bb4ee6a4SAndroid Build Coastguard Worker
124*bb4ee6a4SAndroid Build Coastguard Worker Name: libgbm
125*bb4ee6a4SAndroid Build Coastguard Worker Description: A small gbm implementation
126*bb4ee6a4SAndroid Build Coastguard Worker Version: 18.0.0
127*bb4ee6a4SAndroid Build Coastguard Worker Cflags: -I${{includedir}}
128*bb4ee6a4SAndroid Build Coastguard Worker Libs: -L${{libdir}} -lgbm
129*bb4ee6a4SAndroid Build Coastguard Worker Requires.private: libdrm >= 2.4.50
130*bb4ee6a4SAndroid Build Coastguard Worker "#,
131*bb4ee6a4SAndroid Build Coastguard Worker install_dir = out_dir.display()
132*bb4ee6a4SAndroid Build Coastguard Worker );
133*bb4ee6a4SAndroid Build Coastguard Worker conf.write_all(contents.as_bytes())?;
134*bb4ee6a4SAndroid Build Coastguard Worker
135*bb4ee6a4SAndroid Build Coastguard Worker // let pkg_config crate configure the cargo link metadata according to the custom pkgconfig
136*bb4ee6a4SAndroid Build Coastguard Worker // above
137*bb4ee6a4SAndroid Build Coastguard Worker env_prepend_pkg_config_path(out_dir)?;
138*bb4ee6a4SAndroid Build Coastguard Worker let mut config = pkg_config::Config::new();
139*bb4ee6a4SAndroid Build Coastguard Worker config.statik(true).probe("gbm")?;
140*bb4ee6a4SAndroid Build Coastguard Worker Ok(())
141*bb4ee6a4SAndroid Build Coastguard Worker }
142*bb4ee6a4SAndroid Build Coastguard Worker
minigbm() -> Result<()>143*bb4ee6a4SAndroid Build Coastguard Worker fn minigbm() -> Result<()> {
144*bb4ee6a4SAndroid Build Coastguard Worker if use_system_minigbm() {
145*bb4ee6a4SAndroid Build Coastguard Worker pkg_config::probe_library("gbm").context("pkgconfig failed to find gbm")?;
146*bb4ee6a4SAndroid Build Coastguard Worker } else {
147*bb4ee6a4SAndroid Build Coastguard Worker // Otherwise build from source and emit cargo build metadata
148*bb4ee6a4SAndroid Build Coastguard Worker let out_dir = PathBuf::from(env::var("OUT_DIR")?).join("minigbm");
149*bb4ee6a4SAndroid Build Coastguard Worker build_and_probe_minigbm(&out_dir).context("failed building minigbm")?;
150*bb4ee6a4SAndroid Build Coastguard Worker };
151*bb4ee6a4SAndroid Build Coastguard Worker Ok(())
152*bb4ee6a4SAndroid Build Coastguard Worker }
153*bb4ee6a4SAndroid Build Coastguard Worker
154*bb4ee6a4SAndroid Build Coastguard Worker /// Builds from pinned commit as static library and probes the generated pkgconfig file to emit
155*bb4ee6a4SAndroid Build Coastguard Worker /// cargo linking metadata
build_and_probe_virglrenderer(out_dir: &Path) -> Result<()>156*bb4ee6a4SAndroid Build Coastguard Worker fn build_and_probe_virglrenderer(out_dir: &Path) -> Result<()> {
157*bb4ee6a4SAndroid Build Coastguard Worker const SOURCE_DIR: &str = "../third_party/virglrenderer";
158*bb4ee6a4SAndroid Build Coastguard Worker let install_prefix = out_dir.join("installed");
159*bb4ee6a4SAndroid Build Coastguard Worker
160*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rerun-if-changed={}", SOURCE_DIR);
161*bb4ee6a4SAndroid Build Coastguard Worker
162*bb4ee6a4SAndroid Build Coastguard Worker if !Path::new(SOURCE_DIR).join(".git").exists() {
163*bb4ee6a4SAndroid Build Coastguard Worker bail!(
164*bb4ee6a4SAndroid Build Coastguard Worker "{} source does not exist, did you forget to \
165*bb4ee6a4SAndroid Build Coastguard Worker `git submodule update --init`?",
166*bb4ee6a4SAndroid Build Coastguard Worker SOURCE_DIR
167*bb4ee6a4SAndroid Build Coastguard Worker );
168*bb4ee6a4SAndroid Build Coastguard Worker }
169*bb4ee6a4SAndroid Build Coastguard Worker
170*bb4ee6a4SAndroid Build Coastguard Worker let mut platforms = vec!["egl"];
171*bb4ee6a4SAndroid Build Coastguard Worker if env::var("CARGO_FEATURE_X").is_ok() {
172*bb4ee6a4SAndroid Build Coastguard Worker platforms.push("glx");
173*bb4ee6a4SAndroid Build Coastguard Worker }
174*bb4ee6a4SAndroid Build Coastguard Worker
175*bb4ee6a4SAndroid Build Coastguard Worker // Ensures minigbm is available and that it's pkgconfig is locatable
176*bb4ee6a4SAndroid Build Coastguard Worker minigbm()?;
177*bb4ee6a4SAndroid Build Coastguard Worker
178*bb4ee6a4SAndroid Build Coastguard Worker let mut setup = Command::new("meson");
179*bb4ee6a4SAndroid Build Coastguard Worker setup
180*bb4ee6a4SAndroid Build Coastguard Worker .arg("setup")
181*bb4ee6a4SAndroid Build Coastguard Worker .current_dir(SOURCE_DIR)
182*bb4ee6a4SAndroid Build Coastguard Worker .arg("--prefix")
183*bb4ee6a4SAndroid Build Coastguard Worker .arg(install_prefix.as_os_str())
184*bb4ee6a4SAndroid Build Coastguard Worker .arg("--libdir")
185*bb4ee6a4SAndroid Build Coastguard Worker .arg("lib")
186*bb4ee6a4SAndroid Build Coastguard Worker .args(get_meson_cross_args())
187*bb4ee6a4SAndroid Build Coastguard Worker .arg(format!("-Dplatforms={}", platforms.join(",")))
188*bb4ee6a4SAndroid Build Coastguard Worker .arg("-Ddefault_library=static")
189*bb4ee6a4SAndroid Build Coastguard Worker .arg(out_dir.as_os_str());
190*bb4ee6a4SAndroid Build Coastguard Worker
191*bb4ee6a4SAndroid Build Coastguard Worker let setup_status = setup.status()?;
192*bb4ee6a4SAndroid Build Coastguard Worker if !setup_status.success() {
193*bb4ee6a4SAndroid Build Coastguard Worker bail!("meson setup failed with status: {}", setup_status);
194*bb4ee6a4SAndroid Build Coastguard Worker }
195*bb4ee6a4SAndroid Build Coastguard Worker
196*bb4ee6a4SAndroid Build Coastguard Worker let mut compile = Command::new("meson");
197*bb4ee6a4SAndroid Build Coastguard Worker compile
198*bb4ee6a4SAndroid Build Coastguard Worker .arg("compile")
199*bb4ee6a4SAndroid Build Coastguard Worker .arg("src/virglrenderer")
200*bb4ee6a4SAndroid Build Coastguard Worker .current_dir(out_dir);
201*bb4ee6a4SAndroid Build Coastguard Worker let compile_status = compile.status()?;
202*bb4ee6a4SAndroid Build Coastguard Worker if !compile_status.success() {
203*bb4ee6a4SAndroid Build Coastguard Worker bail!("meson compile failed with status: {}", compile_status);
204*bb4ee6a4SAndroid Build Coastguard Worker }
205*bb4ee6a4SAndroid Build Coastguard Worker
206*bb4ee6a4SAndroid Build Coastguard Worker let mut install = Command::new("meson");
207*bb4ee6a4SAndroid Build Coastguard Worker install.arg("install").current_dir(out_dir);
208*bb4ee6a4SAndroid Build Coastguard Worker let install_status = install.status()?;
209*bb4ee6a4SAndroid Build Coastguard Worker if !install_status.success() {
210*bb4ee6a4SAndroid Build Coastguard Worker bail!("meson install failed with status: {}", install_status);
211*bb4ee6a4SAndroid Build Coastguard Worker }
212*bb4ee6a4SAndroid Build Coastguard Worker
213*bb4ee6a4SAndroid Build Coastguard Worker let pkg_config_path = install_prefix.join("lib/pkgconfig");
214*bb4ee6a4SAndroid Build Coastguard Worker assert!(pkg_config_path.join("virglrenderer.pc").exists());
215*bb4ee6a4SAndroid Build Coastguard Worker
216*bb4ee6a4SAndroid Build Coastguard Worker // let pkg_config crate configure the cargo link metadata according to the generated pkgconfig
217*bb4ee6a4SAndroid Build Coastguard Worker env_prepend_pkg_config_path(pkg_config_path.as_path())?;
218*bb4ee6a4SAndroid Build Coastguard Worker let mut config = pkg_config::Config::new();
219*bb4ee6a4SAndroid Build Coastguard Worker config.statik(true).probe("virglrenderer")?;
220*bb4ee6a4SAndroid Build Coastguard Worker
221*bb4ee6a4SAndroid Build Coastguard Worker Ok(())
222*bb4ee6a4SAndroid Build Coastguard Worker }
223*bb4ee6a4SAndroid Build Coastguard Worker
virglrenderer() -> Result<()>224*bb4ee6a4SAndroid Build Coastguard Worker fn virglrenderer() -> Result<()> {
225*bb4ee6a4SAndroid Build Coastguard Worker if use_system_virglrenderer() && !use_system_minigbm() {
226*bb4ee6a4SAndroid Build Coastguard Worker bail!("Must use system minigbm if using system virglrenderer (try setting CROSVM_USE_SYSTEM_MINIGBM=1)");
227*bb4ee6a4SAndroid Build Coastguard Worker }
228*bb4ee6a4SAndroid Build Coastguard Worker
229*bb4ee6a4SAndroid Build Coastguard Worker // Use virglrenderer package from pkgconfig on ChromeOS builds
230*bb4ee6a4SAndroid Build Coastguard Worker if use_system_virglrenderer() {
231*bb4ee6a4SAndroid Build Coastguard Worker let lib = pkg_config::Config::new()
232*bb4ee6a4SAndroid Build Coastguard Worker .atleast_version("1.0.0")
233*bb4ee6a4SAndroid Build Coastguard Worker .probe("virglrenderer")
234*bb4ee6a4SAndroid Build Coastguard Worker .context("pkgconfig failed to find virglrenderer")?;
235*bb4ee6a4SAndroid Build Coastguard Worker if lib.defines.contains_key("VIRGL_RENDERER_UNSTABLE_APIS") {
236*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rustc-cfg=virgl_renderer_unstable");
237*bb4ee6a4SAndroid Build Coastguard Worker }
238*bb4ee6a4SAndroid Build Coastguard Worker } else {
239*bb4ee6a4SAndroid Build Coastguard Worker // Otherwise build from source.
240*bb4ee6a4SAndroid Build Coastguard Worker let out_dir = PathBuf::from(env::var("OUT_DIR")?).join("virglrenderer");
241*bb4ee6a4SAndroid Build Coastguard Worker build_and_probe_virglrenderer(&out_dir)?;
242*bb4ee6a4SAndroid Build Coastguard Worker }
243*bb4ee6a4SAndroid Build Coastguard Worker Ok(())
244*bb4ee6a4SAndroid Build Coastguard Worker }
245*bb4ee6a4SAndroid Build Coastguard Worker
gfxstream() -> Result<()>246*bb4ee6a4SAndroid Build Coastguard Worker fn gfxstream() -> Result<()> {
247*bb4ee6a4SAndroid Build Coastguard Worker if let Ok(gfxstream_path) = env::var("GFXSTREAM_PATH") {
248*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rustc-link-lib=gfxstream_backend");
249*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rustc-link-search={}", gfxstream_path);
250*bb4ee6a4SAndroid Build Coastguard Worker Ok(())
251*bb4ee6a4SAndroid Build Coastguard Worker } else {
252*bb4ee6a4SAndroid Build Coastguard Worker let gfxstream_lib = pkg_config::Config::new().probe("gfxstream_backend")?;
253*bb4ee6a4SAndroid Build Coastguard Worker
254*bb4ee6a4SAndroid Build Coastguard Worker if gfxstream_lib.defines.contains_key("GFXSTREAM_UNSTABLE") {
255*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rustc-cfg=gfxstream_unstable");
256*bb4ee6a4SAndroid Build Coastguard Worker }
257*bb4ee6a4SAndroid Build Coastguard Worker
258*bb4ee6a4SAndroid Build Coastguard Worker pkg_config::Config::new().probe("aemu_base")?;
259*bb4ee6a4SAndroid Build Coastguard Worker pkg_config::Config::new().probe("aemu_host_common")?;
260*bb4ee6a4SAndroid Build Coastguard Worker pkg_config::Config::new().probe("aemu_logging")?;
261*bb4ee6a4SAndroid Build Coastguard Worker pkg_config::Config::new().probe("aemu_snapshot")?;
262*bb4ee6a4SAndroid Build Coastguard Worker
263*bb4ee6a4SAndroid Build Coastguard Worker let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap();
264*bb4ee6a4SAndroid Build Coastguard Worker
265*bb4ee6a4SAndroid Build Coastguard Worker if target_os.contains("linux") {
266*bb4ee6a4SAndroid Build Coastguard Worker pkg_config::Config::new().probe("libdrm")?;
267*bb4ee6a4SAndroid Build Coastguard Worker }
268*bb4ee6a4SAndroid Build Coastguard Worker
269*bb4ee6a4SAndroid Build Coastguard Worker // Need to link against libc++ or libstdc++. Apple is clang-only, while by default other
270*bb4ee6a4SAndroid Build Coastguard Worker // Unix platforms use libstdc++.
271*bb4ee6a4SAndroid Build Coastguard Worker if target_os.contains("macos") {
272*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rustc-link-lib=dylib=c++");
273*bb4ee6a4SAndroid Build Coastguard Worker } else if target_os.contains("linux") || target_os.contains("nto") {
274*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rustc-link-lib=dylib=stdc++");
275*bb4ee6a4SAndroid Build Coastguard Worker }
276*bb4ee6a4SAndroid Build Coastguard Worker
277*bb4ee6a4SAndroid Build Coastguard Worker Ok(())
278*bb4ee6a4SAndroid Build Coastguard Worker }
279*bb4ee6a4SAndroid Build Coastguard Worker }
280*bb4ee6a4SAndroid Build Coastguard Worker
main() -> Result<()>281*bb4ee6a4SAndroid Build Coastguard Worker fn main() -> Result<()> {
282*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rustc-check-cfg=cfg(fence_passing_option1)");
283*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rustc-check-cfg=cfg(gfxstream_unstable)");
284*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rustc-check-cfg=cfg(virgl_renderer_unstable)");
285*bb4ee6a4SAndroid Build Coastguard Worker let mut use_fence_passing_option1 = true;
286*bb4ee6a4SAndroid Build Coastguard Worker
287*bb4ee6a4SAndroid Build Coastguard Worker // Skip installing dependencies when generating documents.
288*bb4ee6a4SAndroid Build Coastguard Worker if env::var("CARGO_DOC").is_ok() {
289*bb4ee6a4SAndroid Build Coastguard Worker return Ok(());
290*bb4ee6a4SAndroid Build Coastguard Worker }
291*bb4ee6a4SAndroid Build Coastguard Worker
292*bb4ee6a4SAndroid Build Coastguard Worker if env::var("CARGO_FEATURE_MINIGBM").is_ok() {
293*bb4ee6a4SAndroid Build Coastguard Worker minigbm()?;
294*bb4ee6a4SAndroid Build Coastguard Worker }
295*bb4ee6a4SAndroid Build Coastguard Worker
296*bb4ee6a4SAndroid Build Coastguard Worker if env::var("CARGO_FEATURE_VIRGL_RENDERER").is_ok() {
297*bb4ee6a4SAndroid Build Coastguard Worker virglrenderer()?;
298*bb4ee6a4SAndroid Build Coastguard Worker use_fence_passing_option1 = false;
299*bb4ee6a4SAndroid Build Coastguard Worker }
300*bb4ee6a4SAndroid Build Coastguard Worker
301*bb4ee6a4SAndroid Build Coastguard Worker if env::var("CARGO_FEATURE_GFXSTREAM").is_ok()
302*bb4ee6a4SAndroid Build Coastguard Worker && env::var("CARGO_FEATURE_GFXSTREAM_STUB").is_err()
303*bb4ee6a4SAndroid Build Coastguard Worker {
304*bb4ee6a4SAndroid Build Coastguard Worker gfxstream()?;
305*bb4ee6a4SAndroid Build Coastguard Worker }
306*bb4ee6a4SAndroid Build Coastguard Worker
307*bb4ee6a4SAndroid Build Coastguard Worker if use_fence_passing_option1 {
308*bb4ee6a4SAndroid Build Coastguard Worker println!("cargo:rustc-cfg=fence_passing_option1");
309*bb4ee6a4SAndroid Build Coastguard Worker }
310*bb4ee6a4SAndroid Build Coastguard Worker
311*bb4ee6a4SAndroid Build Coastguard Worker Ok(())
312*bb4ee6a4SAndroid Build Coastguard Worker }
313