66
77use StaticPHP \Attribute \Package \BuildFor ;
88use StaticPHP \Attribute \Package \Library ;
9+ use StaticPHP \Attribute \Package \PatchBeforeBuild ;
10+ use StaticPHP \Exception \BuildFailureException ;
11+ use StaticPHP \Exception \EnvironmentException ;
912use StaticPHP \Package \LibraryPackage ;
1013use StaticPHP \Runtime \Executor \UnixAutoconfExecutor ;
14+ use StaticPHP \Runtime \SystemTarget ;
15+ use StaticPHP \Util \FileSystem ;
16+ use StaticPHP \Util \System \WindowsUtil ;
1117
1218#[Library('libsodium ' )]
1319class libsodium
1420{
21+ #[PatchBeforeBuild]
22+ public function patchBeforeBuild (LibraryPackage $ lib ): void
23+ {
24+ if (SystemTarget::getTargetOS () === 'Windows ' ) {
25+ FileSystem::replaceFileStr ("{$ lib ->getSourceDir ()}\\src \\libsodium \\include \\sodium \\export.h " , '#ifdef SODIUM_STATIC ' , '#if 1 ' );
26+ }
27+ }
28+
1529 #[BuildFor('Linux ' )]
1630 #[BuildFor('Darwin ' )]
1731 public function build (LibraryPackage $ lib ): void
@@ -21,4 +35,39 @@ public function build(LibraryPackage $lib): void
2135 // Patch pkg-config file
2236 $ lib ->patchPkgconfPrefix (['libsodium.pc ' ], PKGCONF_PATCH_PREFIX );
2337 }
38+
39+ #[BuildFor('Windows ' )]
40+ public function buildWin (LibraryPackage $ lib ): void
41+ {
42+ $ ver = WindowsUtil::findVisualStudio ();
43+ $ vs_ver_dir = match ($ ver ['major_version ' ]) {
44+ '17 ' => '\vs2022 ' ,
45+ '16 ' => '\vs2019 ' ,
46+ default => throw new EnvironmentException ("Current VS version {$ ver ['major_version ' ]} is not supported yet! " ),
47+ };
48+
49+ cmd ()->cd ("{$ lib ->getSourceDir ()}\\builds \\msvc {$ vs_ver_dir }" )
50+ ->exec ('msbuild libsodium.sln /t:Rebuild /p:Configuration=StaticRelease /p:Platform=x64 /p:PreprocessorDefinitions="SODIUM_STATIC=1" ' );
51+ FileSystem::createDir ($ lib ->getLibDir ());
52+ FileSystem::createDir ($ lib ->getIncludeDir ());
53+
54+ // copy include
55+ FileSystem::copyDir ("{$ lib ->getSourceDir ()}\\src \\libsodium \\include \\sodium " , "{$ lib ->getIncludeDir ()}\\sodium " );
56+ FileSystem::copy ("{$ lib ->getSourceDir ()}\\src \\libsodium \\include \\sodium.h " , "{$ lib ->getIncludeDir ()}\\sodium.h " );
57+ // copy lib
58+ $ ls = FileSystem::scanDirFiles ("{$ lib ->getSourceDir ()}\\bin " );
59+ $ find = false ;
60+ foreach ($ ls as $ file ) {
61+ if (str_ends_with ($ file , 'libsodium.lib ' )) {
62+ FileSystem::copy ($ file , "{$ lib ->getLibDir ()}\\libsodium.lib " );
63+ $ find = true ;
64+ }
65+ if (str_ends_with ($ file , 'libsodium.pdb ' )) {
66+ FileSystem::copy ($ file , "{$ lib ->getLibDir ()}\\libsodium.pdb " );
67+ }
68+ }
69+ if (!$ find ) {
70+ throw new BuildFailureException ("Build libsodium success, but cannot find libsodium.lib in {$ lib ->getSourceDir ()}\\bin . " );
71+ }
72+ }
2473}
0 commit comments