# autotools/configure&make support for build.rs [![LICENSE](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![dependency status](https://deps.rs/repo/github/lu-zero/autotools-rs/status.svg)](https://deps.rs/repo/github/lu-zero/autotools-rs) [![crates.io](https://img.shields.io/crates/v/autotools.svg?style=flat)](https://crates.io/crates/autotools) [![docs.rs](https://docs.rs/autotools/badge.svg)](https://docs.rs/autotools) [![Actions Status](https://github.com/lu-zero/autotools-rs/workflows/autotools-rs-compact/badge.svg)](https://github.com/lu-zero/autotools-rs/actions) A build dependency to compile a native library that uses [autotools][1] or a compatible `configure` script + `make`. It is based on [cmake-rs](https://github.com/alexcrichton/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][cve-xz]. It is advised to review `configure.ac` and always regenerate `configure` using [`reconf`][reconf]. [cve-xz]: https://nvd.nist.gov/vuln/detail/CVE-2024-3094 [reconf]: https://docs.rs/autotools/latest/autotools/struct.Config.html#method.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](https://emscripten.org/docs/compiling/Building-Projects.html#integrating-with-a-build-system). ### 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](https://github.com/KyleMayes/install-llvm-action), make sure to set [`env: true`](https://github.com/KyleMayes/install-llvm-action#env). ### 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](https://github.com/rust-lang/cc-rs#external-configuration-via-environment-variables) to select the correct compiler if the heuristics fail (e.g. `musl-gcc` might not exist while `x86_64-linux-musl-gcc` does). ``` toml # Cargo.toml [build-dependencies] autotools = "0.2" ``` ``` rust // 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"); ``` ``` rust // 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(); ``` [1]: https://www.gnu.org/software/autoconf/autoconf.html