librsvg_crate: Add a build.rs to find libcroco via pkg-config

This will also pull in libxml2 automatically.
parent 3939feb0
......@@ -591,6 +591,7 @@ dependencies = [
"cairo-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"glib 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
"pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
"rsvg_internals 0.0.1",
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
......
......@@ -3,6 +3,7 @@ name = "librsvg"
version = "0.0.1"
authors = ["Federico Mena Quintero <federico@gnome.org>"]
workspace = "../"
build = "build.rs"
[lib]
name = "librsvg"
......@@ -16,3 +17,6 @@ url = "1.7.2"
[dev-dependencies]
cairo-rs = { version = "0.5.0", features = ["png"] }
[build-dependencies]
pkg-config = "0.3.14"
extern crate pkg_config;
use std::env;
use std::io;
use std::io::prelude::*;
use std::process;
use pkg_config::{Config, Error};
fn main() {
// libcroco pulls in libxml2, so the first one is enough
if let Err(s) = find("libcroco-0.6", "0.6.1", &["croco-0.6"]) {
let _ = writeln!(io::stderr(), "{}", s);
process::exit(1);
}
}
// This is stolen from the -sys crates in gtk-rs
fn find(package_name: &str, version: &str, shared_libs: &[&str]) -> Result<(), Error> {
if let Ok(inc_dir) = env::var("GTK_INCLUDE_DIR") {
println!("cargo:include={}", inc_dir);
}
if let Ok(lib_dir) = env::var("GTK_LIB_DIR") {
for lib_ in shared_libs.iter() {
println!("cargo:rustc-link-lib=dylib={}", lib_);
}
println!("cargo:rustc-link-search=native={}", lib_dir);
return Ok(());
}
let target = env::var("TARGET").unwrap();
let hardcode_shared_libs = target.contains("windows");
let mut config = Config::new();
config.atleast_version(version);
config.print_system_libs(false);
if hardcode_shared_libs {
config.cargo_metadata(false);
}
match config.probe(package_name) {
Ok(library) => {
if let Ok(paths) = std::env::join_paths(library.include_paths) {
// Exposed to other build scripts as DEP_CAIRO_INCLUDE; use env::split_paths
println!("cargo:include={}", paths.to_string_lossy());
}
if hardcode_shared_libs {
for lib_ in shared_libs.iter() {
println!("cargo:rustc-link-lib=dylib={}", lib_);
}
for path in library.link_paths.iter() {
println!("cargo:rustc-link-search=native={}", path.to_str().unwrap());
}
}
Ok(())
}
Err(Error::EnvNoPkgConfig(_)) | Err(Error::Command { .. }) => {
for lib_ in shared_libs.iter() {
println!("cargo:rustc-link-lib=dylib={}", lib_);
}
Ok(())
}
Err(err) => Err(err),
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment