From 141c73738042827b73188c902eb7b745472c55ff Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Mon, 23 Mar 2026 16:50:13 +0800 Subject: [PATCH] Add libsodium --- config/pkg/lib/libsodium.yml | 2 ++ src/Package/Library/libsodium.php | 49 +++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/config/pkg/lib/libsodium.yml b/config/pkg/lib/libsodium.yml index f5a551b9..4bd41363 100644 --- a/config/pkg/lib/libsodium.yml +++ b/config/pkg/lib/libsodium.yml @@ -13,3 +13,5 @@ libsodium: - libsodium static-libs@unix: - libsodium.a + static-libs@windows: + - libsodium.lib diff --git a/src/Package/Library/libsodium.php b/src/Package/Library/libsodium.php index 50d706ba..5280927c 100644 --- a/src/Package/Library/libsodium.php +++ b/src/Package/Library/libsodium.php @@ -6,12 +6,26 @@ namespace Package\Library; use StaticPHP\Attribute\Package\BuildFor; use StaticPHP\Attribute\Package\Library; +use StaticPHP\Attribute\Package\PatchBeforeBuild; +use StaticPHP\Exception\BuildFailureException; +use StaticPHP\Exception\EnvironmentException; use StaticPHP\Package\LibraryPackage; use StaticPHP\Runtime\Executor\UnixAutoconfExecutor; +use StaticPHP\Runtime\SystemTarget; +use StaticPHP\Util\FileSystem; +use StaticPHP\Util\System\WindowsUtil; #[Library('libsodium')] class libsodium { + #[PatchBeforeBuild] + public function patchBeforeBuild(LibraryPackage $lib): void + { + if (SystemTarget::getTargetOS() === 'Windows') { + FileSystem::replaceFileStr("{$lib->getSourceDir()}\\src\\libsodium\\include\\sodium\\export.h", '#ifdef SODIUM_STATIC', '#if 1'); + } + } + #[BuildFor('Linux')] #[BuildFor('Darwin')] public function build(LibraryPackage $lib): void @@ -21,4 +35,39 @@ class libsodium // Patch pkg-config file $lib->patchPkgconfPrefix(['libsodium.pc'], PKGCONF_PATCH_PREFIX); } + + #[BuildFor('Windows')] + public function buildWin(LibraryPackage $lib): void + { + $ver = WindowsUtil::findVisualStudio(); + $vs_ver_dir = match ($ver['major_version']) { + '17' => '\vs2022', + '16' => '\vs2019', + default => throw new EnvironmentException("Current VS version {$ver['major_version']} is not supported yet!"), + }; + + cmd()->cd("{$lib->getSourceDir()}\\builds\\msvc{$vs_ver_dir}") + ->exec('msbuild libsodium.sln /t:Rebuild /p:Configuration=StaticRelease /p:Platform=x64 /p:PreprocessorDefinitions="SODIUM_STATIC=1"'); + FileSystem::createDir($lib->getLibDir()); + FileSystem::createDir($lib->getIncludeDir()); + + // copy include + FileSystem::copyDir("{$lib->getSourceDir()}\\src\\libsodium\\include\\sodium", "{$lib->getIncludeDir()}\\sodium"); + FileSystem::copy("{$lib->getSourceDir()}\\src\\libsodium\\include\\sodium.h", "{$lib->getIncludeDir()}\\sodium.h"); + // copy lib + $ls = FileSystem::scanDirFiles("{$lib->getSourceDir()}\\bin"); + $find = false; + foreach ($ls as $file) { + if (str_ends_with($file, 'libsodium.lib')) { + FileSystem::copy($file, "{$lib->getLibDir()}\\libsodium.lib"); + $find = true; + } + if (str_ends_with($file, 'libsodium.pdb')) { + FileSystem::copy($file, "{$lib->getLibDir()}\\libsodium.pdb"); + } + } + if (!$find) { + throw new BuildFailureException("Build libsodium success, but cannot find libsodium.lib in {$lib->getSourceDir()}\\bin ."); + } + } }