tectonic_bridge_graphite2 0.2.2

Expose the graphite2 library to Rust/Cargo.
Documentation
// Copyright 2020 the Tectonic Project
// Licensed under the MIT License.

//! graphite2 build script. For now, we always find it externally. One day, we'd
//! like to be able to vendor it.

use std::env;
use tectonic_dep_support::{Configuration, Dependency, Spec};

struct Graphite2Spec;

impl Spec for Graphite2Spec {
    fn get_pkgconfig_spec(&self) -> &str {
        "graphite2"
    }

    fn get_vcpkg_spec(&self) -> &[&str] {
        &["graphite2"]
    }
}

fn main() {
    let cfg = Configuration::default();
    let dep = Dependency::probe(Graphite2Spec, &cfg);

    // This is the key. What we print here will be propagated into depending
    // crates' build scripts as the environment variable
    // DEP_GRAPHITE2_INCLUDE_PATH, allowing them to find the headers internally.
    // If/when we start vendoring graphite2, this can become $OUT_DIR.

    let mut sep = "cargo:include-path=";

    dep.foreach_include_path(|p| {
        print!("{}{}", sep, p.to_str().unwrap());
        sep = ";";
    });

    println!();

    dep.emit();

    // As a special case, code that compiles against graphite2 must also
    // sometimes provide -DGRAPHITE2_STATIC. We'd prefer not to get into the
    // business of propagating arbitrary cflags through our build system, so we
    // indicate it with a specialized variable.

    let target = env::var("TARGET").unwrap();

    let rustflags = env::var("CARGO_ENCODED_RUSTFLAGS")
        .unwrap_or_else(|_| env::var("RUSTFLAGS").unwrap_or_default());

    let define_static_flag = if target.contains("-msvc") && rustflags.contains("+crt-static") {
        "1"
    } else {
        ""
    };

    println!("cargo:define_static={define_static_flag}");
}