[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props - #11956

Merged
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side
Jul 2, 2026
Merged

[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props#11956
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side

Conversation

@jonathanpeppers

@jonathanpeppersjonathanpeppers commented Jul 2, 2026

Copy link
Copy Markdown
Member

Summary

JDK-related properties are now sourced from Java.Interop's JdkInfo MSBuild task (in-tree since #11744) plus Configuration.props. The Configuration.OperatingSystem.props generator in xaprepare no longer writes any JDK values — only the NDK/OS-info half remains, which will be removed in a follow-up slice.

Changes

  • Configuration.props
    • Imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props immediately after Configuration.OperatingSystem.props. Java.Interop supplies JavaSdkDirectory, JavaPath, JavaCPath, JarPath (plus additional JDK metadata) once Prepare has run.
    • Sets JavaSdkVersion (= $(MicrosoftOpenJDKVersion)) and MinimumSupportedJavaSdkVersion (= 17.0) directly, since JdkInfo.props does not emit those two policy constants.
    • Adds conditional JavaPath, JavaCPath, JarPath fallbacks derived from $(JavaSdkDirectory)\bin\{tool}{.exe on Windows} — mirroring what xaprepare's OS.cs computed pre-slice. This ensures those properties are always defined for consumers that read them directly (e.g. src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets, src/java-runtime/java-runtime.targets, build-tools/create-android-api/create-android-api.csproj) even before PrepareJavaInterop has generated JdkInfo.props. When JdkInfo.props is imported, its conditional values win.
  • build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in — removes JavaSdkVersion, MinimumSupportedJavaSdkVersion, JavaSdkDirectory, JavaCPath, JarPath, JavaPath.
  • build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs — removes the six matching entries from the replacements dictionary.
  • build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs — deletes now-dead MicrosoftOpenJDKVersion (const string + Version field) and MicrosoftMinOpenJDKVersion. Grep confirms zero remaining consumers under build-tools/xaprepare.

OS.JavaHome/JavaCPath/JavaPath/JarPath are intentionally left in place — Windows.cs still uses JavaHome for the JAVA_HOME env var. Removing those OS discovery paths is deferred to the next slice.

Verification

xaprepare build: dotnet build build-tools\xaprepare\xaprepare\xaprepare.csproj -c Debug → 0 warnings, 0 errors.

Effective-value verification — three states via a probe project that imports Configuration.props with AndroidToolchainDirectory=C:\android-toolchain:

Pre-slice equivalent (simulated Configuration.OperatingSystem.props present, no JdkInfo.props):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\jdk-21
JavaCPath=C:\jdk-21\bin\javac.exe
JarPath=C:\jdk-21\bin\jar.exe
JavaPath=C:\jdk-21\bin\java.exe

Post-slice, fresh clone (no Configuration.OperatingSystem.props, no JdkInfo.props — fallbacks fire):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\android-toolchain\jdk-21
JavaCPath=C:\android-toolchain\jdk-21\bin\javac.exe
JarPath=C:\android-toolchain\jdk-21\bin\jar.exe
JavaPath=C:\android-toolchain\jdk-21\bin\java.exe

Post-slice, post-Prepare (with JdkInfo.props supplying real paths):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=D:\real-jdk\jdk-21
JavaCPath=D:\real-jdk\jdk-21\bin\javac.exe
JarPath=D:\real-jdk\jdk-21\bin\jar.exe
JavaPath=D:\real-jdk\jdk-21\bin\java.exe

Grep audit under build-tools/xaprepare/: zero references to @JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @javac@, @java@, @jar@, MicrosoftOpenJDKVersion, or MicrosoftMinOpenJDKVersion remain. @JavaSdkDirectory@ still appears in xaprepare.targets / Properties.Defaults.cs.in — that's the unrelated compile-time replacement in Properties.Defaults.cs, intentionally left alone.

Cold -t:Prepare was not run in this environment (no Android toolchain / network); the fallback logic above ensures behavior is well-defined in every state along the Prepare pipeline.

File list

File+/-
Configuration.props+10
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs−5
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in−6
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs−6

Net: +10 / −17 (−7 LOC).

Precedent

Continues the incremental xaprepare removal in #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946.

…kInfo.props
The last remaining xaprepare generator (Step_GenerateFiles.Get_Configuration_OperatingSystem_props)
substituted six JDK-related placeholders. Since Java.Interop is now in-tree (#11744), its JdkInfo
MSBuild task can supply those values directly.
* Configuration.props now imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props
after Configuration.OperatingSystem.props, so downstream projects pick up JavaSdkDirectory,
JavaPath, JavaCPath, and JarPath from Java.Interop.
* JavaSdkVersion and MinimumSupportedJavaSdkVersion (which JdkInfo.props does not provide) are
set directly in Configuration.props alongside the existing MicrosoftOpenJDKVersion property.
* The six JDK placeholders (@JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @JavaSdkDirectory@,
@javac@, @java@, @jar@) are removed from Configuration.OperatingSystem.props.in and from the
Step_GenerateFiles replacements dictionary.
* The now-dead Configurables.MicrosoftOpenJDKVersion (const + Version) and
MicrosoftMinOpenJDKVersion fields are removed. Grep confirmed zero remaining consumers under
build-tools/xaprepare after removing Step_GenerateFiles references.
The NDK/OS-info half of the generator (HostOsName, HostOsFlavor, HostOsRelease, HostCpuCount,
HostBits, NdkLlvmTag) is intentionally left in place for a follow-up slice.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 2, 2026 13:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Moves JDK-related MSBuild properties out of xaprepare’s generated Configuration.OperatingSystem.props and into the Java.Interop-generated JdkInfo.props, reducing xaprepare’s responsibility to OS/NDK-related values while keeping the overall Configuration.props import chain intact.

Changes:

  • Import external/Java.Interop/bin/Build$(Configuration)/JdkInfo.props from Configuration.props (when present) and define JDK policy constants (JavaSdkVersion, MinimumSupportedJavaSdkVersion) directly in Configuration.props.
  • Remove JDK placeholders and replacements from the xaprepare Configuration.OperatingSystem.props template and generator.
  • Delete now-dead Microsoft OpenJDK version constants from xaprepare configurables.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

FileDescription
Configuration.propsImports Java.Interop-generated JdkInfo.props and defines JavaSdkVersion / minimum supported JDK policy.
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.csStops emitting JDK-related placeholder replacements for the OS props generator.
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.inRemoves JDK-related properties from the generated OS props template.
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.csRemoves unused JDK version/minimum constants from xaprepare defaults.

Comment threadConfiguration.props
Rubberduck review flagged that removing the six JDK properties from
Configuration.OperatingSystem.props leaves JavaPath, JavaCPath, and JarPath
undefined for consumers that read them directly (e.g.
src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets,
src/java-runtime/java-runtime.targets) between the time xaprepare runs and
when PrepareJavaInterop generates JdkInfo.props, or in downstream builds that
skip full Prepare. Pre-slice xaprepare's OS.cs computed these as
$(JavaSdkDirectory)\bin\{tool}{.exe on Windows}; mirror that logic in
Configuration.props so the properties are always defined. JdkInfo.props still
supplies its own conditional values that win when it's imported.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@jonathanpeppers
jonathanpeppers merged commit 5734d0d into mainJul 2, 2026
42 checks passed
@jonathanpeppers
jonathanpeppers deleted the jonathanpeppers-xaprepare-d1-jdk-side branch July 2, 2026 15:44
simonrozsival pushed a commit that referenced this pull request Jul 3, 2026
…xaprepare project (#11959)
Follow-up to #11956, which moved the JDK half of `Configuration.OperatingSystem.props` to Java.Interop's `JdkInfo.props`. The remaining NDK / OS-info half has zero real consumers, so this PR:
1. Deletes the last generator template (`Configuration.OperatingSystem.props.in`).
2. Cascades through `Step_GenerateFiles`, both `Scenario_*` classes (which now had zero steps), and every supporting `OperatingSystems/`, `Context.*OS.cs`, `EssentialTools.*`, `ToolRunners/*`, `Configurables.*`, `Application/*`, and `Main.cs` file that only existed to feed the scenarios.
3. Deletes the whole `build-tools/xaprepare/` project.
4. Patches every integration point (`Makefile`, `PrepareWindows.targets`, `BuildEverything.mk`, CI YAML, docs) so `build.cmd -t:Prepare` and `make prepare` still work end-to-end.
## `Configuration.OperatingSystem.props.in` placeholder audit
| Placeholder | Consumers outside the `.in` file | Action |
| --- | --- | --- |
| `HostOsName` | none | drop |
| `HostOsFlavor` | none | drop |
| `HostOsRelease` | none | drop |
| `HostBits` | none (`ArchiveBase.HostBits` in `src/Xamarin.Installer.AndroidSDK/` is an unrelated C# property) | drop |
| `NdkLlvmTag` | none (the NDK toolchain OS tag is resolved elsewhere via `_NdkToolchainOSTag` in `androidsdk.targets`) | drop |
| `HostCpuCount` | only `Configuration.props:72` via `$(MakeConcurrency)` | drop |
## `$(MakeConcurrency)` audit
The only definition was `Configuration.props:72`. A repo-wide grep of `.targets`, `.props`, `.projitems`, `Makefile`, and `.mk` files found zero consumers of the MSBuild property. The `MakeConcurrency` hits under `build-tools/xaprepare/` were an unrelated C# `Context.MakeConcurrency` property.
**Result:** dropped the `MakeConcurrency` MSBuild property entirely (no `$([System.Environment]::ProcessorCount)` replacement needed) and removed the `$(MakeConcurrency)` bullet in `Documentation/building/configuration.md`.
## xaprepare integration audit (grep-confirmed, patched here)
| Location | Change |
| --- | --- |
| `build-tools/xaprepare/` (entire tree) | **deleted** — 86 tracked files |
| `Configuration.props` | dropped `<Import>` of the generated OS props, dropped `MakeConcurrency`, tidied the "between xaprepare and package creation tools" comment |
| `.gitignore` | dropped `Configuration.OperatingSystem.props` |
| `build-tools/scripts/PrepareWindows.targets` | removed `_XAPrepareExe`, `_XAPrepareStandardArgs`, `_BuildXAPrepare` target, and the `Exec dotnet $(_XAPrepareExe)` line. Repointed `Prepare` at `_InstallDotNet`. Kept the space-in-path guard, BootstrapTasks / workloads MSBuilds, and `PrepareJavaInterop` |
| `Makefile` | dropped `PREPARE_PROJECT`, `PREPARE_NET_FX`, `PREPARE_ARGS`, `PREPARE_MSBUILD_FLAGS`, `PREPARE_SCENARIO`, `PREPARE_CI_PR`, `PREPARE_CI`, `_PREPARE_CI_MODE_*`, `_PREPARE_ARGS`, and all their conditionals. Dropped the `dotnet run --project xaprepare.csproj` line from `prepare`. Deleted the `prepare-help` target |
| `build-tools/scripts/BuildEverything.mk` | `jenkins` no longer branches on `PREPARE_CI_PR`/`PREPARE_CI`; just `$(MAKE) prepare && $(MAKE) leeroy` |
| `.github/workflows/copilot-setup-steps.yml` | dropped now-unused `PREPARE_CI=1` |
| `build-tools/automation/azure-pipelines-apidocs.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-linux-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-macos-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/commercial-build.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/copy-extra-result-files.yaml` | dropped `**/Configuration.OperatingSystem.props` glob and the stale `Step_CopyExtraResultFilesForCI` xaprepare-step comment |
| `build-tools/automation/yaml-templates/generate-cgmanifest.yaml` | dropped the stale `Step_GenerateCGManifest` xaprepare-step comment |
| `build-tools/automation/yaml-templates/setup-jdk-variables.yaml` | renamed `$xaPrepareJdkPath` → `$xaJdkPath` for hygiene |
| `Documentation/workflow/HowToAddNewApiLevel.md` | rewrote the "Add New Platform" section to point at `<_PlatformPackage>` entries in `src/androidsdk/androidsdk.targets` instead of `AndroidToolchain.cs`; updated the `--android-sdk-platforms=all` recipe to `dotnet-local build src/androidsdk/androidsdk.csproj -p:AndroidSdkPlatforms=all` |
| `Documentation/building/unix/dependencies.md` | JDK-version link now points at `$(MicrosoftOpenJDKVersion)` in `/Configuration.props` instead of the deleted `Configurables.cs` |
| `Documentation/building/configuration.md` | removed the `$(MakeConcurrency)` bullet |
**Historical breadcrumb comments left as-is** (still accurate and useful for git-archaeology):
- `.github/skills/update-tpn/SKILL.md`
- `src/AndroidBuildConfig/AndroidBuildConfig.csproj`
- `src/androidsdk/androidsdk.targets`
- `src/native/cmake-config/cmake-config.csproj`
- `src/workloads/workloads.csproj`
## Verification
- `build.cmd Prepare` — succeeded end-to-end on Windows (0 warnings, 0 errors). The trimmed `Prepare` target ran through `_InstallDotNet`, the space-in-path guard, `Xamarin.Android.BootstrapTasks.sln`, `src/workloads/workloads.csproj`, and `PrepareJavaInterop`.
- `dotnet build src\Xamarin.Android.Build.Tasks\Xamarin.Android.Build.Tasks.csproj -c Debug` — 0 errors (93 pre-existing warnings from `src/Mono.Android/` and generated MCW, unrelated to this change).
- Repo-wide grep for `HostOsName`, `HostOsFlavor`, `HostOsRelease`, `HostCpuCount`, `NdkLlvmTag`, and the MSBuild `MakeConcurrency` property — clean.
- Repo-wide grep for `xaprepare` — clean apart from the five intentional historical breadcrumb comments listed above.
## Diff stat
102 files changed, 25 insertions(+), 7891 deletions(-).
## Precedent chain
Continues the multi-slice teardown started by #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946, #11956.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jonathanpeppers@simonrozsival
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props - #11956

Merged
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side
Jul 2, 2026
Merged

[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props#11956
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side

Conversation

@jonathanpeppers

@jonathanpeppersjonathanpeppers commented Jul 2, 2026

Copy link
Copy Markdown
Member

Summary

JDK-related properties are now sourced from Java.Interop's JdkInfo MSBuild task (in-tree since #11744) plus Configuration.props. The Configuration.OperatingSystem.props generator in xaprepare no longer writes any JDK values — only the NDK/OS-info half remains, which will be removed in a follow-up slice.

Changes

  • Configuration.props
    • Imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props immediately after Configuration.OperatingSystem.props. Java.Interop supplies JavaSdkDirectory, JavaPath, JavaCPath, JarPath (plus additional JDK metadata) once Prepare has run.
    • Sets JavaSdkVersion (= $(MicrosoftOpenJDKVersion)) and MinimumSupportedJavaSdkVersion (= 17.0) directly, since JdkInfo.props does not emit those two policy constants.
    • Adds conditional JavaPath, JavaCPath, JarPath fallbacks derived from $(JavaSdkDirectory)\bin\{tool}{.exe on Windows} — mirroring what xaprepare's OS.cs computed pre-slice. This ensures those properties are always defined for consumers that read them directly (e.g. src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets, src/java-runtime/java-runtime.targets, build-tools/create-android-api/create-android-api.csproj) even before PrepareJavaInterop has generated JdkInfo.props. When JdkInfo.props is imported, its conditional values win.
  • build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in — removes JavaSdkVersion, MinimumSupportedJavaSdkVersion, JavaSdkDirectory, JavaCPath, JarPath, JavaPath.
  • build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs — removes the six matching entries from the replacements dictionary.
  • build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs — deletes now-dead MicrosoftOpenJDKVersion (const string + Version field) and MicrosoftMinOpenJDKVersion. Grep confirms zero remaining consumers under build-tools/xaprepare.

OS.JavaHome/JavaCPath/JavaPath/JarPath are intentionally left in place — Windows.cs still uses JavaHome for the JAVA_HOME env var. Removing those OS discovery paths is deferred to the next slice.

Verification

xaprepare build: dotnet build build-tools\xaprepare\xaprepare\xaprepare.csproj -c Debug → 0 warnings, 0 errors.

Effective-value verification — three states via a probe project that imports Configuration.props with AndroidToolchainDirectory=C:\android-toolchain:

Pre-slice equivalent (simulated Configuration.OperatingSystem.props present, no JdkInfo.props):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\jdk-21
JavaCPath=C:\jdk-21\bin\javac.exe
JarPath=C:\jdk-21\bin\jar.exe
JavaPath=C:\jdk-21\bin\java.exe

Post-slice, fresh clone (no Configuration.OperatingSystem.props, no JdkInfo.props — fallbacks fire):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\android-toolchain\jdk-21
JavaCPath=C:\android-toolchain\jdk-21\bin\javac.exe
JarPath=C:\android-toolchain\jdk-21\bin\jar.exe
JavaPath=C:\android-toolchain\jdk-21\bin\java.exe

Post-slice, post-Prepare (with JdkInfo.props supplying real paths):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=D:\real-jdk\jdk-21
JavaCPath=D:\real-jdk\jdk-21\bin\javac.exe
JarPath=D:\real-jdk\jdk-21\bin\jar.exe
JavaPath=D:\real-jdk\jdk-21\bin\java.exe

Grep audit under build-tools/xaprepare/: zero references to @JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @javac@, @java@, @jar@, MicrosoftOpenJDKVersion, or MicrosoftMinOpenJDKVersion remain. @JavaSdkDirectory@ still appears in xaprepare.targets / Properties.Defaults.cs.in — that's the unrelated compile-time replacement in Properties.Defaults.cs, intentionally left alone.

Cold -t:Prepare was not run in this environment (no Android toolchain / network); the fallback logic above ensures behavior is well-defined in every state along the Prepare pipeline.

File list

File+/-
Configuration.props+10
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs−5
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in−6
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs−6

Net: +10 / −17 (−7 LOC).

Precedent

Continues the incremental xaprepare removal in #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946.

…kInfo.props
The last remaining xaprepare generator (Step_GenerateFiles.Get_Configuration_OperatingSystem_props)
substituted six JDK-related placeholders. Since Java.Interop is now in-tree (#11744), its JdkInfo
MSBuild task can supply those values directly.
* Configuration.props now imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props
after Configuration.OperatingSystem.props, so downstream projects pick up JavaSdkDirectory,
JavaPath, JavaCPath, and JarPath from Java.Interop.
* JavaSdkVersion and MinimumSupportedJavaSdkVersion (which JdkInfo.props does not provide) are
set directly in Configuration.props alongside the existing MicrosoftOpenJDKVersion property.
* The six JDK placeholders (@JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @JavaSdkDirectory@,
@javac@, @java@, @jar@) are removed from Configuration.OperatingSystem.props.in and from the
Step_GenerateFiles replacements dictionary.
* The now-dead Configurables.MicrosoftOpenJDKVersion (const + Version) and
MicrosoftMinOpenJDKVersion fields are removed. Grep confirmed zero remaining consumers under
build-tools/xaprepare after removing Step_GenerateFiles references.
The NDK/OS-info half of the generator (HostOsName, HostOsFlavor, HostOsRelease, HostCpuCount,
HostBits, NdkLlvmTag) is intentionally left in place for a follow-up slice.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 2, 2026 13:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Moves JDK-related MSBuild properties out of xaprepare’s generated Configuration.OperatingSystem.props and into the Java.Interop-generated JdkInfo.props, reducing xaprepare’s responsibility to OS/NDK-related values while keeping the overall Configuration.props import chain intact.

Changes:

  • Import external/Java.Interop/bin/Build$(Configuration)/JdkInfo.props from Configuration.props (when present) and define JDK policy constants (JavaSdkVersion, MinimumSupportedJavaSdkVersion) directly in Configuration.props.
  • Remove JDK placeholders and replacements from the xaprepare Configuration.OperatingSystem.props template and generator.
  • Delete now-dead Microsoft OpenJDK version constants from xaprepare configurables.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

FileDescription
Configuration.propsImports Java.Interop-generated JdkInfo.props and defines JavaSdkVersion / minimum supported JDK policy.
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.csStops emitting JDK-related placeholder replacements for the OS props generator.
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.inRemoves JDK-related properties from the generated OS props template.
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.csRemoves unused JDK version/minimum constants from xaprepare defaults.

Comment threadConfiguration.props
Rubberduck review flagged that removing the six JDK properties from
Configuration.OperatingSystem.props leaves JavaPath, JavaCPath, and JarPath
undefined for consumers that read them directly (e.g.
src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets,
src/java-runtime/java-runtime.targets) between the time xaprepare runs and
when PrepareJavaInterop generates JdkInfo.props, or in downstream builds that
skip full Prepare. Pre-slice xaprepare's OS.cs computed these as
$(JavaSdkDirectory)\bin\{tool}{.exe on Windows}; mirror that logic in
Configuration.props so the properties are always defined. JdkInfo.props still
supplies its own conditional values that win when it's imported.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@jonathanpeppers
jonathanpeppers merged commit 5734d0d into mainJul 2, 2026
42 checks passed
@jonathanpeppers
jonathanpeppers deleted the jonathanpeppers-xaprepare-d1-jdk-side branch July 2, 2026 15:44
simonrozsival pushed a commit that referenced this pull request Jul 3, 2026
…xaprepare project (#11959)
Follow-up to #11956, which moved the JDK half of `Configuration.OperatingSystem.props` to Java.Interop's `JdkInfo.props`. The remaining NDK / OS-info half has zero real consumers, so this PR:
1. Deletes the last generator template (`Configuration.OperatingSystem.props.in`).
2. Cascades through `Step_GenerateFiles`, both `Scenario_*` classes (which now had zero steps), and every supporting `OperatingSystems/`, `Context.*OS.cs`, `EssentialTools.*`, `ToolRunners/*`, `Configurables.*`, `Application/*`, and `Main.cs` file that only existed to feed the scenarios.
3. Deletes the whole `build-tools/xaprepare/` project.
4. Patches every integration point (`Makefile`, `PrepareWindows.targets`, `BuildEverything.mk`, CI YAML, docs) so `build.cmd -t:Prepare` and `make prepare` still work end-to-end.
## `Configuration.OperatingSystem.props.in` placeholder audit
| Placeholder | Consumers outside the `.in` file | Action |
| --- | --- | --- |
| `HostOsName` | none | drop |
| `HostOsFlavor` | none | drop |
| `HostOsRelease` | none | drop |
| `HostBits` | none (`ArchiveBase.HostBits` in `src/Xamarin.Installer.AndroidSDK/` is an unrelated C# property) | drop |
| `NdkLlvmTag` | none (the NDK toolchain OS tag is resolved elsewhere via `_NdkToolchainOSTag` in `androidsdk.targets`) | drop |
| `HostCpuCount` | only `Configuration.props:72` via `$(MakeConcurrency)` | drop |
## `$(MakeConcurrency)` audit
The only definition was `Configuration.props:72`. A repo-wide grep of `.targets`, `.props`, `.projitems`, `Makefile`, and `.mk` files found zero consumers of the MSBuild property. The `MakeConcurrency` hits under `build-tools/xaprepare/` were an unrelated C# `Context.MakeConcurrency` property.
**Result:** dropped the `MakeConcurrency` MSBuild property entirely (no `$([System.Environment]::ProcessorCount)` replacement needed) and removed the `$(MakeConcurrency)` bullet in `Documentation/building/configuration.md`.
## xaprepare integration audit (grep-confirmed, patched here)
| Location | Change |
| --- | --- |
| `build-tools/xaprepare/` (entire tree) | **deleted** — 86 tracked files |
| `Configuration.props` | dropped `<Import>` of the generated OS props, dropped `MakeConcurrency`, tidied the "between xaprepare and package creation tools" comment |
| `.gitignore` | dropped `Configuration.OperatingSystem.props` |
| `build-tools/scripts/PrepareWindows.targets` | removed `_XAPrepareExe`, `_XAPrepareStandardArgs`, `_BuildXAPrepare` target, and the `Exec dotnet $(_XAPrepareExe)` line. Repointed `Prepare` at `_InstallDotNet`. Kept the space-in-path guard, BootstrapTasks / workloads MSBuilds, and `PrepareJavaInterop` |
| `Makefile` | dropped `PREPARE_PROJECT`, `PREPARE_NET_FX`, `PREPARE_ARGS`, `PREPARE_MSBUILD_FLAGS`, `PREPARE_SCENARIO`, `PREPARE_CI_PR`, `PREPARE_CI`, `_PREPARE_CI_MODE_*`, `_PREPARE_ARGS`, and all their conditionals. Dropped the `dotnet run --project xaprepare.csproj` line from `prepare`. Deleted the `prepare-help` target |
| `build-tools/scripts/BuildEverything.mk` | `jenkins` no longer branches on `PREPARE_CI_PR`/`PREPARE_CI`; just `$(MAKE) prepare && $(MAKE) leeroy` |
| `.github/workflows/copilot-setup-steps.yml` | dropped now-unused `PREPARE_CI=1` |
| `build-tools/automation/azure-pipelines-apidocs.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-linux-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-macos-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/commercial-build.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/copy-extra-result-files.yaml` | dropped `**/Configuration.OperatingSystem.props` glob and the stale `Step_CopyExtraResultFilesForCI` xaprepare-step comment |
| `build-tools/automation/yaml-templates/generate-cgmanifest.yaml` | dropped the stale `Step_GenerateCGManifest` xaprepare-step comment |
| `build-tools/automation/yaml-templates/setup-jdk-variables.yaml` | renamed `$xaPrepareJdkPath` → `$xaJdkPath` for hygiene |
| `Documentation/workflow/HowToAddNewApiLevel.md` | rewrote the "Add New Platform" section to point at `<_PlatformPackage>` entries in `src/androidsdk/androidsdk.targets` instead of `AndroidToolchain.cs`; updated the `--android-sdk-platforms=all` recipe to `dotnet-local build src/androidsdk/androidsdk.csproj -p:AndroidSdkPlatforms=all` |
| `Documentation/building/unix/dependencies.md` | JDK-version link now points at `$(MicrosoftOpenJDKVersion)` in `/Configuration.props` instead of the deleted `Configurables.cs` |
| `Documentation/building/configuration.md` | removed the `$(MakeConcurrency)` bullet |
**Historical breadcrumb comments left as-is** (still accurate and useful for git-archaeology):
- `.github/skills/update-tpn/SKILL.md`
- `src/AndroidBuildConfig/AndroidBuildConfig.csproj`
- `src/androidsdk/androidsdk.targets`
- `src/native/cmake-config/cmake-config.csproj`
- `src/workloads/workloads.csproj`
## Verification
- `build.cmd Prepare` — succeeded end-to-end on Windows (0 warnings, 0 errors). The trimmed `Prepare` target ran through `_InstallDotNet`, the space-in-path guard, `Xamarin.Android.BootstrapTasks.sln`, `src/workloads/workloads.csproj`, and `PrepareJavaInterop`.
- `dotnet build src\Xamarin.Android.Build.Tasks\Xamarin.Android.Build.Tasks.csproj -c Debug` — 0 errors (93 pre-existing warnings from `src/Mono.Android/` and generated MCW, unrelated to this change).
- Repo-wide grep for `HostOsName`, `HostOsFlavor`, `HostOsRelease`, `HostCpuCount`, `NdkLlvmTag`, and the MSBuild `MakeConcurrency` property — clean.
- Repo-wide grep for `xaprepare` — clean apart from the five intentional historical breadcrumb comments listed above.
## Diff stat
102 files changed, 25 insertions(+), 7891 deletions(-).
## Precedent chain
Continues the multi-slice teardown started by #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946, #11956.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jonathanpeppers@simonrozsival
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props - #11956

Merged
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side
Jul 2, 2026
Merged

[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props#11956
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side

Conversation

@jonathanpeppers

@jonathanpeppersjonathanpeppers commented Jul 2, 2026

Copy link
Copy Markdown
Member

Summary

JDK-related properties are now sourced from Java.Interop's JdkInfo MSBuild task (in-tree since #11744) plus Configuration.props. The Configuration.OperatingSystem.props generator in xaprepare no longer writes any JDK values — only the NDK/OS-info half remains, which will be removed in a follow-up slice.

Changes

  • Configuration.props
    • Imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props immediately after Configuration.OperatingSystem.props. Java.Interop supplies JavaSdkDirectory, JavaPath, JavaCPath, JarPath (plus additional JDK metadata) once Prepare has run.
    • Sets JavaSdkVersion (= $(MicrosoftOpenJDKVersion)) and MinimumSupportedJavaSdkVersion (= 17.0) directly, since JdkInfo.props does not emit those two policy constants.
    • Adds conditional JavaPath, JavaCPath, JarPath fallbacks derived from $(JavaSdkDirectory)\bin\{tool}{.exe on Windows} — mirroring what xaprepare's OS.cs computed pre-slice. This ensures those properties are always defined for consumers that read them directly (e.g. src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets, src/java-runtime/java-runtime.targets, build-tools/create-android-api/create-android-api.csproj) even before PrepareJavaInterop has generated JdkInfo.props. When JdkInfo.props is imported, its conditional values win.
  • build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in — removes JavaSdkVersion, MinimumSupportedJavaSdkVersion, JavaSdkDirectory, JavaCPath, JarPath, JavaPath.
  • build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs — removes the six matching entries from the replacements dictionary.
  • build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs — deletes now-dead MicrosoftOpenJDKVersion (const string + Version field) and MicrosoftMinOpenJDKVersion. Grep confirms zero remaining consumers under build-tools/xaprepare.

OS.JavaHome/JavaCPath/JavaPath/JarPath are intentionally left in place — Windows.cs still uses JavaHome for the JAVA_HOME env var. Removing those OS discovery paths is deferred to the next slice.

Verification

xaprepare build: dotnet build build-tools\xaprepare\xaprepare\xaprepare.csproj -c Debug → 0 warnings, 0 errors.

Effective-value verification — three states via a probe project that imports Configuration.props with AndroidToolchainDirectory=C:\android-toolchain:

Pre-slice equivalent (simulated Configuration.OperatingSystem.props present, no JdkInfo.props):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\jdk-21
JavaCPath=C:\jdk-21\bin\javac.exe
JarPath=C:\jdk-21\bin\jar.exe
JavaPath=C:\jdk-21\bin\java.exe

Post-slice, fresh clone (no Configuration.OperatingSystem.props, no JdkInfo.props — fallbacks fire):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\android-toolchain\jdk-21
JavaCPath=C:\android-toolchain\jdk-21\bin\javac.exe
JarPath=C:\android-toolchain\jdk-21\bin\jar.exe
JavaPath=C:\android-toolchain\jdk-21\bin\java.exe

Post-slice, post-Prepare (with JdkInfo.props supplying real paths):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=D:\real-jdk\jdk-21
JavaCPath=D:\real-jdk\jdk-21\bin\javac.exe
JarPath=D:\real-jdk\jdk-21\bin\jar.exe
JavaPath=D:\real-jdk\jdk-21\bin\java.exe

Grep audit under build-tools/xaprepare/: zero references to @JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @javac@, @java@, @jar@, MicrosoftOpenJDKVersion, or MicrosoftMinOpenJDKVersion remain. @JavaSdkDirectory@ still appears in xaprepare.targets / Properties.Defaults.cs.in — that's the unrelated compile-time replacement in Properties.Defaults.cs, intentionally left alone.

Cold -t:Prepare was not run in this environment (no Android toolchain / network); the fallback logic above ensures behavior is well-defined in every state along the Prepare pipeline.

File list

File+/-
Configuration.props+10
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs−5
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in−6
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs−6

Net: +10 / −17 (−7 LOC).

Precedent

Continues the incremental xaprepare removal in #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946.

…kInfo.props
The last remaining xaprepare generator (Step_GenerateFiles.Get_Configuration_OperatingSystem_props)
substituted six JDK-related placeholders. Since Java.Interop is now in-tree (#11744), its JdkInfo
MSBuild task can supply those values directly.
* Configuration.props now imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props
after Configuration.OperatingSystem.props, so downstream projects pick up JavaSdkDirectory,
JavaPath, JavaCPath, and JarPath from Java.Interop.
* JavaSdkVersion and MinimumSupportedJavaSdkVersion (which JdkInfo.props does not provide) are
set directly in Configuration.props alongside the existing MicrosoftOpenJDKVersion property.
* The six JDK placeholders (@JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @JavaSdkDirectory@,
@javac@, @java@, @jar@) are removed from Configuration.OperatingSystem.props.in and from the
Step_GenerateFiles replacements dictionary.
* The now-dead Configurables.MicrosoftOpenJDKVersion (const + Version) and
MicrosoftMinOpenJDKVersion fields are removed. Grep confirmed zero remaining consumers under
build-tools/xaprepare after removing Step_GenerateFiles references.
The NDK/OS-info half of the generator (HostOsName, HostOsFlavor, HostOsRelease, HostCpuCount,
HostBits, NdkLlvmTag) is intentionally left in place for a follow-up slice.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 2, 2026 13:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Moves JDK-related MSBuild properties out of xaprepare’s generated Configuration.OperatingSystem.props and into the Java.Interop-generated JdkInfo.props, reducing xaprepare’s responsibility to OS/NDK-related values while keeping the overall Configuration.props import chain intact.

Changes:

  • Import external/Java.Interop/bin/Build$(Configuration)/JdkInfo.props from Configuration.props (when present) and define JDK policy constants (JavaSdkVersion, MinimumSupportedJavaSdkVersion) directly in Configuration.props.
  • Remove JDK placeholders and replacements from the xaprepare Configuration.OperatingSystem.props template and generator.
  • Delete now-dead Microsoft OpenJDK version constants from xaprepare configurables.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

FileDescription
Configuration.propsImports Java.Interop-generated JdkInfo.props and defines JavaSdkVersion / minimum supported JDK policy.
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.csStops emitting JDK-related placeholder replacements for the OS props generator.
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.inRemoves JDK-related properties from the generated OS props template.
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.csRemoves unused JDK version/minimum constants from xaprepare defaults.

Comment threadConfiguration.props
Rubberduck review flagged that removing the six JDK properties from
Configuration.OperatingSystem.props leaves JavaPath, JavaCPath, and JarPath
undefined for consumers that read them directly (e.g.
src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets,
src/java-runtime/java-runtime.targets) between the time xaprepare runs and
when PrepareJavaInterop generates JdkInfo.props, or in downstream builds that
skip full Prepare. Pre-slice xaprepare's OS.cs computed these as
$(JavaSdkDirectory)\bin\{tool}{.exe on Windows}; mirror that logic in
Configuration.props so the properties are always defined. JdkInfo.props still
supplies its own conditional values that win when it's imported.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@jonathanpeppers
jonathanpeppers merged commit 5734d0d into mainJul 2, 2026
42 checks passed
@jonathanpeppers
jonathanpeppers deleted the jonathanpeppers-xaprepare-d1-jdk-side branch July 2, 2026 15:44
simonrozsival pushed a commit that referenced this pull request Jul 3, 2026
…xaprepare project (#11959)
Follow-up to #11956, which moved the JDK half of `Configuration.OperatingSystem.props` to Java.Interop's `JdkInfo.props`. The remaining NDK / OS-info half has zero real consumers, so this PR:
1. Deletes the last generator template (`Configuration.OperatingSystem.props.in`).
2. Cascades through `Step_GenerateFiles`, both `Scenario_*` classes (which now had zero steps), and every supporting `OperatingSystems/`, `Context.*OS.cs`, `EssentialTools.*`, `ToolRunners/*`, `Configurables.*`, `Application/*`, and `Main.cs` file that only existed to feed the scenarios.
3. Deletes the whole `build-tools/xaprepare/` project.
4. Patches every integration point (`Makefile`, `PrepareWindows.targets`, `BuildEverything.mk`, CI YAML, docs) so `build.cmd -t:Prepare` and `make prepare` still work end-to-end.
## `Configuration.OperatingSystem.props.in` placeholder audit
| Placeholder | Consumers outside the `.in` file | Action |
| --- | --- | --- |
| `HostOsName` | none | drop |
| `HostOsFlavor` | none | drop |
| `HostOsRelease` | none | drop |
| `HostBits` | none (`ArchiveBase.HostBits` in `src/Xamarin.Installer.AndroidSDK/` is an unrelated C# property) | drop |
| `NdkLlvmTag` | none (the NDK toolchain OS tag is resolved elsewhere via `_NdkToolchainOSTag` in `androidsdk.targets`) | drop |
| `HostCpuCount` | only `Configuration.props:72` via `$(MakeConcurrency)` | drop |
## `$(MakeConcurrency)` audit
The only definition was `Configuration.props:72`. A repo-wide grep of `.targets`, `.props`, `.projitems`, `Makefile`, and `.mk` files found zero consumers of the MSBuild property. The `MakeConcurrency` hits under `build-tools/xaprepare/` were an unrelated C# `Context.MakeConcurrency` property.
**Result:** dropped the `MakeConcurrency` MSBuild property entirely (no `$([System.Environment]::ProcessorCount)` replacement needed) and removed the `$(MakeConcurrency)` bullet in `Documentation/building/configuration.md`.
## xaprepare integration audit (grep-confirmed, patched here)
| Location | Change |
| --- | --- |
| `build-tools/xaprepare/` (entire tree) | **deleted** — 86 tracked files |
| `Configuration.props` | dropped `<Import>` of the generated OS props, dropped `MakeConcurrency`, tidied the "between xaprepare and package creation tools" comment |
| `.gitignore` | dropped `Configuration.OperatingSystem.props` |
| `build-tools/scripts/PrepareWindows.targets` | removed `_XAPrepareExe`, `_XAPrepareStandardArgs`, `_BuildXAPrepare` target, and the `Exec dotnet $(_XAPrepareExe)` line. Repointed `Prepare` at `_InstallDotNet`. Kept the space-in-path guard, BootstrapTasks / workloads MSBuilds, and `PrepareJavaInterop` |
| `Makefile` | dropped `PREPARE_PROJECT`, `PREPARE_NET_FX`, `PREPARE_ARGS`, `PREPARE_MSBUILD_FLAGS`, `PREPARE_SCENARIO`, `PREPARE_CI_PR`, `PREPARE_CI`, `_PREPARE_CI_MODE_*`, `_PREPARE_ARGS`, and all their conditionals. Dropped the `dotnet run --project xaprepare.csproj` line from `prepare`. Deleted the `prepare-help` target |
| `build-tools/scripts/BuildEverything.mk` | `jenkins` no longer branches on `PREPARE_CI_PR`/`PREPARE_CI`; just `$(MAKE) prepare && $(MAKE) leeroy` |
| `.github/workflows/copilot-setup-steps.yml` | dropped now-unused `PREPARE_CI=1` |
| `build-tools/automation/azure-pipelines-apidocs.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-linux-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-macos-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/commercial-build.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/copy-extra-result-files.yaml` | dropped `**/Configuration.OperatingSystem.props` glob and the stale `Step_CopyExtraResultFilesForCI` xaprepare-step comment |
| `build-tools/automation/yaml-templates/generate-cgmanifest.yaml` | dropped the stale `Step_GenerateCGManifest` xaprepare-step comment |
| `build-tools/automation/yaml-templates/setup-jdk-variables.yaml` | renamed `$xaPrepareJdkPath` → `$xaJdkPath` for hygiene |
| `Documentation/workflow/HowToAddNewApiLevel.md` | rewrote the "Add New Platform" section to point at `<_PlatformPackage>` entries in `src/androidsdk/androidsdk.targets` instead of `AndroidToolchain.cs`; updated the `--android-sdk-platforms=all` recipe to `dotnet-local build src/androidsdk/androidsdk.csproj -p:AndroidSdkPlatforms=all` |
| `Documentation/building/unix/dependencies.md` | JDK-version link now points at `$(MicrosoftOpenJDKVersion)` in `/Configuration.props` instead of the deleted `Configurables.cs` |
| `Documentation/building/configuration.md` | removed the `$(MakeConcurrency)` bullet |
**Historical breadcrumb comments left as-is** (still accurate and useful for git-archaeology):
- `.github/skills/update-tpn/SKILL.md`
- `src/AndroidBuildConfig/AndroidBuildConfig.csproj`
- `src/androidsdk/androidsdk.targets`
- `src/native/cmake-config/cmake-config.csproj`
- `src/workloads/workloads.csproj`
## Verification
- `build.cmd Prepare` — succeeded end-to-end on Windows (0 warnings, 0 errors). The trimmed `Prepare` target ran through `_InstallDotNet`, the space-in-path guard, `Xamarin.Android.BootstrapTasks.sln`, `src/workloads/workloads.csproj`, and `PrepareJavaInterop`.
- `dotnet build src\Xamarin.Android.Build.Tasks\Xamarin.Android.Build.Tasks.csproj -c Debug` — 0 errors (93 pre-existing warnings from `src/Mono.Android/` and generated MCW, unrelated to this change).
- Repo-wide grep for `HostOsName`, `HostOsFlavor`, `HostOsRelease`, `HostCpuCount`, `NdkLlvmTag`, and the MSBuild `MakeConcurrency` property — clean.
- Repo-wide grep for `xaprepare` — clean apart from the five intentional historical breadcrumb comments listed above.
## Diff stat
102 files changed, 25 insertions(+), 7891 deletions(-).
## Precedent chain
Continues the multi-slice teardown started by #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946, #11956.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jonathanpeppers@simonrozsival
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props - #11956

Merged
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side
Jul 2, 2026
Merged

[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props#11956
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side

Conversation

@jonathanpeppers

@jonathanpeppersjonathanpeppers commented Jul 2, 2026

Copy link
Copy Markdown
Member

Summary

JDK-related properties are now sourced from Java.Interop's JdkInfo MSBuild task (in-tree since #11744) plus Configuration.props. The Configuration.OperatingSystem.props generator in xaprepare no longer writes any JDK values — only the NDK/OS-info half remains, which will be removed in a follow-up slice.

Changes

  • Configuration.props
    • Imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props immediately after Configuration.OperatingSystem.props. Java.Interop supplies JavaSdkDirectory, JavaPath, JavaCPath, JarPath (plus additional JDK metadata) once Prepare has run.
    • Sets JavaSdkVersion (= $(MicrosoftOpenJDKVersion)) and MinimumSupportedJavaSdkVersion (= 17.0) directly, since JdkInfo.props does not emit those two policy constants.
    • Adds conditional JavaPath, JavaCPath, JarPath fallbacks derived from $(JavaSdkDirectory)\bin\{tool}{.exe on Windows} — mirroring what xaprepare's OS.cs computed pre-slice. This ensures those properties are always defined for consumers that read them directly (e.g. src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets, src/java-runtime/java-runtime.targets, build-tools/create-android-api/create-android-api.csproj) even before PrepareJavaInterop has generated JdkInfo.props. When JdkInfo.props is imported, its conditional values win.
  • build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in — removes JavaSdkVersion, MinimumSupportedJavaSdkVersion, JavaSdkDirectory, JavaCPath, JarPath, JavaPath.
  • build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs — removes the six matching entries from the replacements dictionary.
  • build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs — deletes now-dead MicrosoftOpenJDKVersion (const string + Version field) and MicrosoftMinOpenJDKVersion. Grep confirms zero remaining consumers under build-tools/xaprepare.

OS.JavaHome/JavaCPath/JavaPath/JarPath are intentionally left in place — Windows.cs still uses JavaHome for the JAVA_HOME env var. Removing those OS discovery paths is deferred to the next slice.

Verification

xaprepare build: dotnet build build-tools\xaprepare\xaprepare\xaprepare.csproj -c Debug → 0 warnings, 0 errors.

Effective-value verification — three states via a probe project that imports Configuration.props with AndroidToolchainDirectory=C:\android-toolchain:

Pre-slice equivalent (simulated Configuration.OperatingSystem.props present, no JdkInfo.props):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\jdk-21
JavaCPath=C:\jdk-21\bin\javac.exe
JarPath=C:\jdk-21\bin\jar.exe
JavaPath=C:\jdk-21\bin\java.exe

Post-slice, fresh clone (no Configuration.OperatingSystem.props, no JdkInfo.props — fallbacks fire):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\android-toolchain\jdk-21
JavaCPath=C:\android-toolchain\jdk-21\bin\javac.exe
JarPath=C:\android-toolchain\jdk-21\bin\jar.exe
JavaPath=C:\android-toolchain\jdk-21\bin\java.exe

Post-slice, post-Prepare (with JdkInfo.props supplying real paths):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=D:\real-jdk\jdk-21
JavaCPath=D:\real-jdk\jdk-21\bin\javac.exe
JarPath=D:\real-jdk\jdk-21\bin\jar.exe
JavaPath=D:\real-jdk\jdk-21\bin\java.exe

Grep audit under build-tools/xaprepare/: zero references to @JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @javac@, @java@, @jar@, MicrosoftOpenJDKVersion, or MicrosoftMinOpenJDKVersion remain. @JavaSdkDirectory@ still appears in xaprepare.targets / Properties.Defaults.cs.in — that's the unrelated compile-time replacement in Properties.Defaults.cs, intentionally left alone.

Cold -t:Prepare was not run in this environment (no Android toolchain / network); the fallback logic above ensures behavior is well-defined in every state along the Prepare pipeline.

File list

File+/-
Configuration.props+10
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs−5
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in−6
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs−6

Net: +10 / −17 (−7 LOC).

Precedent

Continues the incremental xaprepare removal in #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946.

…kInfo.props
The last remaining xaprepare generator (Step_GenerateFiles.Get_Configuration_OperatingSystem_props)
substituted six JDK-related placeholders. Since Java.Interop is now in-tree (#11744), its JdkInfo
MSBuild task can supply those values directly.
* Configuration.props now imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props
after Configuration.OperatingSystem.props, so downstream projects pick up JavaSdkDirectory,
JavaPath, JavaCPath, and JarPath from Java.Interop.
* JavaSdkVersion and MinimumSupportedJavaSdkVersion (which JdkInfo.props does not provide) are
set directly in Configuration.props alongside the existing MicrosoftOpenJDKVersion property.
* The six JDK placeholders (@JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @JavaSdkDirectory@,
@javac@, @java@, @jar@) are removed from Configuration.OperatingSystem.props.in and from the
Step_GenerateFiles replacements dictionary.
* The now-dead Configurables.MicrosoftOpenJDKVersion (const + Version) and
MicrosoftMinOpenJDKVersion fields are removed. Grep confirmed zero remaining consumers under
build-tools/xaprepare after removing Step_GenerateFiles references.
The NDK/OS-info half of the generator (HostOsName, HostOsFlavor, HostOsRelease, HostCpuCount,
HostBits, NdkLlvmTag) is intentionally left in place for a follow-up slice.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 2, 2026 13:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Moves JDK-related MSBuild properties out of xaprepare’s generated Configuration.OperatingSystem.props and into the Java.Interop-generated JdkInfo.props, reducing xaprepare’s responsibility to OS/NDK-related values while keeping the overall Configuration.props import chain intact.

Changes:

  • Import external/Java.Interop/bin/Build$(Configuration)/JdkInfo.props from Configuration.props (when present) and define JDK policy constants (JavaSdkVersion, MinimumSupportedJavaSdkVersion) directly in Configuration.props.
  • Remove JDK placeholders and replacements from the xaprepare Configuration.OperatingSystem.props template and generator.
  • Delete now-dead Microsoft OpenJDK version constants from xaprepare configurables.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

FileDescription
Configuration.propsImports Java.Interop-generated JdkInfo.props and defines JavaSdkVersion / minimum supported JDK policy.
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.csStops emitting JDK-related placeholder replacements for the OS props generator.
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.inRemoves JDK-related properties from the generated OS props template.
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.csRemoves unused JDK version/minimum constants from xaprepare defaults.

Comment threadConfiguration.props
Rubberduck review flagged that removing the six JDK properties from
Configuration.OperatingSystem.props leaves JavaPath, JavaCPath, and JarPath
undefined for consumers that read them directly (e.g.
src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets,
src/java-runtime/java-runtime.targets) between the time xaprepare runs and
when PrepareJavaInterop generates JdkInfo.props, or in downstream builds that
skip full Prepare. Pre-slice xaprepare's OS.cs computed these as
$(JavaSdkDirectory)\bin\{tool}{.exe on Windows}; mirror that logic in
Configuration.props so the properties are always defined. JdkInfo.props still
supplies its own conditional values that win when it's imported.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@jonathanpeppers
jonathanpeppers merged commit 5734d0d into mainJul 2, 2026
42 checks passed
@jonathanpeppers
jonathanpeppers deleted the jonathanpeppers-xaprepare-d1-jdk-side branch July 2, 2026 15:44
simonrozsival pushed a commit that referenced this pull request Jul 3, 2026
…xaprepare project (#11959)
Follow-up to #11956, which moved the JDK half of `Configuration.OperatingSystem.props` to Java.Interop's `JdkInfo.props`. The remaining NDK / OS-info half has zero real consumers, so this PR:
1. Deletes the last generator template (`Configuration.OperatingSystem.props.in`).
2. Cascades through `Step_GenerateFiles`, both `Scenario_*` classes (which now had zero steps), and every supporting `OperatingSystems/`, `Context.*OS.cs`, `EssentialTools.*`, `ToolRunners/*`, `Configurables.*`, `Application/*`, and `Main.cs` file that only existed to feed the scenarios.
3. Deletes the whole `build-tools/xaprepare/` project.
4. Patches every integration point (`Makefile`, `PrepareWindows.targets`, `BuildEverything.mk`, CI YAML, docs) so `build.cmd -t:Prepare` and `make prepare` still work end-to-end.
## `Configuration.OperatingSystem.props.in` placeholder audit
| Placeholder | Consumers outside the `.in` file | Action |
| --- | --- | --- |
| `HostOsName` | none | drop |
| `HostOsFlavor` | none | drop |
| `HostOsRelease` | none | drop |
| `HostBits` | none (`ArchiveBase.HostBits` in `src/Xamarin.Installer.AndroidSDK/` is an unrelated C# property) | drop |
| `NdkLlvmTag` | none (the NDK toolchain OS tag is resolved elsewhere via `_NdkToolchainOSTag` in `androidsdk.targets`) | drop |
| `HostCpuCount` | only `Configuration.props:72` via `$(MakeConcurrency)` | drop |
## `$(MakeConcurrency)` audit
The only definition was `Configuration.props:72`. A repo-wide grep of `.targets`, `.props`, `.projitems`, `Makefile`, and `.mk` files found zero consumers of the MSBuild property. The `MakeConcurrency` hits under `build-tools/xaprepare/` were an unrelated C# `Context.MakeConcurrency` property.
**Result:** dropped the `MakeConcurrency` MSBuild property entirely (no `$([System.Environment]::ProcessorCount)` replacement needed) and removed the `$(MakeConcurrency)` bullet in `Documentation/building/configuration.md`.
## xaprepare integration audit (grep-confirmed, patched here)
| Location | Change |
| --- | --- |
| `build-tools/xaprepare/` (entire tree) | **deleted** — 86 tracked files |
| `Configuration.props` | dropped `<Import>` of the generated OS props, dropped `MakeConcurrency`, tidied the "between xaprepare and package creation tools" comment |
| `.gitignore` | dropped `Configuration.OperatingSystem.props` |
| `build-tools/scripts/PrepareWindows.targets` | removed `_XAPrepareExe`, `_XAPrepareStandardArgs`, `_BuildXAPrepare` target, and the `Exec dotnet $(_XAPrepareExe)` line. Repointed `Prepare` at `_InstallDotNet`. Kept the space-in-path guard, BootstrapTasks / workloads MSBuilds, and `PrepareJavaInterop` |
| `Makefile` | dropped `PREPARE_PROJECT`, `PREPARE_NET_FX`, `PREPARE_ARGS`, `PREPARE_MSBUILD_FLAGS`, `PREPARE_SCENARIO`, `PREPARE_CI_PR`, `PREPARE_CI`, `_PREPARE_CI_MODE_*`, `_PREPARE_ARGS`, and all their conditionals. Dropped the `dotnet run --project xaprepare.csproj` line from `prepare`. Deleted the `prepare-help` target |
| `build-tools/scripts/BuildEverything.mk` | `jenkins` no longer branches on `PREPARE_CI_PR`/`PREPARE_CI`; just `$(MAKE) prepare && $(MAKE) leeroy` |
| `.github/workflows/copilot-setup-steps.yml` | dropped now-unused `PREPARE_CI=1` |
| `build-tools/automation/azure-pipelines-apidocs.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-linux-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-macos-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/commercial-build.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/copy-extra-result-files.yaml` | dropped `**/Configuration.OperatingSystem.props` glob and the stale `Step_CopyExtraResultFilesForCI` xaprepare-step comment |
| `build-tools/automation/yaml-templates/generate-cgmanifest.yaml` | dropped the stale `Step_GenerateCGManifest` xaprepare-step comment |
| `build-tools/automation/yaml-templates/setup-jdk-variables.yaml` | renamed `$xaPrepareJdkPath` → `$xaJdkPath` for hygiene |
| `Documentation/workflow/HowToAddNewApiLevel.md` | rewrote the "Add New Platform" section to point at `<_PlatformPackage>` entries in `src/androidsdk/androidsdk.targets` instead of `AndroidToolchain.cs`; updated the `--android-sdk-platforms=all` recipe to `dotnet-local build src/androidsdk/androidsdk.csproj -p:AndroidSdkPlatforms=all` |
| `Documentation/building/unix/dependencies.md` | JDK-version link now points at `$(MicrosoftOpenJDKVersion)` in `/Configuration.props` instead of the deleted `Configurables.cs` |
| `Documentation/building/configuration.md` | removed the `$(MakeConcurrency)` bullet |
**Historical breadcrumb comments left as-is** (still accurate and useful for git-archaeology):
- `.github/skills/update-tpn/SKILL.md`
- `src/AndroidBuildConfig/AndroidBuildConfig.csproj`
- `src/androidsdk/androidsdk.targets`
- `src/native/cmake-config/cmake-config.csproj`
- `src/workloads/workloads.csproj`
## Verification
- `build.cmd Prepare` — succeeded end-to-end on Windows (0 warnings, 0 errors). The trimmed `Prepare` target ran through `_InstallDotNet`, the space-in-path guard, `Xamarin.Android.BootstrapTasks.sln`, `src/workloads/workloads.csproj`, and `PrepareJavaInterop`.
- `dotnet build src\Xamarin.Android.Build.Tasks\Xamarin.Android.Build.Tasks.csproj -c Debug` — 0 errors (93 pre-existing warnings from `src/Mono.Android/` and generated MCW, unrelated to this change).
- Repo-wide grep for `HostOsName`, `HostOsFlavor`, `HostOsRelease`, `HostCpuCount`, `NdkLlvmTag`, and the MSBuild `MakeConcurrency` property — clean.
- Repo-wide grep for `xaprepare` — clean apart from the five intentional historical breadcrumb comments listed above.
## Diff stat
102 files changed, 25 insertions(+), 7891 deletions(-).
## Precedent chain
Continues the multi-slice teardown started by #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946, #11956.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jonathanpeppers@simonrozsival
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props - #11956

Merged
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side
Jul 2, 2026
Merged

[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props#11956
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side

Conversation

@jonathanpeppers

@jonathanpeppersjonathanpeppers commented Jul 2, 2026

Copy link
Copy Markdown
Member

Summary

JDK-related properties are now sourced from Java.Interop's JdkInfo MSBuild task (in-tree since #11744) plus Configuration.props. The Configuration.OperatingSystem.props generator in xaprepare no longer writes any JDK values — only the NDK/OS-info half remains, which will be removed in a follow-up slice.

Changes

  • Configuration.props
    • Imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props immediately after Configuration.OperatingSystem.props. Java.Interop supplies JavaSdkDirectory, JavaPath, JavaCPath, JarPath (plus additional JDK metadata) once Prepare has run.
    • Sets JavaSdkVersion (= $(MicrosoftOpenJDKVersion)) and MinimumSupportedJavaSdkVersion (= 17.0) directly, since JdkInfo.props does not emit those two policy constants.
    • Adds conditional JavaPath, JavaCPath, JarPath fallbacks derived from $(JavaSdkDirectory)\bin\{tool}{.exe on Windows} — mirroring what xaprepare's OS.cs computed pre-slice. This ensures those properties are always defined for consumers that read them directly (e.g. src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets, src/java-runtime/java-runtime.targets, build-tools/create-android-api/create-android-api.csproj) even before PrepareJavaInterop has generated JdkInfo.props. When JdkInfo.props is imported, its conditional values win.
  • build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in — removes JavaSdkVersion, MinimumSupportedJavaSdkVersion, JavaSdkDirectory, JavaCPath, JarPath, JavaPath.
  • build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs — removes the six matching entries from the replacements dictionary.
  • build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs — deletes now-dead MicrosoftOpenJDKVersion (const string + Version field) and MicrosoftMinOpenJDKVersion. Grep confirms zero remaining consumers under build-tools/xaprepare.

OS.JavaHome/JavaCPath/JavaPath/JarPath are intentionally left in place — Windows.cs still uses JavaHome for the JAVA_HOME env var. Removing those OS discovery paths is deferred to the next slice.

Verification

xaprepare build: dotnet build build-tools\xaprepare\xaprepare\xaprepare.csproj -c Debug → 0 warnings, 0 errors.

Effective-value verification — three states via a probe project that imports Configuration.props with AndroidToolchainDirectory=C:\android-toolchain:

Pre-slice equivalent (simulated Configuration.OperatingSystem.props present, no JdkInfo.props):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\jdk-21
JavaCPath=C:\jdk-21\bin\javac.exe
JarPath=C:\jdk-21\bin\jar.exe
JavaPath=C:\jdk-21\bin\java.exe

Post-slice, fresh clone (no Configuration.OperatingSystem.props, no JdkInfo.props — fallbacks fire):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\android-toolchain\jdk-21
JavaCPath=C:\android-toolchain\jdk-21\bin\javac.exe
JarPath=C:\android-toolchain\jdk-21\bin\jar.exe
JavaPath=C:\android-toolchain\jdk-21\bin\java.exe

Post-slice, post-Prepare (with JdkInfo.props supplying real paths):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=D:\real-jdk\jdk-21
JavaCPath=D:\real-jdk\jdk-21\bin\javac.exe
JarPath=D:\real-jdk\jdk-21\bin\jar.exe
JavaPath=D:\real-jdk\jdk-21\bin\java.exe

Grep audit under build-tools/xaprepare/: zero references to @JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @javac@, @java@, @jar@, MicrosoftOpenJDKVersion, or MicrosoftMinOpenJDKVersion remain. @JavaSdkDirectory@ still appears in xaprepare.targets / Properties.Defaults.cs.in — that's the unrelated compile-time replacement in Properties.Defaults.cs, intentionally left alone.

Cold -t:Prepare was not run in this environment (no Android toolchain / network); the fallback logic above ensures behavior is well-defined in every state along the Prepare pipeline.

File list

File+/-
Configuration.props+10
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs−5
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in−6
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs−6

Net: +10 / −17 (−7 LOC).

Precedent

Continues the incremental xaprepare removal in #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946.

…kInfo.props
The last remaining xaprepare generator (Step_GenerateFiles.Get_Configuration_OperatingSystem_props)
substituted six JDK-related placeholders. Since Java.Interop is now in-tree (#11744), its JdkInfo
MSBuild task can supply those values directly.
* Configuration.props now imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props
after Configuration.OperatingSystem.props, so downstream projects pick up JavaSdkDirectory,
JavaPath, JavaCPath, and JarPath from Java.Interop.
* JavaSdkVersion and MinimumSupportedJavaSdkVersion (which JdkInfo.props does not provide) are
set directly in Configuration.props alongside the existing MicrosoftOpenJDKVersion property.
* The six JDK placeholders (@JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @JavaSdkDirectory@,
@javac@, @java@, @jar@) are removed from Configuration.OperatingSystem.props.in and from the
Step_GenerateFiles replacements dictionary.
* The now-dead Configurables.MicrosoftOpenJDKVersion (const + Version) and
MicrosoftMinOpenJDKVersion fields are removed. Grep confirmed zero remaining consumers under
build-tools/xaprepare after removing Step_GenerateFiles references.
The NDK/OS-info half of the generator (HostOsName, HostOsFlavor, HostOsRelease, HostCpuCount,
HostBits, NdkLlvmTag) is intentionally left in place for a follow-up slice.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 2, 2026 13:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Moves JDK-related MSBuild properties out of xaprepare’s generated Configuration.OperatingSystem.props and into the Java.Interop-generated JdkInfo.props, reducing xaprepare’s responsibility to OS/NDK-related values while keeping the overall Configuration.props import chain intact.

Changes:

  • Import external/Java.Interop/bin/Build$(Configuration)/JdkInfo.props from Configuration.props (when present) and define JDK policy constants (JavaSdkVersion, MinimumSupportedJavaSdkVersion) directly in Configuration.props.
  • Remove JDK placeholders and replacements from the xaprepare Configuration.OperatingSystem.props template and generator.
  • Delete now-dead Microsoft OpenJDK version constants from xaprepare configurables.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

FileDescription
Configuration.propsImports Java.Interop-generated JdkInfo.props and defines JavaSdkVersion / minimum supported JDK policy.
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.csStops emitting JDK-related placeholder replacements for the OS props generator.
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.inRemoves JDK-related properties from the generated OS props template.
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.csRemoves unused JDK version/minimum constants from xaprepare defaults.

Comment threadConfiguration.props
Rubberduck review flagged that removing the six JDK properties from
Configuration.OperatingSystem.props leaves JavaPath, JavaCPath, and JarPath
undefined for consumers that read them directly (e.g.
src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets,
src/java-runtime/java-runtime.targets) between the time xaprepare runs and
when PrepareJavaInterop generates JdkInfo.props, or in downstream builds that
skip full Prepare. Pre-slice xaprepare's OS.cs computed these as
$(JavaSdkDirectory)\bin\{tool}{.exe on Windows}; mirror that logic in
Configuration.props so the properties are always defined. JdkInfo.props still
supplies its own conditional values that win when it's imported.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@jonathanpeppers
jonathanpeppers merged commit 5734d0d into mainJul 2, 2026
42 checks passed
@jonathanpeppers
jonathanpeppers deleted the jonathanpeppers-xaprepare-d1-jdk-side branch July 2, 2026 15:44
simonrozsival pushed a commit that referenced this pull request Jul 3, 2026
…xaprepare project (#11959)
Follow-up to #11956, which moved the JDK half of `Configuration.OperatingSystem.props` to Java.Interop's `JdkInfo.props`. The remaining NDK / OS-info half has zero real consumers, so this PR:
1. Deletes the last generator template (`Configuration.OperatingSystem.props.in`).
2. Cascades through `Step_GenerateFiles`, both `Scenario_*` classes (which now had zero steps), and every supporting `OperatingSystems/`, `Context.*OS.cs`, `EssentialTools.*`, `ToolRunners/*`, `Configurables.*`, `Application/*`, and `Main.cs` file that only existed to feed the scenarios.
3. Deletes the whole `build-tools/xaprepare/` project.
4. Patches every integration point (`Makefile`, `PrepareWindows.targets`, `BuildEverything.mk`, CI YAML, docs) so `build.cmd -t:Prepare` and `make prepare` still work end-to-end.
## `Configuration.OperatingSystem.props.in` placeholder audit
| Placeholder | Consumers outside the `.in` file | Action |
| --- | --- | --- |
| `HostOsName` | none | drop |
| `HostOsFlavor` | none | drop |
| `HostOsRelease` | none | drop |
| `HostBits` | none (`ArchiveBase.HostBits` in `src/Xamarin.Installer.AndroidSDK/` is an unrelated C# property) | drop |
| `NdkLlvmTag` | none (the NDK toolchain OS tag is resolved elsewhere via `_NdkToolchainOSTag` in `androidsdk.targets`) | drop |
| `HostCpuCount` | only `Configuration.props:72` via `$(MakeConcurrency)` | drop |
## `$(MakeConcurrency)` audit
The only definition was `Configuration.props:72`. A repo-wide grep of `.targets`, `.props`, `.projitems`, `Makefile`, and `.mk` files found zero consumers of the MSBuild property. The `MakeConcurrency` hits under `build-tools/xaprepare/` were an unrelated C# `Context.MakeConcurrency` property.
**Result:** dropped the `MakeConcurrency` MSBuild property entirely (no `$([System.Environment]::ProcessorCount)` replacement needed) and removed the `$(MakeConcurrency)` bullet in `Documentation/building/configuration.md`.
## xaprepare integration audit (grep-confirmed, patched here)
| Location | Change |
| --- | --- |
| `build-tools/xaprepare/` (entire tree) | **deleted** — 86 tracked files |
| `Configuration.props` | dropped `<Import>` of the generated OS props, dropped `MakeConcurrency`, tidied the "between xaprepare and package creation tools" comment |
| `.gitignore` | dropped `Configuration.OperatingSystem.props` |
| `build-tools/scripts/PrepareWindows.targets` | removed `_XAPrepareExe`, `_XAPrepareStandardArgs`, `_BuildXAPrepare` target, and the `Exec dotnet $(_XAPrepareExe)` line. Repointed `Prepare` at `_InstallDotNet`. Kept the space-in-path guard, BootstrapTasks / workloads MSBuilds, and `PrepareJavaInterop` |
| `Makefile` | dropped `PREPARE_PROJECT`, `PREPARE_NET_FX`, `PREPARE_ARGS`, `PREPARE_MSBUILD_FLAGS`, `PREPARE_SCENARIO`, `PREPARE_CI_PR`, `PREPARE_CI`, `_PREPARE_CI_MODE_*`, `_PREPARE_ARGS`, and all their conditionals. Dropped the `dotnet run --project xaprepare.csproj` line from `prepare`. Deleted the `prepare-help` target |
| `build-tools/scripts/BuildEverything.mk` | `jenkins` no longer branches on `PREPARE_CI_PR`/`PREPARE_CI`; just `$(MAKE) prepare && $(MAKE) leeroy` |
| `.github/workflows/copilot-setup-steps.yml` | dropped now-unused `PREPARE_CI=1` |
| `build-tools/automation/azure-pipelines-apidocs.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-linux-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-macos-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/commercial-build.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/copy-extra-result-files.yaml` | dropped `**/Configuration.OperatingSystem.props` glob and the stale `Step_CopyExtraResultFilesForCI` xaprepare-step comment |
| `build-tools/automation/yaml-templates/generate-cgmanifest.yaml` | dropped the stale `Step_GenerateCGManifest` xaprepare-step comment |
| `build-tools/automation/yaml-templates/setup-jdk-variables.yaml` | renamed `$xaPrepareJdkPath` → `$xaJdkPath` for hygiene |
| `Documentation/workflow/HowToAddNewApiLevel.md` | rewrote the "Add New Platform" section to point at `<_PlatformPackage>` entries in `src/androidsdk/androidsdk.targets` instead of `AndroidToolchain.cs`; updated the `--android-sdk-platforms=all` recipe to `dotnet-local build src/androidsdk/androidsdk.csproj -p:AndroidSdkPlatforms=all` |
| `Documentation/building/unix/dependencies.md` | JDK-version link now points at `$(MicrosoftOpenJDKVersion)` in `/Configuration.props` instead of the deleted `Configurables.cs` |
| `Documentation/building/configuration.md` | removed the `$(MakeConcurrency)` bullet |
**Historical breadcrumb comments left as-is** (still accurate and useful for git-archaeology):
- `.github/skills/update-tpn/SKILL.md`
- `src/AndroidBuildConfig/AndroidBuildConfig.csproj`
- `src/androidsdk/androidsdk.targets`
- `src/native/cmake-config/cmake-config.csproj`
- `src/workloads/workloads.csproj`
## Verification
- `build.cmd Prepare` — succeeded end-to-end on Windows (0 warnings, 0 errors). The trimmed `Prepare` target ran through `_InstallDotNet`, the space-in-path guard, `Xamarin.Android.BootstrapTasks.sln`, `src/workloads/workloads.csproj`, and `PrepareJavaInterop`.
- `dotnet build src\Xamarin.Android.Build.Tasks\Xamarin.Android.Build.Tasks.csproj -c Debug` — 0 errors (93 pre-existing warnings from `src/Mono.Android/` and generated MCW, unrelated to this change).
- Repo-wide grep for `HostOsName`, `HostOsFlavor`, `HostOsRelease`, `HostCpuCount`, `NdkLlvmTag`, and the MSBuild `MakeConcurrency` property — clean.
- Repo-wide grep for `xaprepare` — clean apart from the five intentional historical breadcrumb comments listed above.
## Diff stat
102 files changed, 25 insertions(+), 7891 deletions(-).
## Precedent chain
Continues the multi-slice teardown started by #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946, #11956.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jonathanpeppers@simonrozsival
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props - #11956

Merged
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side
Jul 2, 2026
Merged

[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props#11956
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side

Conversation

@jonathanpeppers

@jonathanpeppersjonathanpeppers commented Jul 2, 2026

Copy link
Copy Markdown
Member

Summary

JDK-related properties are now sourced from Java.Interop's JdkInfo MSBuild task (in-tree since #11744) plus Configuration.props. The Configuration.OperatingSystem.props generator in xaprepare no longer writes any JDK values — only the NDK/OS-info half remains, which will be removed in a follow-up slice.

Changes

  • Configuration.props
    • Imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props immediately after Configuration.OperatingSystem.props. Java.Interop supplies JavaSdkDirectory, JavaPath, JavaCPath, JarPath (plus additional JDK metadata) once Prepare has run.
    • Sets JavaSdkVersion (= $(MicrosoftOpenJDKVersion)) and MinimumSupportedJavaSdkVersion (= 17.0) directly, since JdkInfo.props does not emit those two policy constants.
    • Adds conditional JavaPath, JavaCPath, JarPath fallbacks derived from $(JavaSdkDirectory)\bin\{tool}{.exe on Windows} — mirroring what xaprepare's OS.cs computed pre-slice. This ensures those properties are always defined for consumers that read them directly (e.g. src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets, src/java-runtime/java-runtime.targets, build-tools/create-android-api/create-android-api.csproj) even before PrepareJavaInterop has generated JdkInfo.props. When JdkInfo.props is imported, its conditional values win.
  • build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in — removes JavaSdkVersion, MinimumSupportedJavaSdkVersion, JavaSdkDirectory, JavaCPath, JarPath, JavaPath.
  • build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs — removes the six matching entries from the replacements dictionary.
  • build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs — deletes now-dead MicrosoftOpenJDKVersion (const string + Version field) and MicrosoftMinOpenJDKVersion. Grep confirms zero remaining consumers under build-tools/xaprepare.

OS.JavaHome/JavaCPath/JavaPath/JarPath are intentionally left in place — Windows.cs still uses JavaHome for the JAVA_HOME env var. Removing those OS discovery paths is deferred to the next slice.

Verification

xaprepare build: dotnet build build-tools\xaprepare\xaprepare\xaprepare.csproj -c Debug → 0 warnings, 0 errors.

Effective-value verification — three states via a probe project that imports Configuration.props with AndroidToolchainDirectory=C:\android-toolchain:

Pre-slice equivalent (simulated Configuration.OperatingSystem.props present, no JdkInfo.props):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\jdk-21
JavaCPath=C:\jdk-21\bin\javac.exe
JarPath=C:\jdk-21\bin\jar.exe
JavaPath=C:\jdk-21\bin\java.exe

Post-slice, fresh clone (no Configuration.OperatingSystem.props, no JdkInfo.props — fallbacks fire):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\android-toolchain\jdk-21
JavaCPath=C:\android-toolchain\jdk-21\bin\javac.exe
JarPath=C:\android-toolchain\jdk-21\bin\jar.exe
JavaPath=C:\android-toolchain\jdk-21\bin\java.exe

Post-slice, post-Prepare (with JdkInfo.props supplying real paths):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=D:\real-jdk\jdk-21
JavaCPath=D:\real-jdk\jdk-21\bin\javac.exe
JarPath=D:\real-jdk\jdk-21\bin\jar.exe
JavaPath=D:\real-jdk\jdk-21\bin\java.exe

Grep audit under build-tools/xaprepare/: zero references to @JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @javac@, @java@, @jar@, MicrosoftOpenJDKVersion, or MicrosoftMinOpenJDKVersion remain. @JavaSdkDirectory@ still appears in xaprepare.targets / Properties.Defaults.cs.in — that's the unrelated compile-time replacement in Properties.Defaults.cs, intentionally left alone.

Cold -t:Prepare was not run in this environment (no Android toolchain / network); the fallback logic above ensures behavior is well-defined in every state along the Prepare pipeline.

File list

File+/-
Configuration.props+10
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs−5
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in−6
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs−6

Net: +10 / −17 (−7 LOC).

Precedent

Continues the incremental xaprepare removal in #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946.

…kInfo.props
The last remaining xaprepare generator (Step_GenerateFiles.Get_Configuration_OperatingSystem_props)
substituted six JDK-related placeholders. Since Java.Interop is now in-tree (#11744), its JdkInfo
MSBuild task can supply those values directly.
* Configuration.props now imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props
after Configuration.OperatingSystem.props, so downstream projects pick up JavaSdkDirectory,
JavaPath, JavaCPath, and JarPath from Java.Interop.
* JavaSdkVersion and MinimumSupportedJavaSdkVersion (which JdkInfo.props does not provide) are
set directly in Configuration.props alongside the existing MicrosoftOpenJDKVersion property.
* The six JDK placeholders (@JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @JavaSdkDirectory@,
@javac@, @java@, @jar@) are removed from Configuration.OperatingSystem.props.in and from the
Step_GenerateFiles replacements dictionary.
* The now-dead Configurables.MicrosoftOpenJDKVersion (const + Version) and
MicrosoftMinOpenJDKVersion fields are removed. Grep confirmed zero remaining consumers under
build-tools/xaprepare after removing Step_GenerateFiles references.
The NDK/OS-info half of the generator (HostOsName, HostOsFlavor, HostOsRelease, HostCpuCount,
HostBits, NdkLlvmTag) is intentionally left in place for a follow-up slice.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 2, 2026 13:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Moves JDK-related MSBuild properties out of xaprepare’s generated Configuration.OperatingSystem.props and into the Java.Interop-generated JdkInfo.props, reducing xaprepare’s responsibility to OS/NDK-related values while keeping the overall Configuration.props import chain intact.

Changes:

  • Import external/Java.Interop/bin/Build$(Configuration)/JdkInfo.props from Configuration.props (when present) and define JDK policy constants (JavaSdkVersion, MinimumSupportedJavaSdkVersion) directly in Configuration.props.
  • Remove JDK placeholders and replacements from the xaprepare Configuration.OperatingSystem.props template and generator.
  • Delete now-dead Microsoft OpenJDK version constants from xaprepare configurables.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

FileDescription
Configuration.propsImports Java.Interop-generated JdkInfo.props and defines JavaSdkVersion / minimum supported JDK policy.
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.csStops emitting JDK-related placeholder replacements for the OS props generator.
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.inRemoves JDK-related properties from the generated OS props template.
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.csRemoves unused JDK version/minimum constants from xaprepare defaults.

Comment threadConfiguration.props
Rubberduck review flagged that removing the six JDK properties from
Configuration.OperatingSystem.props leaves JavaPath, JavaCPath, and JarPath
undefined for consumers that read them directly (e.g.
src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets,
src/java-runtime/java-runtime.targets) between the time xaprepare runs and
when PrepareJavaInterop generates JdkInfo.props, or in downstream builds that
skip full Prepare. Pre-slice xaprepare's OS.cs computed these as
$(JavaSdkDirectory)\bin\{tool}{.exe on Windows}; mirror that logic in
Configuration.props so the properties are always defined. JdkInfo.props still
supplies its own conditional values that win when it's imported.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@jonathanpeppers
jonathanpeppers merged commit 5734d0d into mainJul 2, 2026
42 checks passed
@jonathanpeppers
jonathanpeppers deleted the jonathanpeppers-xaprepare-d1-jdk-side branch July 2, 2026 15:44
simonrozsival pushed a commit that referenced this pull request Jul 3, 2026
…xaprepare project (#11959)
Follow-up to #11956, which moved the JDK half of `Configuration.OperatingSystem.props` to Java.Interop's `JdkInfo.props`. The remaining NDK / OS-info half has zero real consumers, so this PR:
1. Deletes the last generator template (`Configuration.OperatingSystem.props.in`).
2. Cascades through `Step_GenerateFiles`, both `Scenario_*` classes (which now had zero steps), and every supporting `OperatingSystems/`, `Context.*OS.cs`, `EssentialTools.*`, `ToolRunners/*`, `Configurables.*`, `Application/*`, and `Main.cs` file that only existed to feed the scenarios.
3. Deletes the whole `build-tools/xaprepare/` project.
4. Patches every integration point (`Makefile`, `PrepareWindows.targets`, `BuildEverything.mk`, CI YAML, docs) so `build.cmd -t:Prepare` and `make prepare` still work end-to-end.
## `Configuration.OperatingSystem.props.in` placeholder audit
| Placeholder | Consumers outside the `.in` file | Action |
| --- | --- | --- |
| `HostOsName` | none | drop |
| `HostOsFlavor` | none | drop |
| `HostOsRelease` | none | drop |
| `HostBits` | none (`ArchiveBase.HostBits` in `src/Xamarin.Installer.AndroidSDK/` is an unrelated C# property) | drop |
| `NdkLlvmTag` | none (the NDK toolchain OS tag is resolved elsewhere via `_NdkToolchainOSTag` in `androidsdk.targets`) | drop |
| `HostCpuCount` | only `Configuration.props:72` via `$(MakeConcurrency)` | drop |
## `$(MakeConcurrency)` audit
The only definition was `Configuration.props:72`. A repo-wide grep of `.targets`, `.props`, `.projitems`, `Makefile`, and `.mk` files found zero consumers of the MSBuild property. The `MakeConcurrency` hits under `build-tools/xaprepare/` were an unrelated C# `Context.MakeConcurrency` property.
**Result:** dropped the `MakeConcurrency` MSBuild property entirely (no `$([System.Environment]::ProcessorCount)` replacement needed) and removed the `$(MakeConcurrency)` bullet in `Documentation/building/configuration.md`.
## xaprepare integration audit (grep-confirmed, patched here)
| Location | Change |
| --- | --- |
| `build-tools/xaprepare/` (entire tree) | **deleted** — 86 tracked files |
| `Configuration.props` | dropped `<Import>` of the generated OS props, dropped `MakeConcurrency`, tidied the "between xaprepare and package creation tools" comment |
| `.gitignore` | dropped `Configuration.OperatingSystem.props` |
| `build-tools/scripts/PrepareWindows.targets` | removed `_XAPrepareExe`, `_XAPrepareStandardArgs`, `_BuildXAPrepare` target, and the `Exec dotnet $(_XAPrepareExe)` line. Repointed `Prepare` at `_InstallDotNet`. Kept the space-in-path guard, BootstrapTasks / workloads MSBuilds, and `PrepareJavaInterop` |
| `Makefile` | dropped `PREPARE_PROJECT`, `PREPARE_NET_FX`, `PREPARE_ARGS`, `PREPARE_MSBUILD_FLAGS`, `PREPARE_SCENARIO`, `PREPARE_CI_PR`, `PREPARE_CI`, `_PREPARE_CI_MODE_*`, `_PREPARE_ARGS`, and all their conditionals. Dropped the `dotnet run --project xaprepare.csproj` line from `prepare`. Deleted the `prepare-help` target |
| `build-tools/scripts/BuildEverything.mk` | `jenkins` no longer branches on `PREPARE_CI_PR`/`PREPARE_CI`; just `$(MAKE) prepare && $(MAKE) leeroy` |
| `.github/workflows/copilot-setup-steps.yml` | dropped now-unused `PREPARE_CI=1` |
| `build-tools/automation/azure-pipelines-apidocs.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-linux-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-macos-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/commercial-build.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/copy-extra-result-files.yaml` | dropped `**/Configuration.OperatingSystem.props` glob and the stale `Step_CopyExtraResultFilesForCI` xaprepare-step comment |
| `build-tools/automation/yaml-templates/generate-cgmanifest.yaml` | dropped the stale `Step_GenerateCGManifest` xaprepare-step comment |
| `build-tools/automation/yaml-templates/setup-jdk-variables.yaml` | renamed `$xaPrepareJdkPath` → `$xaJdkPath` for hygiene |
| `Documentation/workflow/HowToAddNewApiLevel.md` | rewrote the "Add New Platform" section to point at `<_PlatformPackage>` entries in `src/androidsdk/androidsdk.targets` instead of `AndroidToolchain.cs`; updated the `--android-sdk-platforms=all` recipe to `dotnet-local build src/androidsdk/androidsdk.csproj -p:AndroidSdkPlatforms=all` |
| `Documentation/building/unix/dependencies.md` | JDK-version link now points at `$(MicrosoftOpenJDKVersion)` in `/Configuration.props` instead of the deleted `Configurables.cs` |
| `Documentation/building/configuration.md` | removed the `$(MakeConcurrency)` bullet |
**Historical breadcrumb comments left as-is** (still accurate and useful for git-archaeology):
- `.github/skills/update-tpn/SKILL.md`
- `src/AndroidBuildConfig/AndroidBuildConfig.csproj`
- `src/androidsdk/androidsdk.targets`
- `src/native/cmake-config/cmake-config.csproj`
- `src/workloads/workloads.csproj`
## Verification
- `build.cmd Prepare` — succeeded end-to-end on Windows (0 warnings, 0 errors). The trimmed `Prepare` target ran through `_InstallDotNet`, the space-in-path guard, `Xamarin.Android.BootstrapTasks.sln`, `src/workloads/workloads.csproj`, and `PrepareJavaInterop`.
- `dotnet build src\Xamarin.Android.Build.Tasks\Xamarin.Android.Build.Tasks.csproj -c Debug` — 0 errors (93 pre-existing warnings from `src/Mono.Android/` and generated MCW, unrelated to this change).
- Repo-wide grep for `HostOsName`, `HostOsFlavor`, `HostOsRelease`, `HostCpuCount`, `NdkLlvmTag`, and the MSBuild `MakeConcurrency` property — clean.
- Repo-wide grep for `xaprepare` — clean apart from the five intentional historical breadcrumb comments listed above.
## Diff stat
102 files changed, 25 insertions(+), 7891 deletions(-).
## Precedent chain
Continues the multi-slice teardown started by #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946, #11956.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jonathanpeppers@simonrozsival
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props - #11956

Merged
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side
Jul 2, 2026
Merged

[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props#11956
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side

Conversation

@jonathanpeppers

@jonathanpeppersjonathanpeppers commented Jul 2, 2026

Copy link
Copy Markdown
Member

Summary

JDK-related properties are now sourced from Java.Interop's JdkInfo MSBuild task (in-tree since #11744) plus Configuration.props. The Configuration.OperatingSystem.props generator in xaprepare no longer writes any JDK values — only the NDK/OS-info half remains, which will be removed in a follow-up slice.

Changes

  • Configuration.props
    • Imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props immediately after Configuration.OperatingSystem.props. Java.Interop supplies JavaSdkDirectory, JavaPath, JavaCPath, JarPath (plus additional JDK metadata) once Prepare has run.
    • Sets JavaSdkVersion (= $(MicrosoftOpenJDKVersion)) and MinimumSupportedJavaSdkVersion (= 17.0) directly, since JdkInfo.props does not emit those two policy constants.
    • Adds conditional JavaPath, JavaCPath, JarPath fallbacks derived from $(JavaSdkDirectory)\bin\{tool}{.exe on Windows} — mirroring what xaprepare's OS.cs computed pre-slice. This ensures those properties are always defined for consumers that read them directly (e.g. src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets, src/java-runtime/java-runtime.targets, build-tools/create-android-api/create-android-api.csproj) even before PrepareJavaInterop has generated JdkInfo.props. When JdkInfo.props is imported, its conditional values win.
  • build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in — removes JavaSdkVersion, MinimumSupportedJavaSdkVersion, JavaSdkDirectory, JavaCPath, JarPath, JavaPath.
  • build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs — removes the six matching entries from the replacements dictionary.
  • build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs — deletes now-dead MicrosoftOpenJDKVersion (const string + Version field) and MicrosoftMinOpenJDKVersion. Grep confirms zero remaining consumers under build-tools/xaprepare.

OS.JavaHome/JavaCPath/JavaPath/JarPath are intentionally left in place — Windows.cs still uses JavaHome for the JAVA_HOME env var. Removing those OS discovery paths is deferred to the next slice.

Verification

xaprepare build: dotnet build build-tools\xaprepare\xaprepare\xaprepare.csproj -c Debug → 0 warnings, 0 errors.

Effective-value verification — three states via a probe project that imports Configuration.props with AndroidToolchainDirectory=C:\android-toolchain:

Pre-slice equivalent (simulated Configuration.OperatingSystem.props present, no JdkInfo.props):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\jdk-21
JavaCPath=C:\jdk-21\bin\javac.exe
JarPath=C:\jdk-21\bin\jar.exe
JavaPath=C:\jdk-21\bin\java.exe

Post-slice, fresh clone (no Configuration.OperatingSystem.props, no JdkInfo.props — fallbacks fire):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\android-toolchain\jdk-21
JavaCPath=C:\android-toolchain\jdk-21\bin\javac.exe
JarPath=C:\android-toolchain\jdk-21\bin\jar.exe
JavaPath=C:\android-toolchain\jdk-21\bin\java.exe

Post-slice, post-Prepare (with JdkInfo.props supplying real paths):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=D:\real-jdk\jdk-21
JavaCPath=D:\real-jdk\jdk-21\bin\javac.exe
JarPath=D:\real-jdk\jdk-21\bin\jar.exe
JavaPath=D:\real-jdk\jdk-21\bin\java.exe

Grep audit under build-tools/xaprepare/: zero references to @JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @javac@, @java@, @jar@, MicrosoftOpenJDKVersion, or MicrosoftMinOpenJDKVersion remain. @JavaSdkDirectory@ still appears in xaprepare.targets / Properties.Defaults.cs.in — that's the unrelated compile-time replacement in Properties.Defaults.cs, intentionally left alone.

Cold -t:Prepare was not run in this environment (no Android toolchain / network); the fallback logic above ensures behavior is well-defined in every state along the Prepare pipeline.

File list

File+/-
Configuration.props+10
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs−5
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in−6
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs−6

Net: +10 / −17 (−7 LOC).

Precedent

Continues the incremental xaprepare removal in #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946.

…kInfo.props
The last remaining xaprepare generator (Step_GenerateFiles.Get_Configuration_OperatingSystem_props)
substituted six JDK-related placeholders. Since Java.Interop is now in-tree (#11744), its JdkInfo
MSBuild task can supply those values directly.
* Configuration.props now imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props
after Configuration.OperatingSystem.props, so downstream projects pick up JavaSdkDirectory,
JavaPath, JavaCPath, and JarPath from Java.Interop.
* JavaSdkVersion and MinimumSupportedJavaSdkVersion (which JdkInfo.props does not provide) are
set directly in Configuration.props alongside the existing MicrosoftOpenJDKVersion property.
* The six JDK placeholders (@JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @JavaSdkDirectory@,
@javac@, @java@, @jar@) are removed from Configuration.OperatingSystem.props.in and from the
Step_GenerateFiles replacements dictionary.
* The now-dead Configurables.MicrosoftOpenJDKVersion (const + Version) and
MicrosoftMinOpenJDKVersion fields are removed. Grep confirmed zero remaining consumers under
build-tools/xaprepare after removing Step_GenerateFiles references.
The NDK/OS-info half of the generator (HostOsName, HostOsFlavor, HostOsRelease, HostCpuCount,
HostBits, NdkLlvmTag) is intentionally left in place for a follow-up slice.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 2, 2026 13:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Moves JDK-related MSBuild properties out of xaprepare’s generated Configuration.OperatingSystem.props and into the Java.Interop-generated JdkInfo.props, reducing xaprepare’s responsibility to OS/NDK-related values while keeping the overall Configuration.props import chain intact.

Changes:

  • Import external/Java.Interop/bin/Build$(Configuration)/JdkInfo.props from Configuration.props (when present) and define JDK policy constants (JavaSdkVersion, MinimumSupportedJavaSdkVersion) directly in Configuration.props.
  • Remove JDK placeholders and replacements from the xaprepare Configuration.OperatingSystem.props template and generator.
  • Delete now-dead Microsoft OpenJDK version constants from xaprepare configurables.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

FileDescription
Configuration.propsImports Java.Interop-generated JdkInfo.props and defines JavaSdkVersion / minimum supported JDK policy.
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.csStops emitting JDK-related placeholder replacements for the OS props generator.
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.inRemoves JDK-related properties from the generated OS props template.
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.csRemoves unused JDK version/minimum constants from xaprepare defaults.

Comment threadConfiguration.props
Rubberduck review flagged that removing the six JDK properties from
Configuration.OperatingSystem.props leaves JavaPath, JavaCPath, and JarPath
undefined for consumers that read them directly (e.g.
src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets,
src/java-runtime/java-runtime.targets) between the time xaprepare runs and
when PrepareJavaInterop generates JdkInfo.props, or in downstream builds that
skip full Prepare. Pre-slice xaprepare's OS.cs computed these as
$(JavaSdkDirectory)\bin\{tool}{.exe on Windows}; mirror that logic in
Configuration.props so the properties are always defined. JdkInfo.props still
supplies its own conditional values that win when it's imported.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@jonathanpeppers
jonathanpeppers merged commit 5734d0d into mainJul 2, 2026
42 checks passed
@jonathanpeppers
jonathanpeppers deleted the jonathanpeppers-xaprepare-d1-jdk-side branch July 2, 2026 15:44
simonrozsival pushed a commit that referenced this pull request Jul 3, 2026
…xaprepare project (#11959)
Follow-up to #11956, which moved the JDK half of `Configuration.OperatingSystem.props` to Java.Interop's `JdkInfo.props`. The remaining NDK / OS-info half has zero real consumers, so this PR:
1. Deletes the last generator template (`Configuration.OperatingSystem.props.in`).
2. Cascades through `Step_GenerateFiles`, both `Scenario_*` classes (which now had zero steps), and every supporting `OperatingSystems/`, `Context.*OS.cs`, `EssentialTools.*`, `ToolRunners/*`, `Configurables.*`, `Application/*`, and `Main.cs` file that only existed to feed the scenarios.
3. Deletes the whole `build-tools/xaprepare/` project.
4. Patches every integration point (`Makefile`, `PrepareWindows.targets`, `BuildEverything.mk`, CI YAML, docs) so `build.cmd -t:Prepare` and `make prepare` still work end-to-end.
## `Configuration.OperatingSystem.props.in` placeholder audit
| Placeholder | Consumers outside the `.in` file | Action |
| --- | --- | --- |
| `HostOsName` | none | drop |
| `HostOsFlavor` | none | drop |
| `HostOsRelease` | none | drop |
| `HostBits` | none (`ArchiveBase.HostBits` in `src/Xamarin.Installer.AndroidSDK/` is an unrelated C# property) | drop |
| `NdkLlvmTag` | none (the NDK toolchain OS tag is resolved elsewhere via `_NdkToolchainOSTag` in `androidsdk.targets`) | drop |
| `HostCpuCount` | only `Configuration.props:72` via `$(MakeConcurrency)` | drop |
## `$(MakeConcurrency)` audit
The only definition was `Configuration.props:72`. A repo-wide grep of `.targets`, `.props`, `.projitems`, `Makefile`, and `.mk` files found zero consumers of the MSBuild property. The `MakeConcurrency` hits under `build-tools/xaprepare/` were an unrelated C# `Context.MakeConcurrency` property.
**Result:** dropped the `MakeConcurrency` MSBuild property entirely (no `$([System.Environment]::ProcessorCount)` replacement needed) and removed the `$(MakeConcurrency)` bullet in `Documentation/building/configuration.md`.
## xaprepare integration audit (grep-confirmed, patched here)
| Location | Change |
| --- | --- |
| `build-tools/xaprepare/` (entire tree) | **deleted** — 86 tracked files |
| `Configuration.props` | dropped `<Import>` of the generated OS props, dropped `MakeConcurrency`, tidied the "between xaprepare and package creation tools" comment |
| `.gitignore` | dropped `Configuration.OperatingSystem.props` |
| `build-tools/scripts/PrepareWindows.targets` | removed `_XAPrepareExe`, `_XAPrepareStandardArgs`, `_BuildXAPrepare` target, and the `Exec dotnet $(_XAPrepareExe)` line. Repointed `Prepare` at `_InstallDotNet`. Kept the space-in-path guard, BootstrapTasks / workloads MSBuilds, and `PrepareJavaInterop` |
| `Makefile` | dropped `PREPARE_PROJECT`, `PREPARE_NET_FX`, `PREPARE_ARGS`, `PREPARE_MSBUILD_FLAGS`, `PREPARE_SCENARIO`, `PREPARE_CI_PR`, `PREPARE_CI`, `_PREPARE_CI_MODE_*`, `_PREPARE_ARGS`, and all their conditionals. Dropped the `dotnet run --project xaprepare.csproj` line from `prepare`. Deleted the `prepare-help` target |
| `build-tools/scripts/BuildEverything.mk` | `jenkins` no longer branches on `PREPARE_CI_PR`/`PREPARE_CI`; just `$(MAKE) prepare && $(MAKE) leeroy` |
| `.github/workflows/copilot-setup-steps.yml` | dropped now-unused `PREPARE_CI=1` |
| `build-tools/automation/azure-pipelines-apidocs.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-linux-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-macos-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/commercial-build.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/copy-extra-result-files.yaml` | dropped `**/Configuration.OperatingSystem.props` glob and the stale `Step_CopyExtraResultFilesForCI` xaprepare-step comment |
| `build-tools/automation/yaml-templates/generate-cgmanifest.yaml` | dropped the stale `Step_GenerateCGManifest` xaprepare-step comment |
| `build-tools/automation/yaml-templates/setup-jdk-variables.yaml` | renamed `$xaPrepareJdkPath` → `$xaJdkPath` for hygiene |
| `Documentation/workflow/HowToAddNewApiLevel.md` | rewrote the "Add New Platform" section to point at `<_PlatformPackage>` entries in `src/androidsdk/androidsdk.targets` instead of `AndroidToolchain.cs`; updated the `--android-sdk-platforms=all` recipe to `dotnet-local build src/androidsdk/androidsdk.csproj -p:AndroidSdkPlatforms=all` |
| `Documentation/building/unix/dependencies.md` | JDK-version link now points at `$(MicrosoftOpenJDKVersion)` in `/Configuration.props` instead of the deleted `Configurables.cs` |
| `Documentation/building/configuration.md` | removed the `$(MakeConcurrency)` bullet |
**Historical breadcrumb comments left as-is** (still accurate and useful for git-archaeology):
- `.github/skills/update-tpn/SKILL.md`
- `src/AndroidBuildConfig/AndroidBuildConfig.csproj`
- `src/androidsdk/androidsdk.targets`
- `src/native/cmake-config/cmake-config.csproj`
- `src/workloads/workloads.csproj`
## Verification
- `build.cmd Prepare` — succeeded end-to-end on Windows (0 warnings, 0 errors). The trimmed `Prepare` target ran through `_InstallDotNet`, the space-in-path guard, `Xamarin.Android.BootstrapTasks.sln`, `src/workloads/workloads.csproj`, and `PrepareJavaInterop`.
- `dotnet build src\Xamarin.Android.Build.Tasks\Xamarin.Android.Build.Tasks.csproj -c Debug` — 0 errors (93 pre-existing warnings from `src/Mono.Android/` and generated MCW, unrelated to this change).
- Repo-wide grep for `HostOsName`, `HostOsFlavor`, `HostOsRelease`, `HostCpuCount`, `NdkLlvmTag`, and the MSBuild `MakeConcurrency` property — clean.
- Repo-wide grep for `xaprepare` — clean apart from the five intentional historical breadcrumb comments listed above.
## Diff stat
102 files changed, 25 insertions(+), 7891 deletions(-).
## Precedent chain
Continues the multi-slice teardown started by #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946, #11956.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jonathanpeppers@simonrozsival
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props - #11956

Merged
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side
Jul 2, 2026
Merged

[xaprepare] Move Configuration.OperatingSystem.props JDK values to JdkInfo.props#11956
jonathanpeppers merged 2 commits into
mainfrom
jonathanpeppers-xaprepare-d1-jdk-side

Conversation

@jonathanpeppers

@jonathanpeppersjonathanpeppers commented Jul 2, 2026

Copy link
Copy Markdown
Member

Summary

JDK-related properties are now sourced from Java.Interop's JdkInfo MSBuild task (in-tree since #11744) plus Configuration.props. The Configuration.OperatingSystem.props generator in xaprepare no longer writes any JDK values — only the NDK/OS-info half remains, which will be removed in a follow-up slice.

Changes

  • Configuration.props
    • Imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props immediately after Configuration.OperatingSystem.props. Java.Interop supplies JavaSdkDirectory, JavaPath, JavaCPath, JarPath (plus additional JDK metadata) once Prepare has run.
    • Sets JavaSdkVersion (= $(MicrosoftOpenJDKVersion)) and MinimumSupportedJavaSdkVersion (= 17.0) directly, since JdkInfo.props does not emit those two policy constants.
    • Adds conditional JavaPath, JavaCPath, JarPath fallbacks derived from $(JavaSdkDirectory)\bin\{tool}{.exe on Windows} — mirroring what xaprepare's OS.cs computed pre-slice. This ensures those properties are always defined for consumers that read them directly (e.g. src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets, src/java-runtime/java-runtime.targets, build-tools/create-android-api/create-android-api.csproj) even before PrepareJavaInterop has generated JdkInfo.props. When JdkInfo.props is imported, its conditional values win.
  • build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in — removes JavaSdkVersion, MinimumSupportedJavaSdkVersion, JavaSdkDirectory, JavaCPath, JarPath, JavaPath.
  • build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs — removes the six matching entries from the replacements dictionary.
  • build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs — deletes now-dead MicrosoftOpenJDKVersion (const string + Version field) and MicrosoftMinOpenJDKVersion. Grep confirms zero remaining consumers under build-tools/xaprepare.

OS.JavaHome/JavaCPath/JavaPath/JarPath are intentionally left in place — Windows.cs still uses JavaHome for the JAVA_HOME env var. Removing those OS discovery paths is deferred to the next slice.

Verification

xaprepare build: dotnet build build-tools\xaprepare\xaprepare\xaprepare.csproj -c Debug → 0 warnings, 0 errors.

Effective-value verification — three states via a probe project that imports Configuration.props with AndroidToolchainDirectory=C:\android-toolchain:

Pre-slice equivalent (simulated Configuration.OperatingSystem.props present, no JdkInfo.props):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\jdk-21
JavaCPath=C:\jdk-21\bin\javac.exe
JarPath=C:\jdk-21\bin\jar.exe
JavaPath=C:\jdk-21\bin\java.exe

Post-slice, fresh clone (no Configuration.OperatingSystem.props, no JdkInfo.props — fallbacks fire):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=C:\android-toolchain\jdk-21
JavaCPath=C:\android-toolchain\jdk-21\bin\javac.exe
JarPath=C:\android-toolchain\jdk-21\bin\jar.exe
JavaPath=C:\android-toolchain\jdk-21\bin\java.exe

Post-slice, post-Prepare (with JdkInfo.props supplying real paths):

JavaSdkVersion=21.0.8
MinimumSupportedJavaSdkVersion=17.0
JavaSdkDirectory=D:\real-jdk\jdk-21
JavaCPath=D:\real-jdk\jdk-21\bin\javac.exe
JarPath=D:\real-jdk\jdk-21\bin\jar.exe
JavaPath=D:\real-jdk\jdk-21\bin\java.exe

Grep audit under build-tools/xaprepare/: zero references to @JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @javac@, @java@, @jar@, MicrosoftOpenJDKVersion, or MicrosoftMinOpenJDKVersion remain. @JavaSdkDirectory@ still appears in xaprepare.targets / Properties.Defaults.cs.in — that's the unrelated compile-time replacement in Properties.Defaults.cs, intentionally left alone.

Cold -t:Prepare was not run in this environment (no Android toolchain / network); the fallback logic above ensures behavior is well-defined in every state along the Prepare pipeline.

File list

File+/-
Configuration.props+10
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs−5
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in−6
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs−6

Net: +10 / −17 (−7 LOC).

Precedent

Continues the incremental xaprepare removal in #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946.

…kInfo.props
The last remaining xaprepare generator (Step_GenerateFiles.Get_Configuration_OperatingSystem_props)
substituted six JDK-related placeholders. Since Java.Interop is now in-tree (#11744), its JdkInfo
MSBuild task can supply those values directly.
* Configuration.props now imports external\Java.Interop\bin\Build$(Configuration)\JdkInfo.props
after Configuration.OperatingSystem.props, so downstream projects pick up JavaSdkDirectory,
JavaPath, JavaCPath, and JarPath from Java.Interop.
* JavaSdkVersion and MinimumSupportedJavaSdkVersion (which JdkInfo.props does not provide) are
set directly in Configuration.props alongside the existing MicrosoftOpenJDKVersion property.
* The six JDK placeholders (@JAVA_SDK_VERSION@, @MIN_SUPPORTED_JDK_VERSION@, @JavaSdkDirectory@,
@javac@, @java@, @jar@) are removed from Configuration.OperatingSystem.props.in and from the
Step_GenerateFiles replacements dictionary.
* The now-dead Configurables.MicrosoftOpenJDKVersion (const + Version) and
MicrosoftMinOpenJDKVersion fields are removed. Grep confirmed zero remaining consumers under
build-tools/xaprepare after removing Step_GenerateFiles references.
The NDK/OS-info half of the generator (HostOsName, HostOsFlavor, HostOsRelease, HostCpuCount,
HostBits, NdkLlvmTag) is intentionally left in place for a follow-up slice.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 2, 2026 13:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Moves JDK-related MSBuild properties out of xaprepare’s generated Configuration.OperatingSystem.props and into the Java.Interop-generated JdkInfo.props, reducing xaprepare’s responsibility to OS/NDK-related values while keeping the overall Configuration.props import chain intact.

Changes:

  • Import external/Java.Interop/bin/Build$(Configuration)/JdkInfo.props from Configuration.props (when present) and define JDK policy constants (JavaSdkVersion, MinimumSupportedJavaSdkVersion) directly in Configuration.props.
  • Remove JDK placeholders and replacements from the xaprepare Configuration.OperatingSystem.props template and generator.
  • Delete now-dead Microsoft OpenJDK version constants from xaprepare configurables.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

FileDescription
Configuration.propsImports Java.Interop-generated JdkInfo.props and defines JavaSdkVersion / minimum supported JDK policy.
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.csStops emitting JDK-related placeholder replacements for the OS props generator.
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.inRemoves JDK-related properties from the generated OS props template.
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.csRemoves unused JDK version/minimum constants from xaprepare defaults.

Comment threadConfiguration.props
Rubberduck review flagged that removing the six JDK properties from
Configuration.OperatingSystem.props leaves JavaPath, JavaCPath, and JarPath
undefined for consumers that read them directly (e.g.
src/Mono.Android/Mono.Android.targets, build-tools/scripts/JavaCallableWrappers.targets,
src/java-runtime/java-runtime.targets) between the time xaprepare runs and
when PrepareJavaInterop generates JdkInfo.props, or in downstream builds that
skip full Prepare. Pre-slice xaprepare's OS.cs computed these as
$(JavaSdkDirectory)\bin\{tool}{.exe on Windows}; mirror that logic in
Configuration.props so the properties are always defined. JdkInfo.props still
supplies its own conditional values that win when it's imported.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@jonathanpeppers
jonathanpeppers merged commit 5734d0d into mainJul 2, 2026
42 checks passed
@jonathanpeppers
jonathanpeppers deleted the jonathanpeppers-xaprepare-d1-jdk-side branch July 2, 2026 15:44
simonrozsival pushed a commit that referenced this pull request Jul 3, 2026
…xaprepare project (#11959)
Follow-up to #11956, which moved the JDK half of `Configuration.OperatingSystem.props` to Java.Interop's `JdkInfo.props`. The remaining NDK / OS-info half has zero real consumers, so this PR:
1. Deletes the last generator template (`Configuration.OperatingSystem.props.in`).
2. Cascades through `Step_GenerateFiles`, both `Scenario_*` classes (which now had zero steps), and every supporting `OperatingSystems/`, `Context.*OS.cs`, `EssentialTools.*`, `ToolRunners/*`, `Configurables.*`, `Application/*`, and `Main.cs` file that only existed to feed the scenarios.
3. Deletes the whole `build-tools/xaprepare/` project.
4. Patches every integration point (`Makefile`, `PrepareWindows.targets`, `BuildEverything.mk`, CI YAML, docs) so `build.cmd -t:Prepare` and `make prepare` still work end-to-end.
## `Configuration.OperatingSystem.props.in` placeholder audit
| Placeholder | Consumers outside the `.in` file | Action |
| --- | --- | --- |
| `HostOsName` | none | drop |
| `HostOsFlavor` | none | drop |
| `HostOsRelease` | none | drop |
| `HostBits` | none (`ArchiveBase.HostBits` in `src/Xamarin.Installer.AndroidSDK/` is an unrelated C# property) | drop |
| `NdkLlvmTag` | none (the NDK toolchain OS tag is resolved elsewhere via `_NdkToolchainOSTag` in `androidsdk.targets`) | drop |
| `HostCpuCount` | only `Configuration.props:72` via `$(MakeConcurrency)` | drop |
## `$(MakeConcurrency)` audit
The only definition was `Configuration.props:72`. A repo-wide grep of `.targets`, `.props`, `.projitems`, `Makefile`, and `.mk` files found zero consumers of the MSBuild property. The `MakeConcurrency` hits under `build-tools/xaprepare/` were an unrelated C# `Context.MakeConcurrency` property.
**Result:** dropped the `MakeConcurrency` MSBuild property entirely (no `$([System.Environment]::ProcessorCount)` replacement needed) and removed the `$(MakeConcurrency)` bullet in `Documentation/building/configuration.md`.
## xaprepare integration audit (grep-confirmed, patched here)
| Location | Change |
| --- | --- |
| `build-tools/xaprepare/` (entire tree) | **deleted** — 86 tracked files |
| `Configuration.props` | dropped `<Import>` of the generated OS props, dropped `MakeConcurrency`, tidied the "between xaprepare and package creation tools" comment |
| `.gitignore` | dropped `Configuration.OperatingSystem.props` |
| `build-tools/scripts/PrepareWindows.targets` | removed `_XAPrepareExe`, `_XAPrepareStandardArgs`, `_BuildXAPrepare` target, and the `Exec dotnet $(_XAPrepareExe)` line. Repointed `Prepare` at `_InstallDotNet`. Kept the space-in-path guard, BootstrapTasks / workloads MSBuilds, and `PrepareJavaInterop` |
| `Makefile` | dropped `PREPARE_PROJECT`, `PREPARE_NET_FX`, `PREPARE_ARGS`, `PREPARE_MSBUILD_FLAGS`, `PREPARE_SCENARIO`, `PREPARE_CI_PR`, `PREPARE_CI`, `_PREPARE_CI_MODE_*`, `_PREPARE_ARGS`, and all their conditionals. Dropped the `dotnet run --project xaprepare.csproj` line from `prepare`. Deleted the `prepare-help` target |
| `build-tools/scripts/BuildEverything.mk` | `jenkins` no longer branches on `PREPARE_CI_PR`/`PREPARE_CI`; just `$(MAKE) prepare && $(MAKE) leeroy` |
| `.github/workflows/copilot-setup-steps.yml` | dropped now-unused `PREPARE_CI=1` |
| `build-tools/automation/azure-pipelines-apidocs.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-linux-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/build-macos-steps.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/commercial-build.yaml` | dropped `PREPARE_CI=1` |
| `build-tools/automation/yaml-templates/copy-extra-result-files.yaml` | dropped `**/Configuration.OperatingSystem.props` glob and the stale `Step_CopyExtraResultFilesForCI` xaprepare-step comment |
| `build-tools/automation/yaml-templates/generate-cgmanifest.yaml` | dropped the stale `Step_GenerateCGManifest` xaprepare-step comment |
| `build-tools/automation/yaml-templates/setup-jdk-variables.yaml` | renamed `$xaPrepareJdkPath` → `$xaJdkPath` for hygiene |
| `Documentation/workflow/HowToAddNewApiLevel.md` | rewrote the "Add New Platform" section to point at `<_PlatformPackage>` entries in `src/androidsdk/androidsdk.targets` instead of `AndroidToolchain.cs`; updated the `--android-sdk-platforms=all` recipe to `dotnet-local build src/androidsdk/androidsdk.csproj -p:AndroidSdkPlatforms=all` |
| `Documentation/building/unix/dependencies.md` | JDK-version link now points at `$(MicrosoftOpenJDKVersion)` in `/Configuration.props` instead of the deleted `Configurables.cs` |
| `Documentation/building/configuration.md` | removed the `$(MakeConcurrency)` bullet |
**Historical breadcrumb comments left as-is** (still accurate and useful for git-archaeology):
- `.github/skills/update-tpn/SKILL.md`
- `src/AndroidBuildConfig/AndroidBuildConfig.csproj`
- `src/androidsdk/androidsdk.targets`
- `src/native/cmake-config/cmake-config.csproj`
- `src/workloads/workloads.csproj`
## Verification
- `build.cmd Prepare` — succeeded end-to-end on Windows (0 warnings, 0 errors). The trimmed `Prepare` target ran through `_InstallDotNet`, the space-in-path guard, `Xamarin.Android.BootstrapTasks.sln`, `src/workloads/workloads.csproj`, and `PrepareJavaInterop`.
- `dotnet build src\Xamarin.Android.Build.Tasks\Xamarin.Android.Build.Tasks.csproj -c Debug` — 0 errors (93 pre-existing warnings from `src/Mono.Android/` and generated MCW, unrelated to this change).
- Repo-wide grep for `HostOsName`, `HostOsFlavor`, `HostOsRelease`, `HostCpuCount`, `NdkLlvmTag`, and the MSBuild `MakeConcurrency` property — clean.
- Repo-wide grep for `xaprepare` — clean apart from the five intentional historical breadcrumb comments listed above.
## Diff stat
102 files changed, 25 insertions(+), 7891 deletions(-).
## Precedent chain
Continues the multi-slice teardown started by #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826, #11945, #11946, #11956.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jonathanpeppers@simonrozsival