diff --git a/src/StaticPHP/Config/ConfigValidator.php b/src/StaticPHP/Config/ConfigValidator.php index 256e47fd..919de86d 100644 --- a/src/StaticPHP/Config/ConfigValidator.php +++ b/src/StaticPHP/Config/ConfigValidator.php @@ -40,6 +40,9 @@ class ConfigValidator 'static-libs' => ConfigType::LIST_ARRAY, // @ 'pkg-configs' => ConfigType::LIST_ARRAY, 'static-bins' => ConfigType::LIST_ARRAY, // @ + 'path' => ConfigType::LIST_ARRAY, // @ + 'env' => ConfigType::ASSOC_ARRAY, // @ + 'append-env' => ConfigType::ASSOC_ARRAY, // @ ]; public const array PACKAGE_FIELDS = [ @@ -60,6 +63,9 @@ class ConfigValidator 'static-libs' => false, // @ 'pkg-configs' => false, 'static-bins' => false, // @ + 'path' => false, // @ + 'env' => false, // @ + 'append-env' => false, // @ ]; public const array SUFFIX_ALLOWED_FIELDS = [ @@ -68,6 +74,9 @@ class ConfigValidator 'headers', 'static-libs', 'static-bins', + 'path', + 'env', + 'append-env', ]; public const array PHP_EXTENSION_FIELDS = [ diff --git a/src/StaticPHP/Package/PackageInstaller.php b/src/StaticPHP/Package/PackageInstaller.php index d8d745f6..417c4e1b 100644 --- a/src/StaticPHP/Package/PackageInstaller.php +++ b/src/StaticPHP/Package/PackageInstaller.php @@ -9,6 +9,7 @@ use StaticPHP\Artifact\ArtifactCache; use StaticPHP\Artifact\ArtifactDownloader; use StaticPHP\Artifact\ArtifactExtractor; use StaticPHP\Artifact\DownloaderOptions; +use StaticPHP\Config\PackageConfig; use StaticPHP\DI\ApplicationContext; use StaticPHP\Exception\WrongUsageException; use StaticPHP\Registry\PackageLoader; @@ -580,6 +581,30 @@ class PackageInstaller foreach ($resolved_packages as $pkg_name) { $this->packages[$pkg_name] = PackageLoader::getPackage($pkg_name); } + + foreach ($this->packages as $package) { + $this->injectPackageEnvs($package); + } + } + + private function injectPackageEnvs(Package $package): void + { + $name = $package->getName(); + + $paths = PackageConfig::get($name, 'path', []); + foreach ($paths as $path) { + GlobalEnvManager::addPathIfNotExists(FileSystem::replacePathVariable($path)); + } + + $envs = PackageConfig::get($name, 'env', []); + foreach ($envs as $k => $v) { + GlobalEnvManager::putenv("{$k}=" . FileSystem::replacePathVariable((string) $v)); + } + + $append_envs = PackageConfig::get($name, 'append-env', []); + foreach ($append_envs as $k => $v) { + GlobalEnvManager::appendEnv($k, FileSystem::replacePathVariable((string) $v)); + } } private function handlePhpTargetPackage(TargetPackage $package): void diff --git a/src/StaticPHP/Util/GlobalEnvManager.php b/src/StaticPHP/Util/GlobalEnvManager.php index 86fcc652..5b4b16b2 100644 --- a/src/StaticPHP/Util/GlobalEnvManager.php +++ b/src/StaticPHP/Util/GlobalEnvManager.php @@ -112,6 +112,17 @@ class GlobalEnvManager } } + public static function appendEnv(string $key, string $value): void + { + $existing = getenv($key); + if ($existing !== false && $existing !== '') { + $separator = SystemTarget::isUnix() ? ':' : ';'; + self::putenv("{$key}={$value}{$separator}{$existing}"); + } else { + self::putenv("{$key}={$value}"); + } + } + /** * Initialize the toolchain after the environment variables are set. * The toolchain or environment availability check is done here.