clippers 0.1.0

Cross-platform clipboard management library
use std::{path::Path, process::Command};

use build_cfg::{build_cfg, build_cfg_main};

#[build_cfg_main]
fn main() {
	println!("cargo:rustc-rerun-if-changed=build.rs");
	println!("cargo:rustc-rerun-if-changed=src/wrapper.cpp");
	println!("cargo:rustc-rerun-if-changed=src/wrapper.hpp");

	let out = std::env::var("OUT_DIR").unwrap();
	let out = Path::new(&out);
	let out = out.join("clippers-clip-git");

	if !out.is_dir() {
		let output = Command::new("git")
			.args(&["clone", "https://github.com/WilliamVenner/clip.git"])
			.arg(&out)
			.output()
			.unwrap();

		if !output.status.success() {
			panic!("Failed to clone clip (code {:?})\n\n============= STDOUT =============\n{}\n============= STDERR =============\n{}", output.status, String::from_utf8_lossy(&output.stdout), String::from_utf8_lossy(&output.stderr));
		}
	}

	if build_cfg!(target_os = "linux") {
		// No idea why Linux needs this, I gave up caring.
		if build_cfg!(target_pointer_width = "64") {
			println!("cargo:rustc-link-search=native=/usr/lib/x86_64-linux-gnu");
		} else if build_cfg!(target_pointer_width = "32") {
			println!("cargo:rustc-link-search=native=/usr/lib/i686-linux-gnu");
		}

		println!("cargo:rustc-link-lib=static=z");
		println!("cargo:rustc-link-lib=static=png");
		println!("cargo:rustc-link-lib=static=Xdmcp");
		println!("cargo:rustc-link-lib=static=Xau");
		println!("cargo:rustc-link-lib=static=xcb");
	} else if build_cfg!(target_os = "windows") {
		println!("cargo:rustc-link-lib=User32");
		println!("cargo:rustc-link-lib=Ole32");
		println!("cargo:rustc-link-lib=Shlwapi");
	} else if build_cfg!(target_os = "macos") {
		println!("cargo:rustc-link-lib=framework=AppKit");
	}

	let dst = cmake::Config::new(&out)
		.define("CLIP_EXAMPLES", "OFF")
		.define("CLIP_TESTS", "OFF")
		.build_target("clip")
		.build();

	if build_cfg!(target_os = "windows") {
		if cfg!(debug_assertions) {
			println!(
				"cargo:rustc-link-search=native={}/build/Debug",
				dst.display()
			);
		} else {
			println!(
				"cargo:rustc-link-search=native={}/build/Release",
				dst.display()
			);
		}
	} else {
		println!("cargo:rustc-link-search=native={}/build", dst.display());
	}
	println!("cargo:rustc-link-lib=static=clip");

	let mut cc = cc::Build::new();

	if build_cfg!(target_os = "macos") {
		cc.flag("-std=c++14");
	}

	cc.cpp(true)
		.static_flag(true)
		.shared_flag(false)
		.warnings_into_errors(true)
		.cargo_metadata(true)
		.file("src/wrapper.cpp")
		.include("src")
		.include(&out)
		.compile("clippers_wrapper");
}