extern crate cc; use std::env; use std::fs; use std::path::PathBuf; fn main() { let target = env::var("TARGET").unwrap(); let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap()); let lib_version = env::var("CARGO_PKG_VERSION") .unwrap() .split('+') .nth(1) .unwrap() .to_string(); let major = lib_version .split('.') .nth(0) .unwrap() .parse::() .unwrap(); let minor = lib_version .split('.') .nth(1) .unwrap() .parse::() .unwrap(); let patch = lib_version .split('.') .nth(2) .unwrap() .parse::() .unwrap(); let ver = fs::read_to_string("nghttp2/lib/includes/nghttp2/nghttp2ver.h.in") .unwrap() .replace("@PACKAGE_VERSION@", &lib_version) .replace( "@PACKAGE_VERSION_NUM@", &format!("0x{:02x}{:02x}{:02x}", major, minor, patch), ); let install = out_dir.join("i"); let include = install.join("include"); let lib = install.join("lib"); let pkgconfig = lib.join("pkgconfig"); fs::create_dir_all(include.join("nghttp2")).unwrap(); fs::create_dir_all(&pkgconfig).unwrap(); fs::write(include.join("nghttp2/nghttp2ver.h"), ver).unwrap(); let mut cfg = cc::Build::new(); cfg.include("nghttp2/lib/includes") .include(&include) .file("nghttp2/lib/sfparse.c") .file("nghttp2/lib/nghttp2_alpn.c") .file("nghttp2/lib/nghttp2_buf.c") .file("nghttp2/lib/nghttp2_callbacks.c") .file("nghttp2/lib/nghttp2_debug.c") .file("nghttp2/lib/nghttp2_extpri.c") .file("nghttp2/lib/nghttp2_frame.c") .file("nghttp2/lib/nghttp2_hd.c") .file("nghttp2/lib/nghttp2_hd_huffman.c") .file("nghttp2/lib/nghttp2_hd_huffman_data.c") .file("nghttp2/lib/nghttp2_helper.c") .file("nghttp2/lib/nghttp2_http.c") .file("nghttp2/lib/nghttp2_map.c") .file("nghttp2/lib/nghttp2_mem.c") .file("nghttp2/lib/nghttp2_option.c") .file("nghttp2/lib/nghttp2_outbound_item.c") .file("nghttp2/lib/nghttp2_pq.c") .file("nghttp2/lib/nghttp2_priority_spec.c") .file("nghttp2/lib/nghttp2_queue.c") .file("nghttp2/lib/nghttp2_rcbuf.c") .file("nghttp2/lib/nghttp2_session.c") .file("nghttp2/lib/nghttp2_stream.c") .file("nghttp2/lib/nghttp2_submit.c") .file("nghttp2/lib/nghttp2_version.c") .file("nghttp2/lib/nghttp2_ratelim.c") .file("nghttp2/lib/nghttp2_time.c") .warnings(false) .define("NGHTTP2_STATICLIB", None) .define("HAVE_NETINET_IN", None) .define("HAVE_TIME_H", None) .out_dir(&lib); if target.contains("windows") { // Apparently MSVC doesn't have `ssize_t` defined as a type if target.contains("msvc") { match &env::var("CARGO_CFG_TARGET_POINTER_WIDTH").unwrap()[..] { "64" => { cfg.define("ssize_t", "int64_t"); } "32" => { cfg.define("ssize_t", "int32_t"); } s => panic!("unknown pointer size: {}", s), } } } else { cfg.define("HAVE_ARPA_INET_H", None); } cfg.compile("nghttp2"); println!("cargo:root={}", install.display()); let pc = fs::read_to_string("nghttp2/lib/libnghttp2.pc.in") .unwrap() .replace("@prefix@", install.to_str().unwrap()) .replace("@exec_prefix@", "") .replace("@libdir@", lib.to_str().unwrap()) .replace("@includedir@", include.to_str().unwrap()) .replace("@VERSION@", &lib_version); fs::write(pkgconfig.join("libnghttp2.pc"), pc).unwrap(); fs::copy( "nghttp2/lib/includes/nghttp2/nghttp2.h", include.join("nghttp2/nghttp2.h"), ) .unwrap(); }