Add openssl version getter for Windows, test openssl

This commit is contained in:
crazywhalecc 2025-07-30 23:23:12 +08:00
parent 5f5d934d58
commit af10cacdff
No known key found for this signature in database
GPG Key ID: 1F4BDD59391F2680
7 changed files with 72 additions and 27 deletions

View File

@ -36,4 +36,17 @@ class openssl extends Extension
}
return $args;
}
public function getWindowsConfigureArg(bool $shared = false): string
{
$args = '--with-openssl';
if (
$this->builder->getPHPVersionID() >= 80500 &&
($ver = $this->builder->getLib('openssl')->getLibVersion()) &&
version_compare($ver, '3.2.0', '>=')
) {
$args .= ' --with-openssl-argon2';
}
return $args;
}
}

View File

@ -29,7 +29,7 @@ use SPC\store\FileSystem;
class openssl extends LinuxLibraryBase
{
use \SPC\builder\unix\library\openssl;
use \SPC\builder\traits\openssl;
public const NAME = 'openssl';

View File

@ -28,7 +28,7 @@ use SPC\store\FileSystem;
class openssl extends MacOSLibraryBase
{
use \SPC\builder\unix\library\openssl;
use \SPC\builder\traits\openssl;
public const NAME = 'openssl';

View File

@ -0,0 +1,38 @@
<?php
declare(strict_types=1);
namespace SPC\builder\traits;
use SPC\exception\RuntimeException;
use SPC\store\FileSystem;
use SPC\util\PkgConfigUtil;
trait openssl
{
public function getLibVersion(): ?string
{
// get openssl version from source directory
if (file_exists("{$this->source_dir}/VERSION.dat")) {
// parse as INI
$version = parse_ini_file("{$this->source_dir}/VERSION.dat");
if ($version !== false) {
return "{$version['MAJOR']}.{$version['MINOR']}.{$version['PATCH']}";
}
}
// get openssl version from pkg-config
if (PHP_OS_FAMILY !== 'Windows') {
try {
return PkgConfigUtil::getModuleVersion('openssl');
} catch (RuntimeException) {
}
}
// get openssl version from header openssl/opensslv.h
if (file_exists(BUILD_INCLUDE_PATH . '/openssl/opensslv.h')) {
if (preg_match('/OPENSSL_VERSION_STR "(.*)"/', FileSystem::readFile(BUILD_INCLUDE_PATH . '/openssl/opensslv.h'), $match)) {
return $match[1];
}
}
return null;
}
}

View File

@ -1,21 +0,0 @@
<?php
declare(strict_types=1);
namespace SPC\builder\unix\library;
trait openssl
{
public function getLibVersion(): ?string
{
// get openssl version from source directory
if (file_exists("{$this->source_dir}/VERSION.dat")) {
// parse as INI
$version = parse_ini_file("{$this->source_dir}/VERSION.dat");
if ($version !== false) {
return "{$version['MAJOR']}.{$version['MINOR']}.{$version['PATCH']}";
}
}
return null;
}
}

View File

@ -8,6 +8,21 @@ use SPC\exception\RuntimeException;
class PkgConfigUtil
{
/**
* Returns the version of a module.
* This method uses `pkg-config --modversion` to get the version of the specified module.
* If the module is not found, it will throw a RuntimeException.
*
* @param string $pkg_config_str .pc file str, accepts multiple files
* @return string version string, e.g. "1.2.3"
* @throws RuntimeException
*/
public static function getModuleVersion(string $pkg_config_str): string
{
$result = self::execWithResult("pkg-config --modversion {$pkg_config_str}");
return trim($result);
}
/**
* Returns --cflags-only-other output.
* The reason we return the string is we cannot use array_unique() on cflags,

View File

@ -16,7 +16,7 @@ $test_php_version = [
// '8.1',
// '8.2',
// '8.3',
// '8.4',
'8.4',
'git',
];
@ -49,8 +49,8 @@ $prefer_pre_built = false;
// If you want to test your added extensions and libs, add below (comma separated, example `bcmath,openssl`).
$extensions = match (PHP_OS_FAMILY) {
'Linux', 'Darwin' => 'bcmath',
'Windows' => 'curl',
'Linux', 'Darwin' => 'openssl',
'Windows' => 'openssl',
};
// If you want to test shared extensions, add them below (comma separated, example `bcmath,openssl`).
@ -73,7 +73,7 @@ $with_libs = match (PHP_OS_FAMILY) {
// You can use `common`, `bulk`, `minimal` or `none`.
// note: combination is only available for *nix platform. Windows must use `none` combination
$base_combination = match (PHP_OS_FAMILY) {
'Linux', 'Darwin' => 'common',
'Linux', 'Darwin' => 'minimal',
'Windows' => 'none',
};