Skip to content

Commit 9a0d239

Browse files
committed
Add gettext-win
1 parent ad631f9 commit 9a0d239

2 files changed

Lines changed: 64 additions & 0 deletions

File tree

config/pkg/lib/gettext-win.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
gettext-win:
2+
type: library
3+
artifact:
4+
source:
5+
type: git
6+
url: 'https://github.com/winlibs/gettext.git'
7+
rev: master
8+
static-libs@windows:
9+
- libintl_a.lib
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Package\Library;
6+
7+
use StaticPHP\Attribute\Package\BuildFor;
8+
use StaticPHP\Attribute\Package\Library;
9+
use StaticPHP\Attribute\Package\PatchBeforeBuild;
10+
use StaticPHP\Attribute\Package\Validate;
11+
use StaticPHP\DI\ApplicationContext;
12+
use StaticPHP\Exception\EnvironmentException;
13+
use StaticPHP\Package\LibraryPackage;
14+
use StaticPHP\Util\FileSystem;
15+
use StaticPHP\Util\System\WindowsUtil;
16+
17+
#[Library('gettext-win')]
18+
class gettext_win
19+
{
20+
#[Validate]
21+
public function validate(): void
22+
{
23+
$ver = WindowsUtil::findVisualStudio();
24+
$vs_ver_dir = match ($ver['major_version']) {
25+
'17' => '\MSVC17',
26+
'16' => '\MSVC16',
27+
default => throw new EnvironmentException("Current VS version {$ver['major_version']} is not supported yet!"),
28+
};
29+
ApplicationContext::set('gettext_win_vs_ver_dir', $vs_ver_dir);
30+
}
31+
32+
#[PatchBeforeBuild]
33+
public function patchBeforeBuild(LibraryPackage $lib): void
34+
{
35+
$vs_ver_dir = ApplicationContext::get('gettext_win_vs_ver_dir');
36+
$vcxproj = "{$lib->getSourceDir()}{$vs_ver_dir}\\libintl_static\\libintl_static.vcxproj";
37+
// libintl_static uses /MD (MultiThreadedDLL) in Release configs, which causes unresolved __imp_* symbols
38+
// when linking into PHP statically. Patch to /MT (MultiThreaded) for static CRT compatibility.
39+
FileSystem::replaceFileStr($vcxproj, '<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>', '<RuntimeLibrary>MultiThreaded</RuntimeLibrary>');
40+
}
41+
42+
#[BuildFor('Windows')]
43+
public function build(LibraryPackage $lib): void
44+
{
45+
$vs_ver_dir = ApplicationContext::get('gettext_win_vs_ver_dir');
46+
cmd()->cd("{$lib->getSourceDir()}{$vs_ver_dir}\\libintl_static")
47+
->exec('msbuild libintl_static.vcxproj /t:Rebuild /p:Configuration=Release /p:Platform=x64 /p:WindowsTargetPlatformVersion=10.0');
48+
FileSystem::createDir($lib->getLibDir());
49+
FileSystem::createDir($lib->getIncludeDir());
50+
// libintl_a.lib is the static library output; copy as libintl.lib for linker compatibility
51+
FileSystem::copy("{$lib->getSourceDir()}{$vs_ver_dir}\\libintl_static\\x64\\Release\\libintl_a.lib", "{$lib->getLibDir()}\\libintl_a.lib");
52+
// libgnuintl.h is the public API header, installed as libintl.h
53+
FileSystem::copy("{$lib->getSourceDir()}\\source\\gettext-runtime\\intl\\libgnuintl.h", "{$lib->getIncludeDir()}\\libintl.h");
54+
}
55+
}

0 commit comments

Comments
 (0)