From adff728999205116f411bb422a6e4353900767ca Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Sat, 21 Mar 2026 18:04:15 +0800 Subject: [PATCH] Add libffi-win --- config/pkg/lib/libffi-win.yml | 12 ++++++++ src/Package/Library/libffi_win.php | 47 ++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 config/pkg/lib/libffi-win.yml create mode 100644 src/Package/Library/libffi_win.php diff --git a/config/pkg/lib/libffi-win.yml b/config/pkg/lib/libffi-win.yml new file mode 100644 index 00000000..051dfcb2 --- /dev/null +++ b/config/pkg/lib/libffi-win.yml @@ -0,0 +1,12 @@ +libffi-win: + type: library + artifact: + source: + type: git + rev: master + url: 'https://github.com/static-php/libffi-win.git' + metadata: + license-files: [LICENSE] + license: MIT + static-libs@windows: + - libffi.lib diff --git a/src/Package/Library/libffi_win.php b/src/Package/Library/libffi_win.php new file mode 100644 index 00000000..12faaabe --- /dev/null +++ b/src/Package/Library/libffi_win.php @@ -0,0 +1,47 @@ + '\win32\vs17_x64', + '16' => '\win32\vs16_x64', + default => throw new EnvironmentException("Current VS version {$ver['major_version']} is not supported!"), + }; + ApplicationContext::set('libffi_win_vs_ver_dir', $vs_ver_dir); + } + + #[BuildFor('Windows')] + public function build(LibraryPackage $lib): void + { + $vs_ver_dir = ApplicationContext::get('libffi_win_vs_ver_dir'); + cmd()->cd("{$lib->getSourceDir()}{$vs_ver_dir}") + ->exec('msbuild libffi-msvc.sln /t:Rebuild /p:Configuration=Release /p:Platform=x64'); + FileSystem::createDir($lib->getLibDir()); + FileSystem::createDir($lib->getIncludeDir()); + + FileSystem::copy("{$lib->getSourceDir()}{$vs_ver_dir}\\x64\\Release\\libffi.lib", "{$lib->getLibDir()}\\libffi.lib"); + FileSystem::copy("{$lib->getSourceDir()}{$vs_ver_dir}\\x64\\Release\\libffi.pdb", "{$lib->getLibDir()}\\libffi.pdb"); + FileSystem::copy("{$lib->getSourceDir()}\\include\\ffi.h", "{$lib->getIncludeDir()}\\ffi.h"); + FileSystem::replaceFileStr("{$lib->getIncludeDir()}\\ffi.h", '#define LIBFFI_H', "#define LIBFFI_H\n#define FFI_BUILDING"); + FileSystem::copy("{$lib->getSourceDir()}\\src\\x86\\ffitarget.h", "{$lib->getIncludeDir()}\\ffitarget.h"); + FileSystem::copy("{$lib->getSourceDir()}\\fficonfig.h", "{$lib->getIncludeDir()}\\fficonfig.h"); + } +}