diff --git a/.github/workflows/win.yml b/.github/workflows/win.yml
index 0d80873b0e1d..b2c7765334f4 100644
--- a/.github/workflows/win.yml
+++ b/.github/workflows/win.yml
@@ -38,210 +38,34 @@ jobs:
libs/mpir.lib
libs/yaml.lib
libs/xml2.lib
- key: win-libs-${{ hashFiles('.github/workflows/win.yml') }}-msvc-${{ env.VSCMD_VER }}
- - name: Download libgc
- if: steps.cache-libs.outputs.cache-hit != 'true'
- uses: actions/checkout@v3
- with:
- repository: ivmai/bdwgc
- ref: v8.2.2
- path: bdwgc
- - name: Download libatomic_ops
- if: steps.cache-libs.outputs.cache-hit != 'true'
- uses: actions/checkout@v3
- with:
- repository: ivmai/libatomic_ops
- ref: v7.6.14
- path: bdwgc/libatomic_ops
+ key: win-libs-${{ hashFiles('.github/workflows/win.yml', 'etc/win-ci/*.ps1') }}-msvc-${{ env.VSCMD_VER }}
- name: Build libgc
if: steps.cache-libs.outputs.cache-hit != 'true'
- working-directory: ./bdwgc
- run: |
- cmake . -DBUILD_SHARED_LIBS=OFF -Denable_large_config=ON -DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH=OFF
- cmake --build . --config Release
- - name: Download libpcre
- if: steps.cache-libs.outputs.cache-hit != 'true'
- run: |
- iwr https://cs.stanford.edu/pub/exim/pcre/pcre-8.45.zip -OutFile pcre.zip
- (Get-FileHash -Algorithm SHA256 .\pcre.zip).hash -eq "5b709aa45ea3b8bb73052947200ad187f651a2049158fb5bbfed329e4322a977"
- 7z x pcre.zip
- mv pcre-* pcre
+ run: .\etc\win-ci\build-gc.ps1 -BuildTree deps\gc -Version 8.2.2 -AtomicOpsVersion 7.8.0
- name: Build libpcre
if: steps.cache-libs.outputs.cache-hit != 'true'
- working-directory: ./pcre
- run: |
- cmake . -DBUILD_SHARED_LIBS=OFF -DPCRE_SUPPORT_UNICODE_PROPERTIES=ON -DPCRE_SUPPORT_JIT=ON -DPCRE_STATIC_RUNTIME=ON -DCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH=OFF
- cmake --build . --config Release
- - name: Download libpcre2
- if: steps.cache-libs.outputs.cache-hit != 'true'
- uses: actions/checkout@v3
- with:
- repository: PCRE2Project/pcre2
- ref: pcre2-10.42
- path: pcre2
+ run: .\etc\win-ci\build-pcre.ps1 -BuildTree deps\pcre -Version 8.45
- name: Build libpcre2
if: steps.cache-libs.outputs.cache-hit != 'true'
- working-directory: ./pcre2
- run: |
- cmake . -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF -DPCRE2_STATIC_RUNTIME=ON -DPCRE2_BUILD_PCRE2GREP=OFF -DPCRE2_BUILD_TESTS=OFF -DPCRE2_SUPPORT_UNICODE=ON -DPCRE2_SUPPORT_JIT=ON -DCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH=OFF
- cmake --build . --config Release
- - name: Download libiconv
- if: steps.cache-libs.outputs.cache-hit != 'true'
- uses: actions/checkout@v3
- with:
- repository: pffang/libiconv-for-Windows
- ref: 1353455a6c4e15c9db6865fd9c2bf7203b59c0ec # master@{2022-10-11}
- path: libiconv
+ run: .\etc\win-ci\build-pcre2.ps1 -BuildTree deps\pcre2 -Version 10.42
- name: Build libiconv
if: steps.cache-libs.outputs.cache-hit != 'true'
- working-directory: ./libiconv
- run: |
- sed -i 's|__declspec (dllimport) ||' libiconv\include\iconv.h
-
- echo '
-
- $(MsbuildThisFileDirectory)\Override.props
-
- ' > 'Directory.Build.props'
-
- echo '
-
-
- MultiThreaded
- None
- false
-
-
- ' > 'Override.props'
-
- MSBuild.exe /p:Platform=x64 /p:Configuration=ReleaseStatic libiconv.vcxproj
- - name: Download libffi
- if: steps.cache-libs.outputs.cache-hit != 'true'
- uses: actions/checkout@v3
- with:
- repository: winlibs/libffi
- ref: libffi-3.3
- path: libffi
+ run: .\etc\win-ci\build-iconv.ps1 -BuildTree deps\iconv
- name: Build libffi
if: steps.cache-libs.outputs.cache-hit != 'true'
- working-directory: ./libffi
- run: |
- echo '
-
- $(MsbuildThisFileDirectory)\Override.props
-
- ' > 'Directory.Build.props'
-
- echo '
-
-
- MultiThreaded
- None
- false
-
-
- false
-
-
- ' > 'Override.props'
-
- MSBuild.exe /p:PlatformToolset=v143 /p:Platform=x64 /p:Configuration=Release win32\vs16_x64\libffi-msvc.sln -target:libffi:Rebuild
- - name: Download zlib
- if: steps.cache-libs.outputs.cache-hit != 'true'
- run: |
- iwr https://github.com/madler/zlib/archive/v1.2.13.zip -OutFile zlib.zip
- (Get-FileHash -Algorithm SHA256 .\zlib.zip).hash -eq "C2856951BBF30E30861ACE3765595D86BA13F2CF01279D901F6C62258C57F4FF"
- 7z x zlib.zip
- mv zlib-* zlib
+ run: .\etc\win-ci\build-ffi.ps1 -BuildTree deps\ffi -Version 3.3
- name: Build zlib
if: steps.cache-libs.outputs.cache-hit != 'true'
- working-directory: ./zlib
- run: |
- cmake . -DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH=OFF
- cmake --build . --config Release
- - name: Download mpir
- if: steps.cache-libs.outputs.cache-hit != 'true'
- uses: actions/checkout@v3
- with:
- repository: BrianGladman/mpir
- ref: 28d01062f62de1218d511c4574da4006f92be3bd # master@{2022-10-12}
- path: mpir
+ run: .\etc\win-ci\build-z.ps1 -BuildTree deps\z -Version 1.2.13
- name: Build mpir
if: steps.cache-libs.outputs.cache-hit != 'true'
- working-directory: ./mpir
- run: |
- $VsVersion = "vs$((& "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -property displayName) -replace '.*\b\d\d(\d\d)\b.*', '$1')"
-
- echo '
-
- $(MsbuildThisFileDirectory)\Override.props
-
- ' > 'msvc\Directory.Build.props'
-
- echo '
-
-
- None
- false
-
-
- ' > 'msvc\Override.props'
-
- MSBuild.exe /p:Platform=x64 /p:Configuration=Release /p:DefineConstants=MSC_BUILD_DLL ".\msvc\$VsVersion\lib_mpir_gc\lib_mpir_gc.vcxproj"
- - name: Download libyaml
- if: steps.cache-libs.outputs.cache-hit != 'true'
- run: |
- iwr https://github.com/yaml/libyaml/archive/0.2.5.zip -OutFile libyaml.zip
- (Get-FileHash -Algorithm SHA256 .\libyaml.zip).hash -eq "14605BAA6DFC0C4D3AB943A46A627413C0388736E453B67FE4E90C9683C8CBC8"
- 7z x libyaml.zip
- mv libyaml-* libyaml
+ run: .\etc\win-ci\build-mpir.ps1 -BuildTree deps\mpir
- name: Build libyaml
if: steps.cache-libs.outputs.cache-hit != 'true'
- working-directory: ./libyaml
- run: |
- cmake . -DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH=OFF
- cmake --build . --config Release
- - name: Download libxml2
- if: steps.cache-libs.outputs.cache-hit != 'true'
- uses: actions/checkout@v3
- with:
- repository: GNOME/libxml2
- ref: f507d167f1755b7eaea09fb1a44d29aab828b6d1 # v2.10.3
- path: libxml2
+ run: .\etc\win-ci\build-yaml.ps1 -BuildTree deps\yaml -Version 0.2.5
- name: Build libxml2
if: steps.cache-libs.outputs.cache-hit != 'true'
- working-directory: ./libxml2
- run: |
- cmake . -DBUILD_SHARED_LIBS=OFF -DLIBXML2_WITH_PROGRAMS=OFF -DLIBXML2_WITH_HTTP=OFF -DLIBXML2_WITH_FTP=OFF -DLIBXML2_WITH_TESTS=OFF -DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH=OFF -DLIBXML2_WITH_ICONV=OFF -DLIBXML2_WITH_LZMA=OFF -DLIBXML2_WITH_PYTHON=OFF -DLIBXML2_WITH_ZLIB=OFF
-
- echo '
-
- $(MsbuildThisFileDirectory)\Override.props
-
- ' > 'Directory.Build.props'
-
- echo '
-
-
- LIBXML_STATIC;%(PreprocessorDefinitions)
-
-
- ' > 'Override.props'
-
- cmake --build . --config Release
- - name: Gather libraries
- if: steps.cache-libs.outputs.cache-hit != 'true'
- run: |
- mkdir libs
- mv pcre/Release/pcre.lib libs/
- mv pcre2/Release/pcre2-8-static.lib libs/pcre2-8.lib
- mv libiconv/output/x64/ReleaseStatic/libiconvStatic.lib libs/iconv.lib
- mv bdwgc/Release/gc.lib libs/
- mv libffi/win32/vs16_x64/x64/Release/libffi.lib libs/ffi.lib
- mv zlib/Release/zlibstatic.lib libs/z.lib
- mv mpir/lib/x64/Release/mpir.lib libs/
- mv libyaml/Release/yaml.lib libs/
- mv libxml2/Release/libxml2s.lib libs/xml2.lib
+ run: .\etc\win-ci\build-xml2.ps1 -BuildTree deps\xml2 -Version 2.11.3
- name: Cache OpenSSL
id: cache-openssl
@@ -251,32 +75,13 @@ jobs:
libs/crypto.lib
libs/ssl.lib
libs/openssl_VERSION
- key: win-openssl-libs-3.0.7-msvc-${{ env.VSCMD_VER }}
+ key: win-openssl-libs-3.1.0-${{ hashFiles('etc/win-ci/build-openssl.ps1') }}-msvc-${{ env.VSCMD_VER }}
- name: Set up NASM
if: steps.cache-openssl.outputs.cache-hit != 'true'
uses: ilammy/setup-nasm@321e6ed62a1fc77024a3bd853deb33645e8b22c4 # v1.4.0
- - name: Download OpenSSL
- if: steps.cache-openssl.outputs.cache-hit != 'true'
- run: |
- iwr https://www.openssl.org/source/openssl-3.0.7.tar.gz -OutFile openssl.tar.gz
- (Get-FileHash -Algorithm SHA256 .\openssl.tar.gz).hash -eq "83049d042a260e696f62406ac5c08bf706fd84383f945cf21bd61e9ed95c396e"
- 7z x openssl.tar.gz
- 7z x openssl.tar
- mv openssl-* openssl
- name: Build OpenSSL
if: steps.cache-openssl.outputs.cache-hit != 'true'
- working-directory: ./openssl
- run: |
- sed -i 's|/Zi /Fd.*\.pdb||' Configurations/10-main.conf
- sed -i 's|/debug|/debug:none|' Configurations/10-main.conf
- perl Configure VC-WIN64A /MT -static no-tests --with-zlib-lib=..\zlib\Release --with-zlib-include=..\zlib
- nmake
- - name: Gather OpenSSL
- if: steps.cache-openssl.outputs.cache-hit != 'true'
- run: |
- cp openssl/libcrypto.lib libs/crypto.lib
- cp openssl/libssl.lib libs/ssl.lib
- [IO.File]::WriteAllLines("libs/openssl_VERSION", "3.0.7")
+ run: .\etc\win-ci\build-openssl.ps1 -BuildTree deps\openssl -Version 3.1.0
- name: Cache LLVM
id: cache-llvm
diff --git a/etc/win-ci/build-ffi.ps1 b/etc/win-ci/build-ffi.ps1
new file mode 100644
index 000000000000..4340630bea64
--- /dev/null
+++ b/etc/win-ci/build-ffi.ps1
@@ -0,0 +1,55 @@
+param(
+ [Parameter(Mandatory)] [string] $BuildTree,
+ [Parameter(Mandatory)] [string] $Version,
+ [switch] $Dynamic
+)
+
+. "$(Split-Path -Parent $MyInvocation.MyCommand.Path)\setup.ps1"
+
+[void](New-Item -Name (Split-Path -Parent $BuildTree) -ItemType Directory -Force)
+Setup-Git -Path $BuildTree -Url https://github.com/winlibs/libffi.git -Ref libffi-$Version
+
+Run-InDirectory $BuildTree {
+ if ($Dynamic) {
+ Replace-Text win32\vs16_x64\libffi\libffi.vcxproj 'StaticLibrary' 'DynamicLibrary'
+ }
+
+ echo '
+
+ $(MsbuildThisFileDirectory)\Override.props
+
+ ' > 'Directory.Build.props'
+
+ echo "
+
+ false
+
+
+
+ $(if ($Dynamic) {
+ 'FFI_BUILDING_DLL;%(PreprocessorDefinitions)'
+ } else {
+ 'MultiThreaded'
+ })
+ None
+ false
+
+
+ false
+
+
+ " > 'Override.props'
+
+ MSBuild.exe /p:PlatformToolset=v143 /p:Platform=x64 /p:Configuration=Release win32\vs16_x64\libffi-msvc.sln -target:libffi:Rebuild
+ if (-not $?) {
+ Write-Host "Error: Failed to build libffi" -ForegroundColor Red
+ Exit 1
+ }
+}
+
+if ($Dynamic) {
+ mv -Force $BuildTree\win32\vs16_x64\x64\Release\libffi.lib libs\ffi-dynamic.lib
+ mv -Force $BuildTree\win32\vs16_x64\x64\Release\libffi.dll dlls\
+} else {
+ mv -Force $BuildTree\win32\vs16_x64\x64\Release\libffi.lib libs\ffi.lib
+}
diff --git a/etc/win-ci/build-gc.ps1 b/etc/win-ci/build-gc.ps1
new file mode 100644
index 000000000000..4509b581141c
--- /dev/null
+++ b/etc/win-ci/build-gc.ps1
@@ -0,0 +1,35 @@
+param(
+ [Parameter(Mandatory)] [string] $BuildTree,
+ [Parameter(Mandatory)] [string] $Version,
+ [Parameter(Mandatory)] [string] $AtomicOpsVersion,
+ [switch] $Dynamic
+)
+
+. "$(Split-Path -Parent $MyInvocation.MyCommand.Path)\setup.ps1"
+
+[void](New-Item -Name (Split-Path -Parent $BuildTree) -ItemType Directory -Force)
+Setup-Git -Path $BuildTree -Url https://github.com/ivmai/bdwgc.git -Ref v$Version
+Setup-Git -Path $BuildTree\libatomic_ops -Url https://github.com/ivmai/libatomic_ops.git -Ref v$AtomicOpsVersion
+
+Run-InDirectory $BuildTree {
+ $args = "-Dbuild_cord=OFF -Denable_large_config=ON -DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH=OFF"
+ if ($Dynamic) {
+ $args = "-DBUILD_SHARED_LIBS=ON $args"
+ } else {
+ $args = "-DBUILD_SHARED_LIBS=OFF -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded $args"
+ }
+ & $cmake . $args.split(' ')
+ & $cmake --build . --config Release
+ if (-not $?) {
+ Write-Host "Error: Failed to build libgc" -ForegroundColor Red
+ Exit 1
+ }
+}
+
+if ($Dynamic) {
+ mv -Force $BuildTree\Release\gc.lib libs\gc-dynamic.lib
+ mv -Force $BuildTree\Release\gc.dll dlls\
+} else {
+ mv -Force $BuildTree\Release\gc.lib libs\
+}
+
diff --git a/etc/win-ci/build-iconv.ps1 b/etc/win-ci/build-iconv.ps1
new file mode 100644
index 000000000000..56d0417bd729
--- /dev/null
+++ b/etc/win-ci/build-iconv.ps1
@@ -0,0 +1,56 @@
+param(
+ [Parameter(Mandatory)] [string] $BuildTree,
+ [switch] $Dynamic
+)
+
+. "$(Split-Path -Parent $MyInvocation.MyCommand.Path)\setup.ps1"
+
+[void](New-Item -Name (Split-Path -Parent $BuildTree) -ItemType Directory -Force)
+Setup-Git -Path $BuildTree -Url https://github.com/pffang/libiconv-for-Windows.git -Ref 1353455a6c4e15c9db6865fd9c2bf7203b59c0ec # master@{2022-10-11}
+
+Run-InDirectory $BuildTree {
+ Replace-Text libiconv\include\iconv.h '__declspec (dllimport) ' ''
+
+ echo '
+
+ $(MsbuildThisFileDirectory)\Override.props
+
+ ' > 'Directory.Build.props'
+
+ echo "
+
+ false
+
+
+
+ None
+ false
+
+
+ false
+
+
+
+
+ MultiThreadedDLL
+
+
+ " > 'Override.props'
+
+ if ($Dynamic) {
+ MSBuild.exe /p:Platform=x64 /p:Configuration=Release libiconv.vcxproj
+ } else {
+ MSBuild.exe /p:Platform=x64 /p:Configuration=ReleaseStatic libiconv.vcxproj
+ }
+ if (-not $?) {
+ Write-Host "Error: Failed to build libiconv" -ForegroundColor Red
+ Exit 1
+ }
+}
+
+if ($Dynamic) {
+ mv -Force $BuildTree\output\x64\Release\libiconv.lib libs\iconv-dynamic.lib
+ mv -Force $BuildTree\output\x64\Release\libiconv.dll dlls\
+} else {
+ mv -Force $BuildTree\output\x64\ReleaseStatic\libiconvStatic.lib libs\iconv.lib
+}
diff --git a/etc/win-ci/build-mpir.ps1 b/etc/win-ci/build-mpir.ps1
new file mode 100644
index 000000000000..24111e762b7b
--- /dev/null
+++ b/etc/win-ci/build-mpir.ps1
@@ -0,0 +1,48 @@
+param(
+ [Parameter(Mandatory)] [string] $BuildTree,
+ [switch] $Dynamic
+)
+
+. "$(Split-Path -Parent $MyInvocation.MyCommand.Path)\setup.ps1"
+
+[void](New-Item -Name (Split-Path -Parent $BuildTree) -ItemType Directory -Force)
+Setup-Git -Path $BuildTree -Url https://github.com/BrianGladman/mpir.git -Ref dc82b0475dea84d5338356e49176c40be03a5bdf # master@{2023-02-10}
+
+Run-InDirectory $BuildTree {
+ $vsVersion = "vs$((& "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -property displayName) -replace '.*\b\d\d(\d\d)\b.*', '$1')"
+
+ echo '
+
+ $(MsbuildThisFileDirectory)\Override.props
+
+ ' > 'msvc\Directory.Build.props'
+
+ echo '
+
+
+ None
+ false
+
+
+ false
+
+
+ ' > 'msvc\Override.props'
+
+ if ($Dynamic) {
+ MSBuild.exe /p:Platform=x64 /p:Configuration=Release "msvc\$vsVersion\dll_mpir_gc\dll_mpir_gc.vcxproj"
+ } else {
+ MSBuild.exe /p:Platform=x64 /p:Configuration=Release "msvc\$vsVersion\lib_mpir_gc\lib_mpir_gc.vcxproj"
+ }
+ if (-not $?) {
+ Write-Host "Error: Failed to build MPIR" -ForegroundColor Red
+ Exit 1
+ }
+}
+
+if ($Dynamic) {
+ mv -Force $BuildTree\dll\x64\Release\mpir.lib libs\mpir-dynamic.lib
+ mv -Force $BuildTree\dll\x64\Release\mpir.dll dlls\
+} else {
+ mv -Force $BuildTree\lib\x64\Release\mpir.lib libs\
+}
diff --git a/etc/win-ci/build-openssl.ps1 b/etc/win-ci/build-openssl.ps1
new file mode 100644
index 000000000000..174f8bf7747d
--- /dev/null
+++ b/etc/win-ci/build-openssl.ps1
@@ -0,0 +1,38 @@
+param(
+ [Parameter(Mandatory)] [string] $BuildTree,
+ [Parameter(Mandatory)] [string] $Version,
+ [switch] $Dynamic
+)
+
+. "$(Split-Path -Parent $MyInvocation.MyCommand.Path)\setup.ps1"
+
+[void](New-Item -Name (Split-Path -Parent $BuildTree) -ItemType Directory -Force)
+Setup-Git -Path $BuildTree -Url https://github.com/openssl/openssl -Ref openssl-$Version
+
+Run-InDirectory $BuildTree {
+ Replace-Text Configurations\10-main.conf '/Zi /Fdossl_static.pdb' ''
+ Replace-Text Configurations\10-main.conf '"/nologo /debug"' '"/nologo /debug:none"'
+
+ if ($Dynamic) {
+ perl Configure VC-WIN64A no-tests
+ } else {
+ perl Configure VC-WIN64A /MT -static no-tests
+ }
+ nmake
+ if (-not $?) {
+ Write-Host "Error: Failed to build OpenSSL" -ForegroundColor Red
+ Exit 1
+ }
+}
+
+if ($Dynamic) {
+ $major = $Version -replace '\..*', ''
+ mv -Force $BuildTree\libcrypto.lib libs\crypto-dynamic.lib
+ mv -Force $BuildTree\libssl.lib libs\ssl-dynamic.lib
+ mv -Force $BuildTree\libcrypto-$major-x64.dll dlls\
+ mv -Force $BuildTree\libssl-$major-x64.dll dlls\
+} else {
+ mv -Force $BuildTree\libcrypto.lib libs\crypto.lib
+ mv -Force $BuildTree\libssl.lib libs\ssl.lib
+}
+[IO.File]::WriteAllLines("libs\openssl_VERSION", $Version)
diff --git a/etc/win-ci/build-pcre.ps1 b/etc/win-ci/build-pcre.ps1
new file mode 100644
index 000000000000..ea021e309de2
--- /dev/null
+++ b/etc/win-ci/build-pcre.ps1
@@ -0,0 +1,49 @@
+param(
+ [Parameter(Mandatory)] [string] $BuildTree,
+ [Parameter(Mandatory)] [string] $Version,
+ [switch] $Dynamic
+)
+
+function Find-7Zip {
+ $Path = Get-Command "7z" -CommandType Application -TotalCount 1 -ErrorAction SilentlyContinue
+ if ($Path) { return $Path.Path }
+
+ $Path = "$env:ProgramFiles\7-Zip\7z.exe"
+ if (Test-Path -Path $Path -PathType Leaf) { return $Path }
+
+ $Path = "${env:ProgramFiles(x86)}\7-Zip\7z.exe"
+ if (Test-Path -Path $Path -PathType Leaf) { return $Path }
+
+ Write-Host "Error: Cannot locate 7-Zip executable" -ForegroundColor Red
+ Exit 1
+}
+
+. "$(Split-Path -Parent $MyInvocation.MyCommand.Path)\setup.ps1"
+
+[void](New-Item -Name (Split-Path -Parent $BuildTree) -ItemType Directory -Force)
+Invoke-WebRequest https://cs.stanford.edu/pub/exim/pcre/pcre-$Version.zip -OutFile pcre.zip
+& (Find-7Zip) x pcre.zip
+mv pcre-* $BuildTree
+rm pcre.zip
+
+Run-InDirectory $BuildTree {
+ $args = "-DPCRE_BUILD_PCREGREP=OFF -DPCRE_BUILD_TESTS=OFF -DPCRE_BUILD_PCRECPP=OFF -DPCRE_SUPPORT_JIT=ON -DPCRE_SUPPORT_UNICODE_PROPERTIES=ON -DCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH=OFF"
+ if ($Dynamic) {
+ $args = "-DBUILD_SHARED_LIBS=ON $args"
+ } else {
+ $args = "-DBUILD_SHARED_LIBS=OFF -DPCRE_STATIC_RUNTIME=ON $args"
+ }
+ & $cmake . $args.split(' ')
+ & $cmake --build . --config Release
+ if (-not $?) {
+ Write-Host "Error: Failed to build PCRE" -ForegroundColor Red
+ Exit 1
+ }
+}
+
+if ($Dynamic) {
+ mv -Force $BuildTree\Release\pcre.lib libs\pcre-dynamic.lib
+ mv -Force $BuildTree\Release\pcre.dll dlls\
+} else {
+ mv -Force $BuildTree\Release\pcre.lib libs\
+}
diff --git a/etc/win-ci/build-pcre2.ps1 b/etc/win-ci/build-pcre2.ps1
new file mode 100644
index 000000000000..ceab8668b999
--- /dev/null
+++ b/etc/win-ci/build-pcre2.ps1
@@ -0,0 +1,32 @@
+param(
+ [Parameter(Mandatory)] [string] $BuildTree,
+ [Parameter(Mandatory)] [string] $Version,
+ [switch] $Dynamic
+)
+
+. "$(Split-Path -Parent $MyInvocation.MyCommand.Path)\setup.ps1"
+
+[void](New-Item -Name (Split-Path -Parent $BuildTree) -ItemType Directory -Force)
+Setup-Git -Path $BuildTree -Url https://github.com/PCRE2Project/pcre2.git -Ref pcre2-$Version
+
+Run-InDirectory $BuildTree {
+ $args = "-DPCRE2_BUILD_PCRE2GREP=OFF -DPCRE2_BUILD_TESTS=OFF -DPCRE2_SUPPORT_UNICODE=ON -DPCRE2_SUPPORT_JIT=ON -DCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH=OFF"
+ if ($Dynamic) {
+ $args = "-DBUILD_STATIC_LIBS=OFF -DBUILD_SHARED_LIBS=ON $args"
+ } else {
+ $args = "-DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF -DPCRE2_STATIC_RUNTIME=ON $args"
+ }
+ & $cmake . $args.split(' ')
+ & $cmake --build . --config Release
+ if (-not $?) {
+ Write-Host "Error: Failed to build PCRE2" -ForegroundColor Red
+ Exit 1
+ }
+}
+
+if ($Dynamic) {
+ mv -Force $BuildTree\Release\pcre2-8.lib libs\pcre2-8-dynamic.lib
+ mv -Force $BuildTree\Release\pcre2-8.dll dlls\
+} else {
+ mv -Force $BuildTree\Release\pcre2-8-static.lib libs\pcre2-8.lib
+}
diff --git a/etc/win-ci/build-xml2.ps1 b/etc/win-ci/build-xml2.ps1
new file mode 100644
index 000000000000..3485a357b270
--- /dev/null
+++ b/etc/win-ci/build-xml2.ps1
@@ -0,0 +1,32 @@
+param(
+ [Parameter(Mandatory)] [string] $BuildTree,
+ [Parameter(Mandatory)] [string] $Version,
+ [switch] $Dynamic
+)
+
+. "$(Split-Path -Parent $MyInvocation.MyCommand.Path)\setup.ps1"
+
+[void](New-Item -Name (Split-Path -Parent $BuildTree) -ItemType Directory -Force)
+Setup-Git -Path $BuildTree -Url https://gitlab.gnome.org/GNOME/libxml2.git -Ref v$Version
+
+Run-InDirectory $BuildTree {
+ $args = "-DLIBXML2_WITH_TESTS=OFF -DLIBXML2_WITH_PROGRAMS=OFF -DLIBXML2_WITH_HTTP=OFF -DLIBXML2_WITH_FTP=OFF -DLIBXML2_WITH_ICONV=OFF -DLIBXML2_WITH_LZMA=OFF -DLIBXML2_WITH_PYTHON=OFF -DLIBXML2_WITH_ZLIB=OFF -DCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH=OFF"
+ if ($Dynamic) {
+ $args = "-DBUILD_SHARED_LIBS=ON $args"
+ } else {
+ $args = "-DBUILD_SHARED_LIBS=OFF -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded $args"
+ }
+ & $cmake . $args.split(' ')
+ & $cmake --build . --config Release
+ if (-not $?) {
+ Write-Host "Error: Failed to build libxml2" -ForegroundColor Red
+ Exit 1
+ }
+}
+
+if ($Dynamic) {
+ mv -Force $BuildTree\Release\libxml2.lib libs\xml2-dynamic.lib
+ mv -Force $BuildTree\Release\libxml2.dll dlls\
+} else {
+ mv -Force $BuildTree\Release\libxml2s.lib libs\xml2.lib
+}
diff --git a/etc/win-ci/build-yaml.ps1 b/etc/win-ci/build-yaml.ps1
new file mode 100644
index 000000000000..5f0972003f71
--- /dev/null
+++ b/etc/win-ci/build-yaml.ps1
@@ -0,0 +1,32 @@
+param(
+ [Parameter(Mandatory)] [string] $BuildTree,
+ [Parameter(Mandatory)] [string] $Version,
+ [switch] $Dynamic
+)
+
+. "$(Split-Path -Parent $MyInvocation.MyCommand.Path)\setup.ps1"
+
+[void](New-Item -Name (Split-Path -Parent $BuildTree) -ItemType Directory -Force)
+Setup-Git -Path $BuildTree -Url https://github.com/yaml/libyaml.git -Ref $Version
+
+Run-InDirectory $BuildTree {
+ $args = "-DBUILD_TESTING=OFF -DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH=OFF"
+ if ($Dynamic) {
+ $args = "-DBUILD_SHARED_LIBS=ON $args"
+ } else {
+ $args = "-DBUILD_SHARED_LIBS=OFF -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded $args"
+ }
+ & $cmake . $args.split(' ')
+ & $cmake --build . --config Release
+ if (-not $?) {
+ Write-Host "Error: Failed to build libyaml" -ForegroundColor Red
+ Exit 1
+ }
+}
+
+if ($Dynamic) {
+ mv -Force $BuildTree\Release\yaml.lib libs\yaml-dynamic.lib
+ mv -Force $BuildTree\Release\yaml.dll dlls\
+} else {
+ mv -Force $BuildTree\Release\yaml.lib libs\
+}
diff --git a/etc/win-ci/build-z.ps1 b/etc/win-ci/build-z.ps1
new file mode 100644
index 000000000000..e12794543dc8
--- /dev/null
+++ b/etc/win-ci/build-z.ps1
@@ -0,0 +1,32 @@
+param(
+ [Parameter(Mandatory)] [string] $BuildTree,
+ [Parameter(Mandatory)] [string] $Version,
+ [switch] $Dynamic
+)
+
+. "$(Split-Path -Parent $MyInvocation.MyCommand.Path)\setup.ps1"
+
+[void](New-Item -Name (Split-Path -Parent $BuildTree) -ItemType Directory -Force)
+Setup-Git -Path $BuildTree -Url https://github.com/madler/zlib.git -Ref v$Version
+
+Run-InDirectory $BuildTree {
+ $args = "-DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH=OFF"
+ if ($Dynamic) {
+ $args = "-DBUILD_SHARED_LIBS=ON $args"
+ } else {
+ $args = "-DBUILD_SHARED_LIBS=OFF -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded $args"
+ }
+ & $cmake . $args.split(' ')
+ & $cmake --build . --target $(if ($Dynamic) { 'zlib' } else { 'zlibstatic' }) --config Release
+ if (-not $?) {
+ Write-Host "Error: Failed to build zlib" -ForegroundColor Red
+ Exit 1
+ }
+}
+
+if ($Dynamic) {
+ mv -Force $BuildTree\Release\zlib.lib libs\z-dynamic.lib
+ mv -Force $BuildTree\Release\zlib1.dll dlls\
+} else {
+ mv -Force $BuildTree\Release\zlibstatic.lib libs\z.lib
+}
diff --git a/etc/win-ci/setup.ps1 b/etc/win-ci/setup.ps1
new file mode 100644
index 000000000000..c5c93f0465fa
--- /dev/null
+++ b/etc/win-ci/setup.ps1
@@ -0,0 +1,78 @@
+function Run-InDirectory {
+ param(
+ [Parameter(Mandatory)] [string] $Path,
+ [Parameter(Mandatory)] [scriptblock] $ScriptBlock
+ )
+
+ [void](New-Item -Name $Path -ItemType Directory -Force)
+ Push-Location $Path
+ [Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
+ try { & $ScriptBlock } finally {
+ Pop-Location
+ [Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
+ }
+}
+
+function Find-Git {
+ $Path = Get-Command "git" -CommandType Application -TotalCount 1 -ErrorAction SilentlyContinue
+ if ($Path) { return $Path.Path }
+
+ $Path = "$env:ProgramFiles\Git\cmd\git.exe"
+ if (Test-Path -Path $Path -PathType Leaf) { return $Path }
+
+ Write-Host "Error: Cannot locate Git executable" -ForegroundColor Red
+ Exit 1
+}
+
+function Find-CMake {
+ $Path = Get-Command "cmake" -CommandType Application -TotalCount 1 -ErrorAction SilentlyContinue
+ if ($Path) { return $Path.Path }
+
+ $Path = "$env:ProgramFiles\CMake\bin\cmake.exe"
+ if (Test-Path -Path $Path -PathType Leaf) { return $Path }
+
+ Write-Host "Error: Cannot locate CMake executable" -ForegroundColor Red
+ Exit 1
+}
+
+function Setup-Git {
+ param(
+ [Parameter(Mandatory)] [string] $Path,
+ [Parameter(Mandatory)] [string] $Url,
+ [string] $Ref = $null
+ )
+
+ if (-not (Test-Path $Path)) {
+ $args = "clone", "--config", "core.autocrlf=false", $Url, $Path
+ Write-Host "$git $args" -ForegroundColor Cyan
+ & $git $args
+ if (-not $?) {
+ Write-Host "Error: Failed to clone Git repository" -ForegroundColor Red
+ Exit 1
+ }
+ }
+
+ if ($Ref) {
+ Run-InDirectory $Path {
+ Write-Host "$git checkout $Ref" -ForegroundColor Cyan
+ & $git checkout $Ref
+ }
+ }
+}
+
+function Replace-Text {
+ param(
+ [Parameter(Mandatory)] [string] $Path,
+ [Parameter(Mandatory)] [string] $Pattern,
+ [Parameter(Mandatory)] [AllowEmptyString()] [string] $Replacement
+ )
+
+ $content = [System.IO.File]::ReadAllText($Path).Replace($Pattern, $Replacement)
+ [System.IO.File]::WriteAllText($Path, $content)
+}
+
+$git = Find-Git
+$cmake = Find-CMake
+
+[void](New-Item -Name libs -ItemType Directory -Force)
+[void](New-Item -Name dlls -ItemType Directory -Force)