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

@jonathanpeppers jonathanpeppers 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>
Copilot AI review requested due to automatic review settings July 2, 2026 13:08

Copilot AI 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.

File Description
Configuration.props Imports Java.Interop-generated JdkInfo.props and defines JavaSdkVersion / minimum supported JDK policy.
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs Stops emitting JDK-related placeholder replacements for the OS props generator.
build-tools/xaprepare/xaprepare/Resources/Configuration.OperatingSystem.props.in Removes JDK-related properties from the generated OS props template.
build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs Removes unused JDK version/minimum constants from xaprepare defaults.

Comment thread Configuration.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 main Jul 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants