1 // x11-rs: Rust bindings for X11 libraries
2 // The X11 libraries are available under the MIT license.
3 // These bindings are public domain.
4 
5 extern crate pkg_config;
6 
7 use std::env;
8 use std::fs::File;
9 use std::io::Write;
10 use std::path::Path;
11 
main()12 fn main() {
13     let libraries = [
14         // lib           pkgconfig name
15         ("xext",        "xext"),
16         ("gl",          "gl"),
17         ("xcursor",     "xcursor"),
18         ("xxf86vm",     "xxf86vm"),
19         ("xft",         "xft"),
20         ("xinerama",    "xinerama"),
21         ("xi",          "xi"),
22         ("x11",         "x11"),
23         ("xlib_xcb",    "x11-xcb"),
24         ("xmu",         "xmu"),
25         ("xrandr",      "xrandr"),
26         ("xtst",        "xtst"),
27         ("xrender",     "xrender"),
28         ("xscrnsaver",  "xscrnsaver"),
29         ("xt",          "xt"),
30     ];
31 
32     let mut config = String::new();
33     for &(lib, pcname) in libraries.iter() {
34         let libdir = match pkg_config::get_variable(pcname, "libdir") {
35             Ok(libdir) => format!("Some(\"{}\")", libdir),
36             Err(_) => "None".to_string(),
37         };
38         config.push_str(&format!("pub const {}: Option<&'static str> = {};\n", lib, libdir));
39     }
40     let config = format!("pub mod config {{ pub mod libdir {{\n{}}}\n}}", config);
41     let out_dir = env::var("OUT_DIR").unwrap();
42     let dest_path = Path::new(&out_dir).join("config.rs");
43     let mut f = File::create(&dest_path).unwrap();
44     f.write_all(&config.into_bytes()).unwrap();
45 
46     let target = env::var("TARGET").unwrap();
47     if target.contains("linux") {
48         println!("cargo:rustc-link-lib=dl");
49     } else if target.contains("freebsd") || target.contains("dragonfly") {
50         println!("cargo:rustc-link-lib=c");
51     }
52 }
53