diff --git a/.github/ISSUE_TEMPLATE/announcement.yml b/.github/ISSUE_TEMPLATE/announcement.yml
index 7ad957a50..b6d6964f4 100644
--- a/.github/ISSUE_TEMPLATE/announcement.yml
+++ b/.github/ISSUE_TEMPLATE/announcement.yml
@@ -44,6 +44,7 @@ body:
- label: macOS 14 Arm64
- label: macOS 15
- label: macOS 15 Arm64
+ - label: macOS 26 Arm64
- label: Windows Server 2019
- label: Windows Server 2022
- label: Windows Server 2025
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
index 64ae26c41..a3b104031 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -27,6 +27,7 @@ body:
- label: macOS 14 Arm64
- label: macOS 15
- label: macOS 15 Arm64
+ - label: macOS 26 Arm64
- label: Windows Server 2019
- label: Windows Server 2022
- label: Windows Server 2025
diff --git a/.github/ISSUE_TEMPLATE/tool-request.yml b/.github/ISSUE_TEMPLATE/tool-request.yml
index 0983d76a4..ac528d458 100644
--- a/.github/ISSUE_TEMPLATE/tool-request.yml
+++ b/.github/ISSUE_TEMPLATE/tool-request.yml
@@ -65,6 +65,7 @@ body:
- label: macOS 14 Arm64
- label: macOS 15
- label: macOS 15 Arm64
+ - label: macOS 26 Arm64
- label: Windows Server 2019
- label: Windows Server 2022
- label: Windows Server 2025
diff --git a/README.md b/README.md
index 2d7f2624e..467f5d21f 100644
--- a/README.md
+++ b/README.md
@@ -22,6 +22,7 @@ To build a VM machine from this repo's source, see the [instructions](docs/creat
| --------------------|---------------------|--------------------|
| Ubuntu 24.04 | `ubuntu-latest` or `ubuntu-24.04` | [ubuntu-24.04] |
| Ubuntu 22.04 | `ubuntu-22.04` | [ubuntu-22.04] |
+| macOS 26 Arm64 `beta` | `macos-15` or `macos-26-xlarge` | [macOS-26-arm64] |
| macOS 15 | `macos-latest-large` or `macos-15-large`| [macOS-15] |
| macOS 15 Arm64 | `macos-latest`, `macos-15`, or `macos-15-xlarge` | [macOS-15-arm64] |
| macOS 14 | `macos-14-large`| [macOS-14] |
@@ -48,6 +49,7 @@ To build a VM machine from this repo's source, see the [instructions](docs/creat
[macOS-14-arm64]: https://github.com/actions/runner-images/blob/main/images/macos/macos-14-arm64-Readme.md
[macOS-15]: https://github.com/actions/runner-images/blob/main/images/macos/macos-15-Readme.md
[macOS-15-arm64]: https://github.com/actions/runner-images/blob/main/images/macos/macos-15-arm64-Readme.md
+[macOS-26-arm64]: https://github.com/actions/runner-images/blob/main/images/macos/macos-26-arm64-Readme.md
[self-hosted runners]: https://help.github.com/en/actions/hosting-your-own-runners
## Announcements
diff --git a/images/macos/macos-26-arm64-Readme.md b/images/macos/macos-26-arm64-Readme.md
new file mode 100644
index 000000000..5ddc1ec13
--- /dev/null
+++ b/images/macos/macos-26-arm64-Readme.md
@@ -0,0 +1,211 @@
+# macOS 26
+- OS Version: macOS 26.0 (25A5351b)
+- Kernel Version: Darwin 25.0.0
+- Image Version: 20250910.90
+
+## Installed Software
+
+### Language and Runtime
+- .NET Core SDK: 8.0.101, 8.0.204, 8.0.303, 8.0.414, 9.0.102, 9.0.203, 9.0.305
+- Bash 3.2.57(1)-release
+- Clang/LLVM 17.0.0
+- Clang/LLVM (Homebrew) 20.1.8 - available on `$(brew --prefix llvm@20)/bin/clang`
+- GCC 13 (Homebrew GCC 13.4.0) - available by `gcc-13` alias
+- GCC 14 (Homebrew GCC 14.3.0) - available by `gcc-14` alias
+- GCC 15 (Homebrew GCC 15.1.0) - available by `gcc-15` alias
+- GNU Fortran 13 (Homebrew GCC 13.4.0) - available by `gfortran-13` alias
+- GNU Fortran 14 (Homebrew GCC 14.3.0) - available by `gfortran-14` alias
+- GNU Fortran 15 (Homebrew GCC 15.1.0) - available by `gfortran-15` alias
+- Kotlin 2.2.20-release-333
+- Node.js 24.7.0
+- Perl 5.40.2
+- Python3 3.13.7
+- Ruby 3.4.5
+
+### Package Management
+- Bundler 2.7.2
+- Carthage 0.40.0
+- CocoaPods 1.16.2
+- Homebrew 4.6.10
+- NPM 11.5.1
+- Pip3 25.2 (python 3.13)
+- Pipx 1.7.1
+- RubyGems 3.7.2
+- Vcpkg 2025 (build from commit 5ed7006439)
+- Yarn 1.22.22
+
+### Project Management
+- Apache Ant 1.10.15
+- Apache Maven 3.9.11
+- Gradle 9.0.0
+
+### Utilities
+- 7-Zip 17.05
+- aria2 1.37.0
+- azcopy 10.30.1
+- bazel 8.4.0
+- bazelisk 1.27.0
+- bsdtar 3.5.3 - available by 'tar' alias
+- Curl 8.7.1
+- Git 2.50.1
+- Git LFS 3.7.0
+- GitHub CLI 2.79.0
+- GNU Tar 1.35 - available by 'gtar' alias
+- GNU Wget 1.25.0
+- gpg (GnuPG) 2.4.8
+- jq 1.8.1
+- OpenSSL 3.5.2 5 Aug 2025 (Library: OpenSSL 3.5.2 5 Aug 2025)
+- Packer 1.14.2
+- pkgconf 2.5.1
+- Unxip 3.2
+- yq 4.47.2
+- zstd 1.5.7
+- Ninja 1.13.1
+
+### Tools
+- AWS CLI 2.29.0
+- AWS SAM CLI 1.143.0
+- AWS Session Manager CLI 1.2.707.0
+- Azure CLI 2.77.0
+- Azure CLI (azure-devops) 1.0.2
+- Bicep CLI 0.37.4
+- Cmake 4.1.1
+- CodeQL Action Bundle 2.23.0
+- Fastlane 2.228.0
+- SwiftFormat 0.57.2
+- Xcbeautify 2.30.1
+- Xcode Command Line Tools 26.0.0.0.1.1755155385
+- Xcodes 1.6.2
+
+### Browsers
+- Safari 26.0 (21622.1.22.11.14)
+- SafariDriver 26.0 (21622.1.22.11.14)
+- Google Chrome 140.0.7339.133
+- Google Chrome for Testing 140.0.7339.82
+- ChromeDriver 140.0.7339.82
+- Microsoft Edge 140.0.3485.54
+- Microsoft Edge WebDriver 140.0.3485.54
+- Mozilla Firefox 142.0.1
+- geckodriver 0.36.0
+- Selenium server 4.35.0
+
+#### Environment variables
+| Name | Value |
+| --------------- | --------------------------------------- |
+| CHROMEWEBDRIVER | /usr/local/share/chromedriver-mac-arm64 |
+| EDGEWEBDRIVER | /usr/local/share/edge_driver |
+| GECKOWEBDRIVER | /opt/homebrew/opt/geckodriver/bin |
+
+### Java
+| Version | Environment Variable |
+| -------------------- | -------------------- |
+| 11.0.28+6 | JAVA_HOME_11_arm64 |
+| 17.0.16+8 | JAVA_HOME_17_arm64 |
+| 21.0.8+9.0 (default) | JAVA_HOME_21_arm64 |
+
+### Cached Tools
+
+#### Ruby
+- 3.2.9
+- 3.3.9
+- 3.4.5
+
+#### Python
+- 3.11.9
+- 3.12.10
+- 3.13.7
+
+#### Node.js
+- 20.19.5
+- 22.19.0
+- 24.7.0
+
+#### Go
+- 1.23.12
+- 1.24.7
+- 1.25.1
+
+### Rust Tools
+- Cargo 1.89.0
+- Rust 1.89.0
+- Rustdoc 1.89.0
+- Rustup 1.28.2
+
+#### Packages
+- Clippy 0.1.89
+- Rustfmt 1.8.0-stable
+
+### PowerShell Tools
+- PowerShell 7.4.11
+
+#### PowerShell Modules
+- Az: 14.3.0
+- Pester: 5.7.1
+- PSScriptAnalyzer: 1.24.0
+
+### Xcode
+| Version | Build | Path | Symlinks |
+| -------------- | ------ | -------------------------------------------- | ----------------------------------------------------------------------------------------- |
+| 26.0 (default) | 17A321 | /Applications/Xcode_26_Release_Candidate.app | /Applications/Xcode_26.0.0.app
/Applications/Xcode_26.0.app
/Applications/Xcode.app |
+| 16.4 | 16F6 | /Applications/Xcode_16.4.app | /Applications/Xcode_16.4.0.app |
+
+#### Installed SDKs
+| SDK | SDK Name | Xcode Version |
+| ------------------------- | -------------------- | ------------- |
+| macOS 15.5 | macosx15.5 | 16.4 |
+| macOS 26.0 | macosx26.0 | 26.0 |
+| iOS 18.5 | iphoneos18.5 | 16.4 |
+| iOS 26.0 | iphoneos26.0 | 26.0 |
+| Simulator - iOS 18.5 | iphonesimulator18.5 | 16.4 |
+| Simulator - iOS 26.0 | iphonesimulator26.0 | 26.0 |
+| tvOS 18.5 | appletvos18.5 | 16.4 |
+| tvOS 26.0 | appletvos26.0 | 26.0 |
+| Simulator - tvOS 18.5 | appletvsimulator18.5 | 16.4 |
+| Simulator - tvOS 26.0 | appletvsimulator26.0 | 26.0 |
+| watchOS 11.5 | watchos11.5 | 16.4 |
+| watchOS 26.0 | watchos26.0 | 26.0 |
+| Simulator - watchOS 11.5 | watchsimulator11.5 | 16.4 |
+| Simulator - watchOS 26.0 | watchsimulator26.0 | 26.0 |
+| visionOS 2.5 | xros2.5 | 16.4 |
+| visionOS 26.0 | xros26.0 | 26.0 |
+| Simulator - visionOS 2.5 | xrsimulator2.5 | 16.4 |
+| Simulator - visionOS 26.0 | xrsimulator26.0 | 26.0 |
+| DriverKit 24.5 | driverkit24.5 | 16.4 |
+| DriverKit 25.0 | driverkit25.0 | 26.0 |
+
+#### Installed Simulators
+| OS | Simulators |
+| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| iOS 18.5 | iPhone 16
iPhone 16 Plus
iPhone 16 Pro
iPhone 16 Pro Max
iPhone 16e
iPad (A16)
iPad Air 11-inch (M3)
iPad Air 13-inch (M3)
iPad mini (A17 Pro)
iPad Pro 11-inch (M4)
iPad Pro 13-inch (M4) |
+| iOS 18.6 | iPhone 16
iPhone 16 Plus
iPhone 16 Pro
iPhone 16 Pro Max
iPhone 16e
iPad (A16)
iPad Air 11-inch (M3)
iPad Air 13-inch (M3)
iPad mini (A17 Pro)
iPad Pro 11-inch (M4)
iPad Pro 13-inch (M4) |
+| iOS 26.0 | iPhone 16e
iPhone 17
iPhone 17 Pro
iPhone 17 Pro Max
iPhone Air
iPad (A16)
iPad Air 11-inch (M3)
iPad Air 13-inch (M3)
iPad mini (A17 Pro)
iPad Pro 11-inch (M4)
iPad Pro 13-inch (M4) |
+| tvOS 18.5 | Apple TV
Apple TV 4K (3rd generation)
Apple TV 4K (3rd generation) (at 1080p) |
+| tvOS 26.0 | Apple TV
Apple TV 4K (3rd generation)
Apple TV 4K (3rd generation) (at 1080p) |
+| watchOS 11.5 | Apple Watch SE (40mm) (2nd generation)
Apple Watch SE (44mm) (2nd generation)
Apple Watch Series 10 (42mm)
Apple Watch Series 10 (46mm)
Apple Watch Ultra 2 (49mm) |
+| watchOS 26.0 | Apple Watch SE 3 (40mm)
Apple Watch SE 3 (44mm)
Apple Watch Series 11 (42mm)
Apple Watch Series 11 (46mm)
Apple Watch Ultra 3 (49mm) |
+| visionOS 2.5 | Apple Vision Pro |
+| visionOS 26.0 | Apple Vision Pro |
+
+### Android
+| Package Name | Version |
+| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Android Command Line Tools | 16.0 |
+| Android Emulator | 36.1.9 |
+| Android SDK Build-tools | 36.0.0
35.0.0 35.0.1 |
+| Android SDK Platforms | android-36-ext19 (rev 1)
android-36-ext18 (rev 1)
android-36 (rev 2)
android-35-ext15 (rev 1)
android-35-ext14 (rev 1)
android-35 (rev 2)
android-34-ext8 (rev 1)
android-34-ext12 (rev 1)
android-34-ext11 (rev 1)
android-34-ext10 (rev 1)
android-33-ext5 (rev 1)
android-33-ext4 (rev 1) |
+| Android SDK Platform-Tools | 36.0.0 |
+| Android Support Repository | 47.0.0 |
+| CMake | 3.31.5 |
+| Google Play services | 49 |
+| Google Repository | 58 |
+| NDK | 27.3.13750724 (default)
28.2.13676358 |
+
+#### Environment variables
+| Name | Value |
+| ----------------------- | --------------------------------------------------- |
+| ANDROID_HOME | /Users/runner/Library/Android/sdk |
+| ANDROID_NDK | /Users/runner/Library/Android/sdk/ndk/27.3.13750724 |
+| ANDROID_NDK_HOME | /Users/runner/Library/Android/sdk/ndk/27.3.13750724 |
+| ANDROID_NDK_LATEST_HOME | /Users/runner/Library/Android/sdk/ndk/28.2.13676358 |
+| ANDROID_NDK_ROOT | /Users/runner/Library/Android/sdk/ndk/27.3.13750724 |
+| ANDROID_SDK_ROOT | /Users/runner/Library/Android/sdk |
diff --git a/images/macos/scripts/build/configure-tccdb-macos.sh b/images/macos/scripts/build/configure-tccdb-macos.sh
index 340b96883..acc600337 100644
--- a/images/macos/scripts/build/configure-tccdb-macos.sh
+++ b/images/macos/scripts/build/configure-tccdb-macos.sh
@@ -48,8 +48,8 @@ systemValuesArray=(
"'kTCCServiceSystemPolicyNetworkVolumes','com.apple.Terminal',0,2,4,1,X'fade0c000000003000000001000000060000000200000012636f6d2e6170706c652e5465726d696e616c000000000003',NULL,0,'UNUSED',NULL,0,1678990068"
)
for values in "${systemValuesArray[@]}"; do
- if is_Sonoma || is_Sequoia; then
- # TCC access table in Sonoma has extra 4 columns: pid, pid_version, boot_uuid, last_reminded
+ if ! is_Ventura; then
+ # TCC access table in Sonoma and later has extra 4 columns: pid, pid_version, boot_uuid, last_reminded
configure_system_tccdb "$values,NULL,NULL,'UNUSED',${values##*,}"
else
configure_system_tccdb "$values"
@@ -98,8 +98,8 @@ userValuesArray=(
"'kTCCServiceUbiquity','com.apple.mail',0,2,0,1,NULL,NULL,NULL,'UNUSED',NULL,NULL,1551941469"
)
for values in "${userValuesArray[@]}"; do
- if is_Sonoma || is_Sequoia; then
- # TCC access table in Sonoma has extra 4 columns: pid, pid_version, boot_uuid, last_reminded
+ if ! is_Ventura; then
+ # TCC access table in Sonoma and later has extra 4 columns: pid, pid_version, boot_uuid, last_reminded
configure_user_tccdb "$values,NULL,NULL,'UNUSED',${values##*,}"
else
configure_user_tccdb "$values"
diff --git a/images/macos/scripts/build/install-common-utils.sh b/images/macos/scripts/build/install-common-utils.sh
index 68622f8d6..269ff8938 100644
--- a/images/macos/scripts/build/install-common-utils.sh
+++ b/images/macos/scripts/build/install-common-utils.sh
@@ -61,6 +61,7 @@ if is_SonomaX64 || is_VenturaX64 || is_SequoiaX64; then
if is_SonomaX64; then
osascript $HOME/utils/confirm-identified-developers-macos14.scpt $USER_PASSWORD
fi
+
if is_SequoiaX64; then
osascript $HOME/utils/confirm-identified-developers-macos15.scpt $USER_PASSWORD
fi
diff --git a/images/macos/scripts/docs-gen/Generate-SoftwareReport.ps1 b/images/macos/scripts/docs-gen/Generate-SoftwareReport.ps1
index 054b7a128..9cab34a63 100644
--- a/images/macos/scripts/docs-gen/Generate-SoftwareReport.ps1
+++ b/images/macos/scripts/docs-gen/Generate-SoftwareReport.ps1
@@ -37,12 +37,12 @@ $languageAndRuntime.AddNodes($(Get-ClangLLVMVersions))
$languageAndRuntime.AddNodes($(Get-GccVersions))
$languageAndRuntime.AddNodes($(Get-FortranVersions))
$languageAndRuntime.AddToolVersion("Kotlin", $(Get-KotlinVersion))
-if ((-not $os.IsSequoia)) {
+if (($os.IsVentura -or $os.IsSonoma)) {
$languageAndRuntime.AddToolVersion("Mono", $(Get-MonoVersion))
}
$languageAndRuntime.AddToolVersion("Node.js", $(Get-NodeVersion))
$languageAndRuntime.AddToolVersion("Perl", $(Get-PerlVersion))
-if ((-not $os.IsVenturaArm64) -and (-not $os.IsSonomaArm64) -and (-not $os.IsSequoiaArm64)) {
+if ((-not $os.IsArm64)) {
$languageAndRuntime.AddToolVersion("PHP", $(Get-PHPVersion))
}
$languageAndRuntime.AddToolVersion("Python3", $(Get-Python3Version))
@@ -53,12 +53,12 @@ $packageManagement = $installedSoftware.AddHeader("Package Management")
$packageManagement.AddToolVersion("Bundler", $(Get-BundlerVersion))
$packageManagement.AddToolVersion("Carthage", $(Get-CarthageVersion))
$packageManagement.AddToolVersion("CocoaPods", $(Get-CocoaPodsVersion))
-if ((-not $os.IsVenturaArm64) -and (-not $os.IsSonomaArm64) -and (-not $os.IsSequoiaArm64)) {
+if ((-not $os.IsArm64)) {
$packageManagement.AddToolVersion("Composer", $(Get-ComposerVersion))
}
$packageManagement.AddToolVersion("Homebrew", $(Get-HomebrewVersion))
$packageManagement.AddToolVersion("NPM", $(Get-NPMVersion))
-if ((-not $os.IsSequoia)) {
+if (($os.IsVentura -or $os.IsSonoma)) {
$packageManagement.AddToolVersion("NuGet", $(Get-NuGetVersion))
}
$packageManagement.AddToolVersion("Pip3", $(Get-Pip3Version))
@@ -116,8 +116,8 @@ $tools.AddToolVersion("Xcode Command Line Tools", $(Get-XcodeCommandLineToolsVer
$tools.AddToolVersion("Xcodes", $(Get-XcodesVersion))
# Linters
-$linters = $installedSoftware.AddHeader("Linters")
-if ((-not $os.IsVenturaArm64) -and (-not $os.IsSonomaArm64) -and (-not $os.IsSequoiaArm64)) {
+if ((-not $os.IsArm64)) {
+ $linters = $installedSoftware.AddHeader("Linters")
$linters.AddToolVersion("SwiftLint", $(Get-SwiftLintVersion))
}
@@ -174,7 +174,7 @@ $android.AddTable($androidTable)
$androidEnv = $android.AddHeader("Environment variables")
$androidEnv.AddTable($(Build-AndroidEnvironmentTable))
-if ($os.IsSonoma -or $os.IsVentura -or $os.IsSequoiaX64) {
+if ($os.IsSonoma -or $os.IsVentura -or (-not $os.IsArm64)) {
$miscellaneous = $installedSoftware.AddHeader("Miscellaneous")
}
@@ -182,7 +182,7 @@ if ($os.IsSonoma -or $os.IsVentura) {
$miscellaneous.AddToolVersion("Tcl/Tk", $(Get-TclTkVersion))
}
-if ($os.IsSonomaX64 -or $os.IsVenturaX64 -or $os.IsSequoiaX64) {
+if ((-not $os.IsArm64)) {
Write-Host "Adding environment variables for parallels"
diff --git a/images/macos/scripts/docs-gen/SoftwareReport.Browsers.psm1 b/images/macos/scripts/docs-gen/SoftwareReport.Browsers.psm1
index ca7f32492..86683917d 100644
--- a/images/macos/scripts/docs-gen/SoftwareReport.Browsers.psm1
+++ b/images/macos/scripts/docs-gen/SoftwareReport.Browsers.psm1
@@ -74,7 +74,7 @@ function Get-GeckodriverVersion {
function Get-SeleniumVersion {
$os = Get-OSVersion
- if ($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoiaArm64) {
+ if ($os.IsArm64) {
$cellarPath = "/opt/homebrew/Cellar"
} else {
$cellarPath = "/usr/local/Cellar"
diff --git a/images/macos/scripts/docs-gen/SoftwareReport.Java.psm1 b/images/macos/scripts/docs-gen/SoftwareReport.Java.psm1
index af762405b..771e033e8 100644
--- a/images/macos/scripts/docs-gen/SoftwareReport.Java.psm1
+++ b/images/macos/scripts/docs-gen/SoftwareReport.Java.psm1
@@ -2,7 +2,7 @@ function Get-JavaVersions {
$defaultJavaPath = (Get-Item env:JAVA_HOME).value
$os = Get-OSVersion
- if ($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoiaArm64) {
+ if ($os.IsArm64) {
$javaVersions = Get-Item env:JAVA_HOME_*_arm64
} else {
$javaVersions = Get-Item env:JAVA_HOME_*_X64
diff --git a/images/macos/scripts/docs-gen/SoftwareReport.Toolcache.psm1 b/images/macos/scripts/docs-gen/SoftwareReport.Toolcache.psm1
index 67576ec0d..6eb2f3d4f 100644
--- a/images/macos/scripts/docs-gen/SoftwareReport.Toolcache.psm1
+++ b/images/macos/scripts/docs-gen/SoftwareReport.Toolcache.psm1
@@ -37,7 +37,7 @@ function Build-ToolcacheSection {
$nodes = @()
- if ((-not $os.IsVenturaArm64) -and (-not $os.IsSonoma) -and (-not $os.IsSequoia)) {
+ if ($os.IsVenturaX64) {
$nodes += @(
[ToolVersionsListNode]::new("PyPy", $(Get-ToolcachePyPyVersions), '^\d+\.\d+', "List")
)
diff --git a/images/macos/scripts/helpers/Common.Helpers.psm1 b/images/macos/scripts/helpers/Common.Helpers.psm1
index ec65b7c98..bf98adc44 100644
--- a/images/macos/scripts/helpers/Common.Helpers.psm1
+++ b/images/macos/scripts/helpers/Common.Helpers.psm1
@@ -35,9 +35,10 @@ function Get-OSVersion {
IsSonoma = $($osVersion.Version.Major -eq "14")
IsSonomaArm64 = $($osVersion.Version.Major -eq "14" -and $processorArchitecture -eq "arm64")
IsSonomaX64 = $($osVersion.Version.Major -eq "14" -and $processorArchitecture -ne "arm64")
- IsSequoia = $($osVersion.Version.Major -eq "15")
- IsSequoiaArm64 = $($osVersion.Version.Major -eq "15" -and $processorArchitecture -eq "arm64")
- IsSequoiaX64 = $($osVersion.Version.Major -eq "15" -and $processorArchitecture -ne "arm64")
+ IsSequoia = $($osVersion.Version.Major -eq "15")
+ IsSequoiaArm64 = $($osVersion.Version.Major -eq "15" -and $processorArchitecture -eq "arm64")
+ IsSequoiaX64 = $($osVersion.Version.Major -eq "15" -and $processorArchitecture -ne "arm64")
+ IsTahoe = $($osVersion.Version.Major -eq "26")
}
}
diff --git a/images/macos/scripts/helpers/utils.sh b/images/macos/scripts/helpers/utils.sh
index df45ad58f..8849cbcdf 100644
--- a/images/macos/scripts/helpers/utils.sh
+++ b/images/macos/scripts/helpers/utils.sh
@@ -45,6 +45,10 @@ is_Arm64() {
[ "$(arch)" = "arm64" ]
}
+is_Tahoe() {
+ [ "$OSTYPE" = "darwin25" ]
+}
+
is_Sequoia() {
[ "$OSTYPE" = "darwin24" ]
}
diff --git a/images/macos/scripts/tests/BasicTools.Tests.ps1 b/images/macos/scripts/tests/BasicTools.Tests.ps1
index a86d71a53..ea69361a5 100644
--- a/images/macos/scripts/tests/BasicTools.Tests.ps1
+++ b/images/macos/scripts/tests/BasicTools.Tests.ps1
@@ -56,7 +56,7 @@ Describe "Perl" {
}
}
-Describe "Tcl/Tk" -Skip:($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoia) {
+Describe "Tcl/Tk" -Skip:(-not ($os.IsVenturaX64 -or $os.IsSonomaX64)) {
It "libtcl" {
Test-Path "/usr/local/lib/libtcl8.6.dylib" | Should -BeTrue
Test-Path "/usr/local/lib/libtk8.6.dylib" | Should -BeTrue
diff --git a/images/macos/scripts/tests/Databases.Tests.ps1 b/images/macos/scripts/tests/Databases.Tests.ps1
deleted file mode 100644
index 38539136b..000000000
--- a/images/macos/scripts/tests/Databases.Tests.ps1
+++ /dev/null
@@ -1,23 +0,0 @@
-Import-Module "$PSScriptRoot/../helpers/Common.Helpers.psm1"
-
-$os = Get-OSVersion
-
-Describe "MongoDB" -Skip:($os.IsVentura -or $os.IsSonoma -or $os.IsSequoia) {
- It "" -TestCases @(
- @{ ToolName = "mongo" }
- @{ ToolName = "mongod" }
- ) {
- $toolsetVersion = (Get-ToolsetContent).mongodb.version
- (&$ToolName --version)[2].Split('"')[-2] | Should -BeLike "$toolsetVersion*"
- }
-}
-
-Describe "PostgreSQL" -Skip:($os.IsVentura -or $os.IsSonoma -or $os.IsSequoia) {
- It "PostgreSQL version should correspond to the version in the toolset" {
- $toolsetVersion = (Get-ToolsetContent).postgresql.version
- # Client version
- (psql --version).split()[-2] | Should -BeLike "$toolsetVersion*"
- # Server version
- (pg_config --version).split()[-2] | Should -BeLike "$toolsetVersion*"
- }
-}
diff --git a/images/macos/scripts/tests/Linters.Tests.ps1 b/images/macos/scripts/tests/Linters.Tests.ps1
index 93ac37e0e..e3121ce67 100644
--- a/images/macos/scripts/tests/Linters.Tests.ps1
+++ b/images/macos/scripts/tests/Linters.Tests.ps1
@@ -2,7 +2,7 @@ Import-Module "$PSScriptRoot/Helpers.psm1" -DisableNameChecking
$os = Get-OSVersion
-Describe "SwiftLint" -Skip:($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoiaArm64) {
+Describe "SwiftLint" -Skip:($os.IsArm64) {
It "SwiftLint" {
"swiftlint version" | Should -ReturnZeroExitCode
}
diff --git a/images/macos/scripts/tests/OpenSSL.Tests.ps1 b/images/macos/scripts/tests/OpenSSL.Tests.ps1
index 1fb8886a8..150eb2559 100644
--- a/images/macos/scripts/tests/OpenSSL.Tests.ps1
+++ b/images/macos/scripts/tests/OpenSSL.Tests.ps1
@@ -1,5 +1,7 @@
Import-Module "$PSScriptRoot/../helpers/Common.Helpers.psm1"
+$os = Get-OSVersion
+
Describe "OpenSSL" {
Context "OpenSSL Version" {
It "OpenSSL is available" {
@@ -7,17 +9,31 @@ Describe "OpenSSL" {
}
}
- Context "OpenSSL 1.1 Path Check" {
+ Context "OpenSSL 1.1 Path Check" -Skip:($os.IsTahoe) {
It "OpenSSL 1.1 path exists" {
$openSSLpath = brew --prefix openssl@1.1
$openSSLpath | Should -Exist
}
}
- Context "OpenSSL 1.1 is default" {
+ Context "OpenSSL 1.1 is default" -Skip:($os.IsTahoe) {
It "Default OpenSSL version is 1.1" {
$commandResult = Get-CommandResult "openssl version"
$commandResult.Output | Should -Match "OpenSSL 1.1"
}
}
+
+ Context "OpenSSL 3 Path Check" -Skip:(-not $os.IsTahoe) {
+ It "OpenSSL 3 path exists" {
+ $openSSLpath = brew --prefix openssl@3
+ $openSSLpath | Should -Exist
+ }
+ }
+
+ Context "OpenSSL 3 is default" -Skip:(-not $os.IsTahoe) {
+ It "Default OpenSSL version is 3" {
+ $commandResult = Get-CommandResult "openssl version"
+ $commandResult.Output | Should -Match "OpenSSL 3"
+ }
+ }
}
diff --git a/images/macos/scripts/tests/PHP.Tests.ps1 b/images/macos/scripts/tests/PHP.Tests.ps1
index 2a4ff8774..2c6c1e34b 100644
--- a/images/macos/scripts/tests/PHP.Tests.ps1
+++ b/images/macos/scripts/tests/PHP.Tests.ps1
@@ -3,7 +3,7 @@ Import-Module "$PSScriptRoot/../helpers/Common.Helpers.psm1"
$os = Get-OSVersion
Describe "PHP" {
- Context "PHP" -Skip:($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoiaArm64) {
+ Context "PHP" -Skip:($os.IsArm64) {
It "PHP Path" {
Get-ToolPath "php" | Should -Not -BeLike "/usr/bin/php*"
}
@@ -14,7 +14,7 @@ Describe "PHP" {
}
}
- Context "Composer" -Skip:($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoiaArm64) {
+ Context "Composer" -Skip:($os.IsArm64) {
It "Composer" {
"composer --version" | Should -ReturnZeroExitCode
}
diff --git a/images/macos/scripts/tests/Python.Tests.ps1 b/images/macos/scripts/tests/Python.Tests.ps1
index 079f76ba3..7b6a8c53a 100644
--- a/images/macos/scripts/tests/Python.Tests.ps1
+++ b/images/macos/scripts/tests/Python.Tests.ps1
@@ -8,7 +8,7 @@ Describe "Python3" {
"python3 --version" | Should -ReturnZeroExitCode
}
- if ($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoiaArm64) {
+ if ($os.IsArm64) {
It "Python 3 is installed under /opt/homebrew/bin/" {
Get-ToolPath "python3" | Should -BeLike "/opt/homebrew/bin/*"
}
@@ -33,18 +33,3 @@ Describe "Python3" {
}
}
-
-Describe "Python2" -Skip:($os.IsVentura -or $os.IsSonoma -or $os.IsSequoia) {
- It "Python 2 is available" {
- "/Library/Frameworks/Python.framework/Versions/2.7/bin/python --version" | Should -ReturnZeroExitCode
- }
-
- It "Pip 2 is available" {
- "/Library/Frameworks/Python.framework/Versions/2.7/bin/pip --version" | Should -ReturnZeroExitCode
- }
-
- It "2to3 symlink does not point to Python 2" {
- $2to3path = (Get-ChildItem (Get-Command 2to3).Path).Target
- $2to3path | Should -Not -BeLike '/Frameworks/Python.framework/Versions/2.*'
- }
-}
diff --git a/images/macos/scripts/tests/RubyGem.Tests.ps1 b/images/macos/scripts/tests/RubyGem.Tests.ps1
index 13a3a6f2c..c05c6a444 100644
--- a/images/macos/scripts/tests/RubyGem.Tests.ps1
+++ b/images/macos/scripts/tests/RubyGem.Tests.ps1
@@ -25,15 +25,3 @@ Describe "Fastlane" {
"fastlane --version" | Should -ReturnZeroExitCode
}
}
-
-Describe "xcpretty" -Skip:($os.IsVentura -or $os.IsSonoma -or $os.IsSequoia) {
- It "xcpretty" {
- "xcpretty --version" | Should -ReturnZeroExitCode
- }
-}
-
-Describe "jazzy" -Skip:($os.IsVentura -or $os.IsSonoma -or $os.IsSequoia) {
- It "jazzy" {
- "jazzy --version" | Should -ReturnZeroExitCode
- }
-}
diff --git a/images/macos/scripts/tests/Rust.Tests.ps1 b/images/macos/scripts/tests/Rust.Tests.ps1
index 34eab1220..df68ab143 100644
--- a/images/macos/scripts/tests/Rust.Tests.ps1
+++ b/images/macos/scripts/tests/Rust.Tests.ps1
@@ -18,21 +18,4 @@ Describe "Rust" {
"cargo --version" | Should -ReturnZeroExitCode
}
}
- Context "Cargo dependencies" -Skip:($os.IsVentura -or $os.IsSonoma -or $os.IsSequoia) {
- It "bindgen" {
- "bindgen --version" | Should -ReturnZeroExitCode
- }
-
- It "cbindgen" {
- "cbindgen --version" | Should -ReturnZeroExitCode
- }
-
- It "Cargo audit" {
- "cargo audit --version" | Should -ReturnZeroExitCode
- }
-
- It "Cargo outdated" {
- "cargo outdated --version" | Should -ReturnZeroExitCode
- }
- }
}
diff --git a/images/macos/scripts/tests/System.Tests.ps1 b/images/macos/scripts/tests/System.Tests.ps1
index 767f9d88a..8f2650519 100644
--- a/images/macos/scripts/tests/System.Tests.ps1
+++ b/images/macos/scripts/tests/System.Tests.ps1
@@ -3,17 +3,16 @@ Import-Module "$PSScriptRoot/../helpers/Common.Helpers.psm1"
$os = Get-OSVersion
Describe "Disk free space" {
- It "Image has more than 25GB free space" {
- # we should have at least 25 GB of free space on macOS images
+ It "Image has more than 30GB free space" {
+ # we should have at least 30 GB of free space on macOS images
# 10GB here: https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops#capabilities-and-limitations
# 14GB here: https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#standard-github-hosted-runners-for-public-repositories
# 30GB due to: https://github.com/actions/runner-images/issues/10511
- # 25GB is the current minimum due to the size of Xcode 16.4 and it's dependencies
$diskInfo = Get-PSDrive "/"
$totalSpaceGB = [math]::Floor(($diskInfo.Used + $diskInfo.Free) / 1GB)
$freeSpaceGB = [math]::Floor($diskInfo.Free / 1GB)
Write-Host " [i] Disk size: ${totalSpaceGB} GB; Free space: ${freeSpaceGB} GB"
- $freeSpaceGB | Should -BeGreaterOrEqual 25
+ $freeSpaceGB | Should -BeGreaterOrEqual 30
}
}
@@ -31,16 +30,6 @@ Describe "Certificate" {
}
}
-Describe "Audio device" -Skip:($os.IsVentura -or $os.IsSonoma -or $os.IsSequoia) {
- It "Sox is installed" {
- "sox --version" | Should -ReturnZeroExitCode
- }
-
- It "SwitchAudioSource is installed" {
- "SwitchAudioSource -c" | Should -ReturnZeroExitCode
- }
-}
-
Describe "AutomationModeTool" {
It "Does not require user authentication" {
automationmodetool | Out-String | Should -Match "DOES NOT REQUIRE"
diff --git a/images/macos/scripts/tests/Toolcache.Tests.ps1 b/images/macos/scripts/tests/Toolcache.Tests.ps1
index 6a07313b6..31131df0d 100644
--- a/images/macos/scripts/tests/Toolcache.Tests.ps1
+++ b/images/macos/scripts/tests/Toolcache.Tests.ps1
@@ -57,7 +57,7 @@ Describe "Toolcache" {
}
}
- Context "Ruby" -Skip:($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoiaArm64) {
+ Context "Ruby" -Skip:($os.IsArm64) {
$rubyDirectory = Join-Path $toolcacheDirectory "Ruby"
$rubyPackage = $packages | Where-Object { $_.ToolName -eq "Ruby" } | Select-Object -First 1
$testCase = @{ RubyDirectory = $rubyDirectory }
@@ -99,7 +99,7 @@ Describe "Toolcache" {
}
}
}
- Context "PyPy" -Skip:($os.IsVenturaArm64 -or $os.IsSonoma -or $os.IsSequoia) {
+ Context "PyPy" -Skip:(-not $os.IsVenturaX64) {
$pypyDirectory = Join-Path $toolcacheDirectory "PyPy"
$pypyPackage = $packages | Where-Object { $_.ToolName -eq "pypy" } | Select-Object -First 1
$testCase = @{ PypyDirectory = $pypyDirectory }
diff --git a/images/macos/templates/macOS-26.arm64.anka.pkr.hcl b/images/macos/templates/macOS-26.arm64.anka.pkr.hcl
new file mode 100644
index 000000000..6439d235c
--- /dev/null
+++ b/images/macos/templates/macOS-26.arm64.anka.pkr.hcl
@@ -0,0 +1,292 @@
+packer {
+ required_plugins {
+ veertu-anka = {
+ version = ">= v3.2.0"
+ source = "github.com/veertuinc/veertu-anka"
+ }
+ }
+}
+
+locals {
+ image_folder = "/Users/${var.vm_username}/image-generation"
+}
+
+variable "builder_type" {
+ type = string
+ default = "veertu-anka-vm-clone"
+ validation {
+ condition = contains(["veertu-anka-vm-clone", "null"], var.builder_type)
+ error_message = "The builder_type value must be one of [veertu-anka-vm-clone, null]."
+ }
+}
+
+variable "source_vm_name" {
+ type = string
+}
+
+variable "source_vm_port" {
+ type = number
+ default = 22
+}
+
+variable "source_vm_tag" {
+ type = string
+ default = ""
+}
+
+variable "socks_proxy" {
+ type = string
+ default = ""
+}
+
+variable "build_id" {
+ type = string
+}
+
+variable "vm_username" {
+ type = string
+ sensitive = true
+}
+
+variable "vm_password" {
+ type = string
+ sensitive = true
+}
+
+variable "github_api_pat" {
+ type = string
+ sensitive = true
+ default = ""
+}
+
+variable "xcode_install_storage_url" {
+ type = string
+ sensitive = true
+}
+
+variable "xcode_install_sas" {
+ type = string
+ sensitive = true
+}
+
+variable "vcpu_count" {
+ type = string
+ default = "6"
+}
+
+variable "ram_size" {
+ type = string
+ default = "8G"
+}
+
+variable "image_os" {
+ type = string
+ default = "macos26"
+}
+
+source "veertu-anka-vm-clone" "template" {
+ vm_name = "${var.build_id}"
+ source_vm_name = "${var.source_vm_name}"
+ source_vm_tag = "${var.source_vm_tag}"
+ vcpu_count = "${var.vcpu_count}"
+ ram_size = "${var.ram_size}"
+ stop_vm = "true"
+ log_level = "debug"
+}
+
+source "null" "template" {
+ ssh_host = "${var.source_vm_name}"
+ ssh_port = "${var.source_vm_port}"
+ ssh_username = "${var.vm_username}"
+ ssh_password = "${var.vm_password}"
+ ssh_proxy_host = "${var.socks_proxy}"
+}
+
+build {
+ sources = ["source.${var.builder_type}.template"]
+
+ provisioner "shell" {
+ inline = ["mkdir ${local.image_folder}"]
+ }
+
+ provisioner "file" {
+ destination = "${local.image_folder}/"
+ sources = [
+ "${path.root}/../scripts/tests",
+ "${path.root}/../scripts/docs-gen",
+ "${path.root}/../scripts/helpers"
+ ]
+ }
+
+ provisioner "file" {
+ destination = "${local.image_folder}/docs-gen/"
+ source = "${path.root}/../../../helpers/software-report-base"
+ }
+
+ provisioner "file" {
+ destination = "${local.image_folder}/add-certificate.swift"
+ source = "${path.root}/../assets/add-certificate.swift"
+ }
+
+ provisioner "file" {
+ destination = ".bashrc"
+ source = "${path.root}/../assets/bashrc"
+ }
+
+ provisioner "file" {
+ destination = ".bash_profile"
+ source = "${path.root}/../assets/bashprofile"
+ }
+
+ provisioner "shell" {
+ inline = ["mkdir ~/bootstrap"]
+ }
+
+ provisioner "file" {
+ destination = "bootstrap"
+ source = "${path.root}/../assets/bootstrap-provisioner/"
+ }
+
+ provisioner "file" {
+ destination = "${local.image_folder}/toolset.json"
+ source = "${path.root}/../toolsets/toolset-26.json"
+ }
+
+ provisioner "shell" {
+ execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
+ inline = [
+ "mv ${local.image_folder}/docs-gen ${local.image_folder}/software-report",
+ "mkdir ~/utils",
+ "mv ${local.image_folder}/helpers/invoke-tests.sh ~/utils",
+ "mv ${local.image_folder}/helpers/utils.sh ~/utils"
+ ]
+ }
+
+ provisioner "shell" {
+ execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} {{ .Path }}"
+ scripts = [
+ "${path.root}/../scripts/build/install-xcode-clt.sh",
+ "${path.root}/../scripts/build/install-homebrew.sh",
+ "${path.root}/../scripts/build/install-rosetta.sh"
+ ]
+ }
+
+ provisioner "shell" {
+ environment_vars = ["PASSWORD=${var.vm_password}", "USERNAME=${var.vm_username}"]
+ execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; sudo {{ .Vars }} {{ .Path }}"
+ scripts = [
+ "${path.root}/../scripts/build/configure-tccdb-macos.sh",
+ "${path.root}/../scripts/build/configure-autologin.sh",
+ "${path.root}/../scripts/build/configure-auto-updates.sh",
+ "${path.root}/../scripts/build/configure-ntpconf.sh",
+ "${path.root}/../scripts/build/configure-shell.sh"
+ ]
+ }
+
+ provisioner "shell" {
+ environment_vars = ["IMAGE_VERSION=${var.build_id}", "IMAGE_OS=${var.image_os}", "PASSWORD=${var.vm_password}"]
+ execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} {{ .Path }}"
+ scripts = [
+ "${path.root}/../scripts/build/configure-preimagedata.sh",
+ "${path.root}/../scripts/build/configure-ssh.sh",
+ "${path.root}/../scripts/build/configure-machine.sh"
+ ]
+ }
+
+ provisioner "shell" {
+ execute_command = "source $HOME/.bash_profile; sudo {{ .Vars }} {{ .Path }}"
+ expect_disconnect = true
+ inline = ["echo 'Reboot VM'", "shutdown -r now"]
+ }
+
+ provisioner "shell" {
+ environment_vars = ["API_PAT=${var.github_api_pat}", "USER_PASSWORD=${var.vm_password}", "IMAGE_FOLDER=${local.image_folder}"]
+ execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} {{ .Path }}"
+ pause_before = "30s"
+ scripts = [
+ "${path.root}/../scripts/build/configure-windows.sh",
+ "${path.root}/../scripts/build/install-powershell.sh",
+ "${path.root}/../scripts/build/install-dotnet.sh",
+ "${path.root}/../scripts/build/install-python.sh",
+ "${path.root}/../scripts/build/install-azcopy.sh",
+ "${path.root}/../scripts/build/install-ruby.sh",
+ "${path.root}/../scripts/build/install-rubygems.sh",
+ "${path.root}/../scripts/build/install-git.sh",
+ "${path.root}/../scripts/build/install-node.sh",
+ "${path.root}/../scripts/build/install-common-utils.sh"
+ ]
+ }
+
+ provisioner "shell" {
+ environment_vars = ["XCODE_INSTALL_STORAGE_URL=${var.xcode_install_storage_url}", "XCODE_INSTALL_SAS=${var.xcode_install_sas}", "IMAGE_FOLDER=${local.image_folder}"]
+ execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} pwsh -f {{ .Path }}"
+ script = "${path.root}/../scripts/build/Install-Xcode.ps1"
+ }
+
+ provisioner "shell" {
+ execute_command = "source $HOME/.bash_profile; sudo {{ .Vars }} {{ .Path }}"
+ expect_disconnect = true
+ inline = ["echo 'Reboot VM'", "shutdown -r now"]
+ }
+
+ provisioner "shell" {
+ environment_vars = ["API_PAT=${var.github_api_pat}", "IMAGE_FOLDER=${local.image_folder}"]
+ execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} {{ .Path }}"
+ scripts = [
+ "${path.root}/../scripts/build/install-actions-cache.sh",
+ "${path.root}/../scripts/build/install-runner-package.sh",
+ "${path.root}/../scripts/build/install-llvm.sh",
+ "${path.root}/../scripts/build/install-openjdk.sh",
+ "${path.root}/../scripts/build/install-aws-tools.sh",
+ "${path.root}/../scripts/build/install-rust.sh",
+ "${path.root}/../scripts/build/install-gcc.sh",
+ "${path.root}/../scripts/build/install-cocoapods.sh",
+ "${path.root}/../scripts/build/install-android-sdk.sh",
+ "${path.root}/../scripts/build/install-vcpkg.sh",
+ "${path.root}/../scripts/build/install-safari.sh",
+ "${path.root}/../scripts/build/install-chrome.sh",
+ "${path.root}/../scripts/build/install-firefox.sh",
+ "${path.root}/../scripts/build/install-bicep.sh",
+ "${path.root}/../scripts/build/install-codeql-bundle.sh",
+ "${path.root}/../scripts/build/install-edge.sh"
+ ]
+ }
+
+ provisioner "shell" {
+ environment_vars = ["IMAGE_FOLDER=${local.image_folder}"]
+ execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} pwsh -f {{ .Path }}"
+ scripts = [
+ "${path.root}/../scripts/build/Install-Toolset.ps1",
+ "${path.root}/../scripts/build/Configure-Toolset.ps1"
+ ]
+ }
+
+ provisioner "shell" {
+ environment_vars = ["IMAGE_FOLDER=${local.image_folder}"]
+ execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} pwsh -f {{ .Path }}"
+ script = "${path.root}/../scripts/build/Configure-Xcode-Simulators.ps1"
+ }
+
+ provisioner "shell" {
+ environment_vars = ["IMAGE_FOLDER=${local.image_folder}"]
+ execute_command = "source $HOME/.bash_profile; {{ .Vars }} {{ .Path }}"
+ inline = [
+ "pwsh -File \"${local.image_folder}/software-report/Generate-SoftwareReport.ps1\" -OutputDirectory \"${local.image_folder}/output/software-report\" -ImageName ${var.build_id}",
+ "pwsh -File \"${local.image_folder}/tests/RunAll-Tests.ps1\""
+ ]
+ }
+
+ provisioner "file" {
+ destination = "${path.root}/../../image-output/"
+ direction = "download"
+ source = "${local.image_folder}/output/"
+ }
+
+ provisioner "shell" {
+ execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} {{ .Path }}"
+ scripts = [
+ "${path.root}/../scripts/build/configure-hostname.sh",
+ "${path.root}/../scripts/build/configure-system.sh"
+ ]
+ }
+}
diff --git a/images/macos/toolsets/toolset-26.json b/images/macos/toolsets/toolset-26.json
new file mode 100644
index 000000000..7a0c68029
--- /dev/null
+++ b/images/macos/toolsets/toolset-26.json
@@ -0,0 +1,191 @@
+{
+ "xcode": {
+ "default": "26_Release_Candidate",
+ "arm64":{
+ "versions": [
+ {
+ "link": "26_Release_Candidate",
+ "filename": "26_Release_Candidate_Universal",
+ "version": "26_Release_Candidate+17A321",
+ "symlinks": ["26.0"],
+ "sha256": "d56b62964b21c25901e5e48db22ff40862ff490fd3f955704ecd53ca9076db4e",
+ "install_runtimes": "default"
+ },
+ {
+ "link": "16.4",
+ "filename": "16.4",
+ "version": "16.4.0+16F6",
+ "sha256": "2dbf65ba28fb85b34e72c14c529a42d5c3189ab0f11fb29fdebd5f4ee6c87900",
+ "install_runtimes": [
+ { "iOS": ["18.5", "18.6"] },
+ { "watchOS": ["11.5"] },
+ { "tvOS": ["18.5"] },
+ { "visionOS": ["2.5"] }
+ ]
+ }
+ ]
+ }
+ },
+ "java": {
+ "x64": {
+ "default": "21",
+ "versions": [ "11", "17", "21"]
+ },
+ "arm64": {
+ "default": "21",
+ "versions": [ "11", "17", "21"]
+ }
+ },
+ "android": {
+ "cmdline-tools": "commandlinetools-mac-12266719_latest.zip",
+ "sdk-tools": "sdk-tools-darwin-4333796.zip",
+ "platform_min_version": "35",
+ "build_tools_min_version": "35.0.0",
+ "extras": [
+ "android;m2repository", "google;m2repository", "google;google_play_services"
+ ],
+ "addons": [],
+ "additional_tools": [
+ "cmake;3.31.5"
+ ],
+ "ndk": {
+ "default": "27",
+ "versions": [
+ "27","28"
+ ]
+ }
+ },
+ "powershellModules": [
+ {
+ "name": "Az",
+ "versions": [
+ "14.3.0"
+ ]
+ },
+ { "name": "Pester" },
+ { "name": "PSScriptAnalyzer" }
+ ],
+ "brew": {
+ "common_packages": [
+ "ant",
+ "aria2",
+ "azure-cli",
+ "bazelisk",
+ "carthage",
+ "cmake",
+ "gh",
+ "gnupg",
+ "gnu-tar",
+ "kotlin",
+ "libpq",
+ "libsodium",
+ "openssl",
+ "p7zip",
+ "packer",
+ "perl",
+ "pkgconf",
+ "swiftformat",
+ "zstd",
+ "ninja",
+ "gmp",
+ "yq",
+ "unxip",
+ "xcbeautify",
+ "xcodes"
+ ],
+ "cask_packages": [
+ "parallels"
+ ]
+ },
+ "gcc": {
+ "versions": [
+ "13",
+ "14",
+ "15"
+ ]
+ },
+ "dotnet": {
+ "arch":{
+ "arm64": {
+ "versions": [
+ "8.0",
+ "9.0"
+ ]
+ }
+ }
+ },
+ "ruby": {
+ "default": "3.4",
+ "rubygems": [
+ "cocoapods",
+ "bundler",
+ "fastlane"
+ ]
+ },
+ "toolcache": [
+ {
+ "name": "Python",
+ "url" : "https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json",
+ "platform" : "darwin",
+ "arch": {
+ "arm64": {
+ "versions": [
+ "3.11.*",
+ "3.12.*",
+ "3.13.*"
+ ]
+ }
+ }
+ },
+ {
+ "name": "Node",
+ "url" : "https://raw.githubusercontent.com/actions/node-versions/main/versions-manifest.json",
+ "platform" : "darwin",
+ "arch": {
+ "arm64": {
+ "versions": [
+ "20.*",
+ "22.*",
+ "24.*"
+ ]
+ }
+ }
+ },
+ {
+ "name": "Go",
+ "url" : "https://raw.githubusercontent.com/actions/go-versions/main/versions-manifest.json",
+ "platform" : "darwin",
+ "arch": {
+ "arm64": {
+ "variable_template" : "GOROOT_{0}_{1}_ARM64",
+ "versions": [
+ "1.23.*",
+ "1.24.*",
+ "1.25.*"
+ ]
+ }
+ }
+ },
+ {
+ "name": "Ruby",
+ "arch": {
+ "arm64": {
+ "versions": [
+ "3.2.*",
+ "3.3.*",
+ "3.4.*"
+ ]
+ }
+ }
+ }
+ ],
+ "node": {
+ "default": "24"
+ },
+ "llvm": {
+ "version": "20"
+ },
+ "pwsh": {
+ "version": "7.4"
+ }
+}