Skip to content

build.rs helper to configure and compile autotools and configure/make projects

License

Notifications You must be signed in to change notification settings

lu-zero/autotools-rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

59 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

autotools/configure&make support for build.rs

LICENSE dependency status crates.io docs.rs Actions Status

A build dependency to compile a native library that uses autotools or a compatible configure script + make.

It is based on cmake-rs and the API tries to be as similar as possible to it.

Autotools concern

The generated configure script that is often bundled in release tarballs tends to be fairly big, convoluted and at least once has been a vector for delivering malicious code (CVE-2024-3094.

It is advised to review configure.ac and always regenerate configure using reconf.

Cross compiling

Emscripten

For Emscripten targets like "wasm32-unknown-emscripten", configure and make invocations are passed as arguments to emconfigure and emmake respectively as described in the Emscripten docs.

Custom LLVM on macOS

Make sure to set the env to CC=clang-{version} and that the compiler is in the PATH. If you are using install-llvm-action, make sure to set env: true.

Other compilers

Keep in mind that we rely on cc-rs heuristics to select the C and C++ compilers. Some may be missing on your system, please make sure to set the enviroment variables to select the correct compiler if the heuristics fail (e.g. musl-gcc might not exist while x86_64-linux-musl-gcc does).

# Cargo.toml
[build-dependencies]
autotools = "0.2"
// build.rs
use autotools;

// Build the project in the path `foo` and installs it in `$OUT_DIR`
let dst = autotools::build("foo");

// Simply link the library without using pkg-config
println!("cargo:rustc-link-search=native={}", dst.display());
println!("cargo:rustc-link-lib=static=foo");
// build.rs
use autotools::Config;

let dst = Config::new("foo")
    .reconf("-ivf")
    .enable("feature", None)
    .with("dep", None)
    .disable("otherfeature", None)
    .without("otherdep", None)
    .cflag("-Wall")
    .build();