libopusenc-static-sys 1.0.3

Rust bindings to the reference Opus Encoder library (libopusenc)
Documentation
use std::{env, fs, path::PathBuf, process::Command};

fn main() {
  if cfg!(target_os = "macos") {
    if let Ok(output) = Command::new("rustc").args(&["--print", "deployment-target"]).output() {
      if output.status.success() {
        if let Some(target) = std::str::from_utf8(&output.stdout)
          .unwrap()
          .strip_prefix("deployment_target=")
          .map(|v| v.trim())
          .map(ToString::to_string)
        {
          unsafe {
            std::env::set_var("MACOSX_DEPLOYMENT_TARGET", target);
          }
        }
      }
    }
  }

  let opus_include = PathBuf::from(std::env::var_os("DEP_OPUS_INCLUDE").unwrap()).join("opus");
  let opus_lib = PathBuf::from(std::env::var_os("DEP_OPUS_LIB").unwrap());
  let dest = PathBuf::from(env::var_os("OUT_DIR").unwrap());
  let build_dir = dest.join("build");
  let mut builder = cc::Build::new();
  builder
    .include(&opus_include)
    .include("libopusenc/include")
    .file("libopusenc/src/ogg_packer.c")
    .file("libopusenc/src/opus_header.c")
    .file("libopusenc/src/opusenc.c")
    .file("libopusenc/src/picture.c")
    .file("libopusenc/src/resample.c")
    .file("libopusenc/src/unicode_support.c")
    .define("OUTSIDE_SPEEX", "TRUE")
    .define("RANDOM_PREFIX", "opusenc_")
    .define("PACKAGE_NAME", "\"libopusenc\"")
    .define("PACKAGE_VERSION", "\"v0.2.1-16\"")
    .warnings(false)
    .static_crt(true)
    .opt_level(3)
    .out_dir(&build_dir);
  #[cfg(target_os = "windows")]
  builder.flag("/Zl");
  #[cfg(not(target_os = "windows"))]
  builder.flag("-fvisibility=hidden").flag("-flto");
  builder.compile("opusenc");

  fs::create_dir_all(dest.join("lib/pkgconfig")).unwrap();
  fs::create_dir_all(dest.join("include")).unwrap();
  for entry in fs::read_dir(&opus_include).unwrap() {
    let entry = entry.unwrap();
    let path = entry.path();
    if path.is_file() {
      fs::copy(&path, dest.join("include").join(path.file_name().unwrap())).unwrap();
    }
  }
  fs::copy("libopusenc/include/opusenc.h", dest.join("include/opusenc.h")).unwrap();
  #[cfg(target_os = "windows")]
  {
    fs::copy(build_dir.join("opusenc.lib"), dest.join("lib\\opusenc.lib")).unwrap();
    fs::copy(opus_lib, dest.join("lib\\opus.lib")).unwrap();
  }
  #[cfg(not(target_os = "windows"))]
  {
    fs::copy(build_dir.join("libopusenc.a"), dest.join("lib/libopusenc.a")).unwrap();
    fs::copy(opus_lib, dest.join("lib/libopus.a")).unwrap();
  }
  fs::write(
    dest.join("lib/pkgconfig/libopusenc.pc"),
    fs::read_to_string("libopusenc/libopusenc.pc.in")
      .unwrap()
      .replace("@prefix@", dest.to_str().unwrap())
      .replace("@exec_prefix@", "${prefix}")
      .replace("@libdir@", "${exec_prefix}/lib")
      .replace("@includedir@", "${prefix}/include")
      .replace("@PACKAGE_VERSION@", "0.2.1")
      .replace("@lrintf_lib@", ""),
  )
  .unwrap();

  println!("cargo:root={}", dest.display());
  #[cfg(target_os = "windows")]
  {
    println!("cargo:include={}\\include", dest.display());
    println!("cargo:lib_path={}\\lib", dest.display());
    println!("cargo:lib={}\\lib\\opusenc.lib", dest.display());
    println!("cargo:rustc-link-search=native={}\\lib", dest.display());
  }
  #[cfg(not(target_os = "windows"))]
  {
    println!("cargo:include={}/include", dest.display());
    println!("cargo:lib_path={}/lib", dest.display());
    println!("cargo:lib={}/lib/libopusenc.a", dest.display());
    println!("cargo:rustc-link-search=native={}/lib", dest.display());
  }
  println!("cargo:rustc-link-lib=static=opusenc");
  println!("cargo:rustc-link-lib=static=opus");
}