use std::env;
use std::path::PathBuf;
const PLAYWRIGHT_VERSION: &str = "1.61.1";
include!("src/build_support/driver_assembly.rs");
fn main() {
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed=src/build_support/driver_assembly.rs");
println!("cargo:rerun-if-changed=src/build_support/driver_urls.rs");
println!("cargo:rerun-if-env-changed=PLAYWRIGHT_DRIVER_CACHE_DIR");
println!("cargo:rerun-if-env-changed=PLAYWRIGHT_SKIP_DRIVER_DOWNLOAD");
if env::var_os("DOCS_RS").is_some() || env::var_os("PLAYWRIGHT_SKIP_DRIVER_DOWNLOAD").is_some()
{
set_skipped_env_vars("skipped");
return;
}
let (drivers_dir, source) = match env::var_os("PLAYWRIGHT_DRIVER_CACHE_DIR") {
Some(dir) => (PathBuf::from(dir), "cache_dir"),
None => {
let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR set by Cargo"));
(out_dir.join("playwright-driver"), "out_dir")
}
};
println!("cargo:rustc-env=PLAYWRIGHT_DRIVER_DIR_SOURCE={source}");
let platform = detect_platform();
let driver_dir = drivers_dir.join(format!("playwright-{PLAYWRIGHT_VERSION}-{platform}"));
if driver_dir.exists() {
set_output_env_vars(&driver_dir, platform);
return;
}
println!(
"cargo:warning=Assembling Playwright driver {PLAYWRIGHT_VERSION} (Node {NODE_VERSION}) for {platform}..."
);
match assemble_driver(&driver_dir, PLAYWRIGHT_VERSION, platform) {
Ok(()) => {
println!(
"cargo:warning=Playwright driver assembled at {}",
driver_dir.display()
);
set_output_env_vars(&driver_dir, platform);
}
Err(e) => {
println!("cargo:warning=Failed to assemble Playwright driver: {e}");
println!(
"cargo:warning=Set PLAYWRIGHT_DRIVER_PATH to a driver directory, or install one via npm."
);
set_skipped_env_vars("failed");
}
}
}
fn detect_platform() -> &'static str {
let os = env::consts::OS;
let arch = env::consts::ARCH;
playwright_platform(os, arch).unwrap_or_else(|| {
println!("cargo:warning=Unsupported platform: {os} {arch}");
println!("cargo:warning=Defaulting to linux platform");
"linux"
})
}
fn set_skipped_env_vars(reason: &str) {
println!("cargo:rustc-env=PLAYWRIGHT_DRIVER_DIR=");
println!("cargo:rustc-env=PLAYWRIGHT_DRIVER_VERSION={PLAYWRIGHT_VERSION}");
println!(
"cargo:rustc-env=PLAYWRIGHT_DRIVER_PLATFORM={}",
detect_platform()
);
println!("cargo:rustc-env=PLAYWRIGHT_DRIVER_DIR_SOURCE={reason}");
}
fn set_output_env_vars(driver_dir: &std::path::Path, platform: &str) {
println!(
"cargo:rustc-env=PLAYWRIGHT_DRIVER_DIR={}",
driver_dir.display()
);
println!(
"cargo:rustc-env=PLAYWRIGHT_DRIVER_VERSION={}",
PLAYWRIGHT_VERSION
);
println!("cargo:rustc-env=PLAYWRIGHT_DRIVER_PLATFORM={}", platform);
let node_exe = if cfg!(windows) {
driver_dir.join("node.exe")
} else {
driver_dir.join("node")
};
if node_exe.exists() {
println!("cargo:rustc-env=PLAYWRIGHT_NODE_EXE={}", node_exe.display());
}
let cli_js = driver_dir.join("package").join("cli.js");
if cli_js.exists() {
println!("cargo:rustc-env=PLAYWRIGHT_CLI_JS={}", cli_js.display());
}
}