mirror of
https://github.com/danog/ext-php-rs.git
synced 2024-11-26 12:04:53 +01:00
2d0e587c7e
* feat(embed): add embed features, add test example which run php inside it * feat(embed): use a guard to prevent running in parallel * chore(ci): update actions to not build and test with embed, add a specific build for embed testing * feat(embed): correcly start / shutdown embed api * chore(ci): use stable for rust in embed test * feat(embed): add documentation, manage potential errors
66 lines
2.0 KiB
Rust
66 lines
2.0 KiB
Rust
use std::{path::PathBuf, process::Command};
|
|
|
|
use anyhow::{bail, Context, Result};
|
|
|
|
use crate::{find_executable, path_from_env, PHPInfo, PHPProvider};
|
|
|
|
pub struct Provider {}
|
|
|
|
impl Provider {
|
|
/// Runs `php-config` with one argument, returning the stdout.
|
|
fn php_config(&self, arg: &str) -> Result<String> {
|
|
let cmd = Command::new(self.find_bin()?)
|
|
.arg(arg)
|
|
.output()
|
|
.context("Failed to run `php-config`")?;
|
|
let stdout = String::from_utf8_lossy(&cmd.stdout);
|
|
if !cmd.status.success() {
|
|
let stderr = String::from_utf8_lossy(&cmd.stderr);
|
|
bail!("Failed to run `php-config`: {} {}", stdout, stderr);
|
|
}
|
|
Ok(stdout.to_string())
|
|
}
|
|
|
|
fn find_bin(&self) -> Result<PathBuf> {
|
|
// If path is given via env, it takes priority.
|
|
if let Some(path) = path_from_env("PHP_CONFIG") {
|
|
if !path.try_exists()? {
|
|
// If path was explicitly given and it can't be found, this is a hard error
|
|
bail!("php-config executable not found at {:?}", path);
|
|
}
|
|
return Ok(path);
|
|
}
|
|
find_executable("php-config").with_context(|| {
|
|
"Could not find `php-config` executable. \
|
|
Please ensure `php-config` is in your PATH or the \
|
|
`PHP_CONFIG` environment variable is set."
|
|
})
|
|
}
|
|
}
|
|
|
|
impl<'a> PHPProvider<'a> for Provider {
|
|
fn new(_: &'a PHPInfo) -> Result<Self> {
|
|
Ok(Self {})
|
|
}
|
|
|
|
fn get_includes(&self) -> Result<Vec<PathBuf>> {
|
|
Ok(self
|
|
.php_config("--includes")?
|
|
.split(' ')
|
|
.map(|s| s.trim_start_matches("-I"))
|
|
.map(PathBuf::from)
|
|
.collect())
|
|
}
|
|
|
|
fn get_defines(&self) -> Result<Vec<(&'static str, &'static str)>> {
|
|
Ok(vec![])
|
|
}
|
|
|
|
fn print_extra_link_args(&self) -> Result<()> {
|
|
#[cfg(feature = "embed")]
|
|
println!("cargo:rustc-link-lib=php");
|
|
|
|
Ok(())
|
|
}
|
|
}
|