| // Copyright 2019 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| /// Minijail's build script invoked by cargo. |
| /// |
| /// This script prefers linking against a pkg-config provided libminijail, but will fall back to |
| /// building libminijail statically. |
| use std::env; |
| use std::io; |
| use std::process::Command; |
| |
| fn main() -> io::Result<()> { |
| // Minijail requires libcap at runtime. |
| pkg_config::Config::new().probe("libcap").unwrap(); |
| |
| // Prefer a system-provided Minijail library. |
| if pkg_config::Config::new().probe("libminijail").is_ok() { |
| return Ok(()); |
| } |
| |
| let current_dir = env::var("CARGO_MANIFEST_DIR").unwrap() + "/../.."; |
| let out_dir = env::var("OUT_DIR").unwrap(); |
| let profile = env::var("PROFILE").unwrap(); |
| |
| let status = Command::new("make") |
| .current_dir(&out_dir) |
| .env("OUT", &out_dir) |
| .env("MODE", if profile == "release" { "opt" } else { "debug" }) |
| .arg("-C") |
| .arg(¤t_dir) |
| .arg("CC_STATIC_LIBRARY(libminijail.pic.a)") |
| .status()?; |
| if !status.success() { |
| std::process::exit(status.code().unwrap_or(1)); |
| } |
| println!("cargo:rustc-link-search=native={}", &out_dir); |
| println!("cargo:rustc-link-lib=static=minijail.pic"); |
| Ok(()) |
| } |