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