pg-arm64-notes.txt
text/plain
Filename: pg-arm64-notes.txt
Type: text/plain
Part: 2
My goal was to be able to:
a) develop PostgreSQL on Win11/ARM64 using either GCC or MSVC/Visual Studio
b) setup my host as a "build farm animal"
Why? I'm not a "Windows super-fan", I just saw that the Win11/ARM64/MSVC combo
was not covered by the build farm as yet, so I wanted to address that. If you
have a sick animal you should be able to diagnose and fix it. Hence, my two
goals.
I started with Dave Cramer's work on a GitHub workflow for this combo, that was
very helpful.
https://github.com/davecramer/vcpkg/blob/main/.github/workflows/vcpkg_windows_arm.yml
NOTE: ... someday figure out how to run the workflow on the host.
Steps I took (YMMV) to accomplish (a) development/testing on Win11/ARM64/MSVC
================================================================================================
* I decided to create a directory c:\tools rather than litter things around,
you can put the things I placed in that directory anywhere you'd like, but
adjust your PATH accordingly.
* install Chocolatey (a package manager)
https://docs.chocolatey.org/
* use Chocolatey to install some packages
choco install make cmake flex bison openssl python3 diffutils gzip sed strawberryperl winflexbison
NOTE: the only viable Perl is "strawberryperl" and it is only available as an
x86_64 build. This works for scripts used to build Postgres, but it you
can't link it into your arm64 binary so there is no way to support plperl.
* install Git
https://git-scm.com/install/windows
NOTE: This gives you a nice bash shell and some coreutils too.
* use Git to install vcpkg (https://github.com/microsoft/vcpkg)
cd c:\tools
git clone --depth 1 --branch 2025.10.17 https://github.com/microsoft/vcpkg.git
.\bootstrap-vcpkg.bat
ensure that the path to "vcpkg.bat" is in your PATH
* use vcpkg to install some libraries
cd c:\tools
vcpkg install --triplet=arm64-windows --debug icu libiconv libxml2 libxslt lz4 openssl pkgconf readline vcpkg-cmake vcpkg-make vcpkg-tool-meson zlib zstd
* install meson/ninja
python -m pip install --upgrade pip
python -m pip install meson==1.9.1
python -m pip install ninja==1.13.0
NOTE: I'm not sure if I've now installed meson twice, once via vcpkg and once
using python... oh well.
* install cURL
https://curl.se/windows/
* install Visual Studio Community
https://visualstudio.microsoft.com/downloads/
ls "C:\Program Files\Microsoft Visual Studio\18\Community\"
* set some environment variables
PATH=
$env:PATH
$env:VCPKG_ROOT
c:\tools
c:\tools\curl\bin
c:\tools\vcpkg\installed\arm64-windows\bin
"%AppData%\Python\Python314\Scripts"
"%LocalAppData%\Programs\Microsoft VS Code\bin"
"%ProgramData%\chocolatey\bin"
"%ProgramFiles(x86)%\Windows Kits\10\Windows Performance Toolkit"
"%ProgramFiles%\Git\cmd"
"C:\Strawberry\c\bin"
"C:\Strawberry\perl\site\bin"
"C:\Strawberry\perl\bin"
PKG_CONFIG_PATH=
c:\tools\vcpkg\installed\arm64-windows\lib\pkgconfig
VCPKG_ROOT=
c:\tools\vcpkg
* until the fixes are in the tree, apply patches
git am .\0001-patch-for-arm.patch
git am .\0002-patch-meson.patch
git am .\0003...patch
* configure environment
.\env_setup.ps1
* setup meson build
.\setup.bat
See below what I get when I run setup.bat
* build
ninja -v -C build
* test
meson test -q --print-errorlogs -C build
NOTE: When builds fail frequently there are postgres.exe and/or cmd.exe
processes lingering about that are holding "handles" on things and when you
try to build again or test again or remove the build directory you'll run
into issues. Below is a script that finds and kills those processes.
Not required, but useful for sanity... YMMV
================================================================================================
* update PowerShell
https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows
winget install --id Microsoft.PowerShell --source winget
* emacs or vi/vim/nvim
choco install emacs nvim
* Zed Editor
https://zed.dev/
* Sublime Merge/Text
https://www.sublimetext.com/download
https://www.sublimemerge.com/download
* sysinternals
https://learn.microsoft.com/en-us/sysinternals/
- https://live.sysinternals.com/handle.exe
- https://live.sysinternals.com/ctrl2cap.exe
* Windows Subsystem for Linux (WSL)
from an admin cmd.exe: wsl --install
* install Windows Terminal
https://learn.microsoft.com/en-us/windows/terminal/install
* Docker Desktop
https://apps.microsoft.com/detail/xp8cbj40xlbwkx
https://learn.microsoft.com/en-us/windows/wsl/tutorials/wsl-containers
CloseFileHandles.ps1
================================================================================================
PS C:\> Unblock-File C:\tools\CloseFileHandles.ps1
<SNIP>
<#
.SYNOPSIS
Finds and terminates processes holding open handles to files in a directory.
.DESCRIPTION
Recursively identifies all files in a specified directory that have open handles,
determines which processes hold those handles, and forcefully terminates those processes.
.PARAMETER Path
The directory path to scan for files with open handles. Required.
.PARAMETER WhatIf
If specified, shows what actions would be taken without actually performing them.
.EXAMPLE
.\CloseFileHandles.ps1 -Path "C:\Temp"
.\CloseFileHandles.ps1 -Path "C:\Temp" -Verbose
.\CloseFileHandles.ps1 -Path "C:\Temp" -WhatIf
.\CloseFileHandles.ps1 -Path "C:\Temp" -Verbose -WhatIf
.REQUIRES
https://live.sysinternals.com/handle.exe
#>
[CmdletBinding(SupportsShouldProcess=$true)]
param(
[Parameter(Mandatory=$true, HelpMessage="Path to scan for open file handles")]
[string]$Path
)
# Set error action preference to stop on errors
$ErrorActionPreference = "Stop"
# Initialize variables
$processesKilled = @()
$processesFailed = @()
function Write-Error-Custom {
param([string]$Message)
Write-Host "[ERROR] $Message" -ForegroundColor Red
}
function Write-Success-Custom {
param([string]$Message)
Write-Host "[SUCCESS] $Message" -ForegroundColor Green
}
function Write-WhatIf-Custom {
param([string]$Message)
Write-Host "[WHATIF] $Message" -ForegroundColor Yellow
}
try {
# Validate path exists
Write-Verbose "Validating path: $Path"
if (-not (Test-Path -Path $Path -PathType Container)) {
Write-Error-Custom "Path does not exist or is not a directory: $Path"
exit 1
}
# Check if handle.exe exists
Write-Verbose "Checking for handle.exe availability"
$handlePath = "handle.exe"
try {
$null = & $handlePath -? 2>&1
}
catch {
Write-Error-Custom "handle.exe not found. Please ensure Sysinternals handle.exe is in PATH or current directory."
Write-Host "Download from: https://live.sysinternals.com/handle.exe"
exit 1
}
# Get all files recursively in the path
Write-Verbose "Scanning directory recursively: $Path"
$files = Get-ChildItem -Path $Path -File -Recurse -ErrorAction SilentlyContinue
if ($files.Count -eq 0) {
Write-Verbose "No files found in directory"
Write-Host "No files found in the specified directory."
exit 0
}
Write-Verbose "Found $($files.Count) files to check"
# Track unique processes to avoid duplicate kills
$uniqueProcesses = @{}
# Process each file
foreach ($file in $files) {
Write-Verbose "Checking file: $($file.FullName)"
try {
# Run handle.exe to find processes with open handles to this file
$handleOutput = & $handlePath -p * $file.FullName 2>&1
if ($handleOutput -and $handleOutput -match '\w+\s+pid:\s+(\d+)') {
# Parse process IDs from handle.exe output
$pidMatches = [regex]::Matches($handleOutput, 'pid:\s+(\d+)')
foreach ($match in $pidMatches) {
$pid = [int]$match.Groups[1].Value
# Store unique processes
if (-not $uniqueProcesses.ContainsKey($pid)) {
$uniqueProcesses[$pid] = $file.FullName
Write-Verbose "Found process with PID $pid holding handle to: $($file.FullName)"
}
}
}
}
catch {
Write-Verbose "Could not check handles for file $($file.FullName): $_"
}
}
if ($uniqueProcesses.Count -eq 0) {
Write-Success-Custom "No processes with open handles found."
exit 0
}
Write-Host "`nFound $($uniqueProcesses.Count) process(es) holding open handles:`n"
# Kill each unique process
foreach ($pid in $uniqueProcesses.Keys) {
try {
$process = Get-Process -Id $pid -ErrorAction SilentlyContinue
if ($null -ne $process) {
$processName = $process.Name
$processFile = $uniqueProcesses[$pid]
if ($PSCmdlet.ShouldProcess("Process $processName (PID: $pid)", "Terminate")) {
Write-Verbose "Attempting to kill process: $processName (PID: $pid)"
Stop-Process -Id $pid -Force -ErrorAction Stop
$processesKilled += @{ Name = $processName; PID = $pid; File = $processFile }
Write-Success-Custom "Killed process: $processName (PID: $pid)"
}
}
else {
Write-Verbose "Process with PID $pid no longer exists"
}
}
catch {
$processesFailed += @{ PID = $pid; Error = $_.Exception.Message }
Write-Error-Custom "Failed to kill process with PID $pid : $_"
}
}
# Summary
Write-Host "`n--- Summary ---"
Write-Host "Processes to be killed: $($uniqueProcesses.Count)"
if (-not $PSCmdlet.ShouldProcess("dummy", "dummy")) {
# WhatIf mode was active
Write-WhatIf-Custom "No processes were actually terminated (WhatIf mode)"
exit 0
}
else {
Write-Success-Custom "Successfully killed: $($processesKilled.Count) process(es)"
if ($processesFailed.Count -gt 0) {
Write-Error-Custom "Failed to kill: $($processesFailed.Count) process(es)"
foreach ($failed in $processesFailed) {
Write-Host " - PID $($failed.PID): $($failed.Error)"
}
exit 1
}
if ($processesKilled.Count -gt 0 -and $processesFailed.Count -eq 0) {
exit 0
}
}
}
catch {
Write-Error-Custom "Script error: $_"
exit 1
}
</SNIP>
Build Farm Animal Setup
================================================================================================
emacs -nw .\build-farm.conf
perl -cw .\run_build.pl
emacs -nw .\build-farm.conf
perl .\run_build.pl --test --nosend --verbose
more .\CHANGEME-test.lastrun-logs\
more .\CHANGEME-test.lastrun-logs\ns-githead.log
more .\CHANGEME-test.lastrun-logs\SCM-checkout.log
NOTES
================================================================================================
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Get-ExecutionPolicy -Scope CurrentUser
$env:PATH
# Core variables
$env:VCPKG_ROOT
$env:PATH | ForEach-Object { $_.Split(';') | Select-Object -First 20 }
# MSVC paths
$env:INCLUDE
$env:LIB
$env:LIBPATH
# Verify Python
python --version
python -c "import struct; print(f'Python is {struct.calcsize(\"P\") * 8}-bit')"
# Verify Perl location (should be empty or ARM64)
perl --version 2>&1 | Select-Object -First 5
# Meson/build configuration
$env:MESON_PREFIX_PATH
$env:CMAKE_PREFIX_PATH
$env:PKG_CONFIG_PATH
$env:LIB.Split(';') | ForEach-Object { Write-Host $_ }
cat (Get-PSReadlineOption).HistorySavePath
Last bit of output from setup.bat/meson reconfigure/setup
================================================================================================
postgresql 19devel
Data layout
data block size : 8 kB
WAL block size : 8 kB
segment size : 1 GB
System
host system : windows aarch64
build system : windows aarch64
Compiler
linker : link
C compiler : msvc 19.50.35718
Compiler Flags
CPP FLAGS : /DWIN32 /DWINDOWS /D__WINDOWS__ /D__WIN32__ /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE
C FLAGS, functional : /std:c11
C FLAGS, warnings : /wd4090 /wd4244 /wd4018 /wd4101 /wd4267 /w24062 /w24102 /w24777
C FLAGS, modules :
C FLAGS, user specified:
LD FLAGS : /INCREMENTAL:NO /STACK:4194304 /NOEXP
Programs
bison : C:\ProgramData\chocolatey\bin\win_bison.EXE 2.7
dtrace : NO
flex : C:\ProgramData\chocolatey\bin\win_flex.EXE 2.6.3
External libraries
bonjour : NO
bsd_auth : NO
docs : NO
docs_pdf : NO
gss : NO
icu : YES 78.1
ldap : YES
libcurl : NO
libnuma : NO
liburing : NO
libxml : YES 2.15.0
libxslt : YES 1.1.43
llvm : NO
lz4 : YES 1.10.0
nls : NO
openssl : YES 3.6.0
pam : NO
plperl : NO
plpython : NO
pltcl : NO
readline : NO
selinux : NO
systemd : NO
uuid : NO
zlib : YES 1.3.1
zstd : YES 1.5.7
User defined options
backend : ninja
buildtype : debugoptimized
extra_include_dirs :
extra_lib_dirs :
pkg_config_path : C:\tools\vcpkg\installed\arm64-windows\lib\pkgconfig
prefix : C:\Program Files\postgresql
Found ninja-1.13.0.git.kitware.jobserver-pipe-1 at C:\Users\gregb\AppData\Roaming\Python\Python314\Scripts\ninja.EXE
ConfigMSVC.ps1
================================================================================================
# ARM64 Development Environment Setup with Auto-Detection
# Configures environment variables and runs Meson setup
# ============================================
# Visual Studio and MSVC Auto-Detection
# ============================================
function Find-VisualStudioPath {
<#
.SYNOPSIS
Locates the Visual Studio installation directory using vswhere
Works with Visual Studio 2022, 2026, and later
#>
# vswhere.exe is always in ProgramFiles(x86)
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
if (Test-Path $vswhere) {
try {
# Get the latest version of Visual Studio
$vsPath = & $vswhere -latest -property installationPath 2>$null
if ($vsPath -and (Test-Path $vsPath)) {
Write-Host "Found Visual Studio at: $vsPath" -ForegroundColor Green
return $vsPath
}
}
catch {
Write-Warning "vswhere.exe found but failed to execute: $_"
}
}
# Fallback: Scan the entire Visual Studio directory tree
$vsRoot = "${env:ProgramFiles}\Microsoft Visual Studio"
if (Test-Path $vsRoot) {
Write-Host "Searching for Visual Studio installations in $vsRoot" -ForegroundColor Yellow
# Get year directories sorted by newest first (17 = 2022, 18 = 2026, etc.)
$yearDirs = Get-ChildItem -Path $vsRoot -Directory -ErrorAction SilentlyContinue | Sort-Object Name -Descending
foreach ($yearDir in $yearDirs) {
# Get edition directories (Community, Professional, Enterprise)
$editions = Get-ChildItem -Path $yearDir.FullName -Directory -ErrorAction SilentlyContinue
foreach ($edition in $editions) {
# Check if it has the VC tools
if (Test-Path (Join-Path $edition.FullName "VC\Tools\MSVC")) {
Write-Host "Found Visual Studio at: $($edition.FullName)" -ForegroundColor Green
return $edition.FullName
}
}
}
}
Write-Error "Visual Studio installation not found."
Write-Error "Checked: $vswhere (vswhere.exe)"
Write-Error "Checked: ${env:ProgramFiles}\Microsoft Visual Studio\"
exit 1
}
function Find-MSVCPath {
<#
.SYNOPSIS
Locates the MSVC compiler toolset and returns the latest version path
#>
param([string]$VSPath)
$msvRoot = Join-Path $VSPath "VC\Tools\MSVC"
if (-not (Test-Path $msvRoot)) {
Write-Error "MSVC toolset not found at $msvRoot"
exit 1
}
# Get the latest MSVC version folder
$msvVersions = Get-ChildItem -Path $msvRoot -Directory | Sort-Object Name -Descending
if ($msvVersions.Count -eq 0) {
Write-Error "No MSVC versions found in $msvRoot"
exit 1
}
return Join-Path $msvRoot $msvVersions[0].Name
}
function Find-WindowsSDKVersion {
<#
.SYNOPSIS
Detects the Windows SDK version from the registry
#>
$regPath = "HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots"
if (Test-Path $regPath) {
$sdkRoot = Get-ItemProperty -Path $regPath -Name KitsRoot10
$sdkRoot = $sdkRoot.KitsRoot10
if (Test-Path (Join-Path $sdkRoot "Include")) {
# Get the latest SDK version folder
$versions = Get-ChildItem -Path (Join-Path $sdkRoot "Include") -Directory |
Where-Object { $_.Name -match '^\d+\.\d+\.\d+\.\d+$' } |
Sort-Object Name -Descending
if ($versions.Count -gt 0) {
return @{
Version = $versions[0].Name
Path = $sdkRoot
}
}
}
}
Write-Error "Windows SDK not found"
exit 1
}
# ============================================
# Main Setup
# ============================================
Write-Host "=== Detecting Visual Studio Installation ===" -ForegroundColor Cyan
$vsPath = Find-VisualStudioPath
Write-Host "Found Visual Studio at: $vsPath" -ForegroundColor Green
Write-Host "`n=== Detecting MSVC Toolset ===" -ForegroundColor Cyan
$msvPath = Find-MSVCPath -VSPath $vsPath
Write-Host "Found MSVC at: $msvPath" -ForegroundColor Green
Write-Host "`n=== Detecting Windows SDK ===" -ForegroundColor Cyan
$sdkInfo = Find-WindowsSDKVersion
$winKitVersion = $sdkInfo.Version
$winKitPath = $sdkInfo.Path
Write-Host "Found Windows SDK $winKitVersion at: $winKitPath" -ForegroundColor Green
# ============================================
# Initialize MSVC Environment with vcvarsarm64.bat
# ============================================
Write-Host "`n=== Initializing MSVC Environment ===" -ForegroundColor Cyan
$vcvarsPath = Join-Path $vsPath "VC\Auxiliary\Build\vcvarsarm64.bat"
if (-not (Test-Path $vcvarsPath)) {
Write-Error "vcvarsarm64.bat not found at $vcvarsPath"
exit 1
}
# Detect Visual Studio version from path
$vsVersion = (Split-Path $vsPath -Parent | Split-Path -Leaf)
Write-Host "Detected Visual Studio version: $vsVersion" -ForegroundColor Yellow
# Map VS directory to version number (17=2022, 18=2026, etc.)
$versionMap = @{
"17" = "17.0"
"18" = "18.0"
"19" = "19.0"
}
$visualStudioVersion = $versionMap[$vsVersion]
if (-not $visualStudioVersion) {
$visualStudioVersion = "$vsVersion.0"
}
Write-Host "Executing: `"$vcvarsPath`"" -ForegroundColor Yellow
$output = cmd /c """$vcvarsPath"" && set"
# Parse and set all environment variables from vcvarsarm64.bat
foreach ($line in $output) {
if ($line -match "^([^=]+)=(.*)$") {
$varName = $matches[1].Trim()
$varValue = $matches[2].Trim()
if ($varName -and $varValue) {
Set-Item -Force -Path "ENV:\$varName" -Value $varValue 2>$null
}
}
}
# Explicitly set required variables for Meson
$env:VSINSTALLDIR = $vsPath
$env:VisualStudioVersion = $visualStudioVersion
$env:VCINSTALLDIR = $msvPath
# Verify critical variables
$requiredVars = @{
"VSINSTALLDIR" = $vsPath
"VisualStudioVersion" = $visualStudioVersion
"VCINSTALLDIR" = $msvPath
}
Write-Host "`nEnvironment variables set:" -ForegroundColor Green
foreach ($var in $requiredVars.GetEnumerator()) {
$value = Get-Item -Path "ENV:\$($var.Key)" -ErrorAction SilentlyContinue
if ($value) {
Write-Host " $($var.Key) = $($value.Value)" -ForegroundColor Green
}
else {
Write-Warning " $($var.Key) not set!"
}
}
Write-Host "MSVC environment initialized" -ForegroundColor Green
# ============================================
# Configure Include Paths
# ============================================
Write-Host "`n=== Configuring Include Paths ===" -ForegroundColor Cyan
$includeList = @(
"$msvPath\include",
"$winKitPath\Include\$winKitVersion\ucrt",
"$winKitPath\Include\$winKitVersion\um",
"$winKitPath\Include\$winKitVersion\shared"
"$vcpkgRoot\installed\arm64-windows\include"
)
$env:INCLUDE = $includeList -join ";"
Write-Host "INCLUDE path configured" -ForegroundColor Green
# Dump INCLUDE
#$env:INCLUDE | ForEach-Object { $_.Split(';') | Select-Object -First 20 }
# ============================================
# Configure Library Paths
# ============================================
Write-Host "`n=== Configuring Library Paths ===" -ForegroundColor Cyan
$libList = @(
"$msvPath\lib\arm64",
"$winKitPath\Lib\$winKitVersion\ucrt\arm64",
"$winKitPath\Lib\$winKitVersion\um\arm64"
"$vcpkgRoot\installed\arm64-windows\lib"
)
$env:LIB = $libList -join ";"
$env:LIBPATH = $env:LIB
Write-Host "LIB and LIBPATH configured" -ForegroundColor Green
# Dump LIB
#$env:LIB | ForEach-Object { $_.Split(';') | Select-Object -First 20 }
# ============================================
# Configure PATH
# ============================================
Write-Host "`n=== Configuring System PATH ===" -ForegroundColor Cyan
$pythonPath = "C:\Python314"
#$pythonPath = Join-Path $env:LocalAppData "Programs\Python\Python314"
$pythonScripts = Join-Path $pythonPath "Scripts"
$pythonUserScripts = Join-Path $env:AppData "Python\Python314\Scripts"
$vcpkgRoot = "C:\tools\vcpkg"
$codeInsiders = Join-Path $env:LocalAppData "Programs\Microsoft VS Code Insiders\bin"
$vsCode = Join-Path $env:LocalAppData "Programs\Microsoft VS Code\bin"
# Perl paths - try Strawberry Perl first, then ActivePerl
$perlPath = $null
$perlCandidates = @(
"C:\Strawberry\perl\bin",
"${env:ProgramFiles}\Strawberry\perl\bin",
"${env:ProgramFiles(x86)}\Strawberry\perl\bin",
"C:\Perl\bin",
"${env:ProgramFiles}\ActivePerl\bin"
)
foreach ($candidate in $perlCandidates) {
if (Test-Path $candidate) {
$perlPath = $candidate
Write-Host "Found Perl at: $perlPath" -ForegroundColor Green
break
}
}
if (-not $perlPath) {
Write-Warning "Perl not found in standard locations. PostgreSQL build may fail."
Write-Warning "Install Strawberry Perl from https://strawberryperl.com/"
}
$pathArray = @(
# ARM64 MSVC compiler
"$msvPath\bin\HostARM64\ARM64",
# ARM64 Python (BEFORE system Python or other tools)
$pythonPath,
$pythonScripts,
$pythonUserScripts,
# Add Perl to PATH
$perlPath,
# ARM64 vcpkg
"$vcpkgRoot\installed\arm64-windows\bin",
# Windows Kits ARM64
"$winKitPath\bin\$winKitVersion\arm64",
# System paths
"$env:SystemRoot\system32",
"$env:SystemRoot",
"$env:SystemRoot\System32\Wbem",
"$env:SystemRoot\System32\WindowsPowerShell\v1.0",
$codeInsiders,
$vsCode,
# Optional tools (but keep at end)
"${env:ProgramFiles}\Git\cmd",
"${env:ProgramFiles}\Neovim\bin",
"${env:ProgramFiles(x86)}\Windows Kits\10\Windows Performance Toolkit",
"${env:ProgramData}\chocolatey\bin",
"${env:ProgramFiles}\CMake\bin",
"C:\tools"
)
# Filter out null/empty entries and non-existent paths
$env:PATH = ($pathArray | Where-Object { $_ -and (Test-Path $_) }) -join ";"
Write-Host "PATH configured" -ForegroundColor Green
# Dump PATH
#$env:PATH | ForEach-Object { $_.Split(';') | Select-Object -First 20 }
# ============================================
# Configure vcpkg and CMake
# ============================================
Write-Host "`n=== Configuring vcpkg and CMake ===" -ForegroundColor Cyan
if (Test-Path $vcpkgRoot) {
$env:VCPKG_ROOT = $vcpkgRoot
$env:CMAKE_PREFIX_PATH = "$vcpkgRoot\installed\arm64-windows"
# Set PKG_CONFIG_PATH for Meson to find vcpkg dependencies
$env:PKG_CONFIG_PATH = "$vcpkgRoot\installed\arm64-windows\lib\pkgconfig"
# Add vcpkg tools to PATH (includes pkg-config, ninja from vcpkg-tool-meson, etc.)
$vcpkgBinPath = "$vcpkgRoot\installed\arm64-windows\bin"
$vcpkgToolsPath = "$vcpkgRoot\tools"
if ($vcpkgBinPath -notin $env:PATH.Split(";")) {
$env:PATH = "$vcpkgBinPath;$env:PATH"
}
if ($vcpkgToolsPath -notin $env:PATH.Split(";")) {
$env:PATH = "$vcpkgToolsPath;$env:PATH"
}
Write-Host "vcpkg configured:" -ForegroundColor Green
Write-Host " VCPKG_ROOT = $env:VCPKG_ROOT" -ForegroundColor Green
Write-Host " CMAKE_PREFIX_PATH = $env:CMAKE_PREFIX_PATH" -ForegroundColor Green
Write-Host " PKG_CONFIG_PATH = $env:PKG_CONFIG_PATH" -ForegroundColor Green
Write-Host " Added to PATH: $vcpkgBinPath" -ForegroundColor Green
}
else {
Write-Warning "vcpkg not found at $vcpkgRoot - skipping vcpkg configuration"
}
# ============================================
# Run Meson Setup
# ============================================
Write-Host "`n=== Running Meson Setup ===" -ForegroundColor Cyan
$mesonBuildDir = "build"
$mesonPrefix = "${env:ProgramFiles}\postgresql"
# Use ninja backend instead of vs, which works better with newer MSVC
$mesonArgs = @(
"setup"
$mesonBuildDir
"--reconfigure"
# "--vsenv"
# "--backend", "vs"
"--backend", "ninja"
"--prefix=$mesonPrefix"
"--buildtype=debugoptimized"
"-Dplperl=disabled"
"-Dextra_lib_dirs=$extraLibDir"
"-Dextra_include_dirs=$extraIncludeDir"
"-Dpkg_config_path=$env:PKG_CONFIG_PATH"
)
Write-Host "Executing: meson $($mesonArgs -join ' ')" -ForegroundColor Yellow
meson @mesonArgs