use std::env;
use std::process::Command;
fn main() {
let php_config = env::var("PHP_CONFIG").unwrap_or_else(|_| "php-config".to_string());
let includes = run_php_config(&php_config, "--includes");
let ldflags = run_php_config(&php_config, "--ldflags");
let prefix = run_php_config(&php_config, "--prefix");
let extension_dir = run_php_config(&php_config, "--extension-dir");
for flag in includes.split_whitespace() {
if let Some(path) = flag.strip_prefix("-I") {
println!("cargo:include={path}");
}
}
let libs = run_php_config(&php_config, "--libs");
for flag in libs.split_whitespace() {
if let Some(lib) = flag.strip_prefix("-l") {
println!("cargo:rustc-link-lib={lib}");
}
}
for flag in ldflags.split_whitespace() {
if let Some(path) = flag.strip_prefix("-L") {
println!("cargo:rustc-link-search=native={path}");
}
}
println!("cargo:rustc-link-search=native={prefix}/lib");
println!("cargo:rustc-link-lib=php");
let mut build = cc::Build::new();
build.file("src/php_embed_helper.c");
for flag in includes.split_whitespace() {
if let Some(path) = flag.strip_prefix("-I") {
build.include(path);
}
}
let configure_opts = run_php_config(&php_config, "--configure-options");
if configure_opts.contains("--enable-zts") {
build.define("ZTS", "1");
println!("cargo:rustc-cfg=php_zts");
}
build.compile("php_embed_helper");
println!("cargo:rerun-if-changed=src/php_embed_helper.c");
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-env-changed=PHP_CONFIG");
println!("cargo:rustc-env=PHP_EXTENSION_DIR={extension_dir}");
}
fn run_php_config(php_config: &str, flag: &str) -> String {
let output = Command::new(php_config)
.arg(flag)
.output()
.unwrap_or_else(|e| {
panic!("Failed to run `{php_config} {flag}`: {e}\nIs php-dev installed?")
});
assert!(
output.status.success(),
"`{php_config} {flag}` failed: {}",
String::from_utf8_lossy(&output.stderr)
);
String::from_utf8(output.stdout)
.expect("php-config output is not UTF-8")
.trim()
.to_string()
}