Skip to content

[xaprepare] Delete redundant Windows JdkInfo.props generator#11946

Merged
jonathanpeppers merged 1 commit into
mainfrom
jonathanpeppers-delete-windows-jdkinfo-gen
Jul 1, 2026
Merged

[xaprepare] Delete redundant Windows JdkInfo.props generator#11946
jonathanpeppers merged 1 commit into
mainfrom
jonathanpeppers-delete-windows-jdkinfo-gen

Conversation

@jonathanpeppers

Copy link
Copy Markdown
Member

Summary

On Windows, xaprepare's Step_GenerateFiles.Windows.cs writes external/Java.Interop/bin/Build$(Configuration)/JdkInfo.props from build-tools/xaprepare/xaprepare/Resources/JdkInfo.Windows.props.in.

But this file is immediately overwritten. The PrepareWindows.targets Prepare flow runs, in order:

  1. dotnet xaprepare -a — writes JdkInfo.props (this code).
  2. MSBuild Xamarin.Android.BootstrapTasks.sln — does not read JdkInfo.props.
  3. MSBuild src/workloads/workloads.csproj — does not read JdkInfo.props.
  4. CallTarget PrepareJavaInteropdotnet build -t:Prepare Java.Interop.slnexternal/Java.Interop/build-tools/scripts/Prepare.targets → runs the JdkInfo MSBuild task → overwrites JdkInfo.props with its own generated content.

Nothing between step 1 and step 4 reads the file, and Java.Interop's Prepare always regenerates it. Now that external/Java.Interop is in-tree, we can safely delete the redundant write.

Files touched

  • Delete build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.Windows.cs
  • Delete build-tools/xaprepare/xaprepare/Resources/JdkInfo.Windows.props.in
  • Edit build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs — drop the partial void AddOSSpecificSteps declaration and collapse GetFilesToGenerate so atBuildStart == false returns null. Ctor surface (atBuildStart, onlyRequired) is unchanged so Scenario_Required.cs is unaffected.
  • Edit build-tools/xaprepare/xaprepare/Scenarios/Scenario_Standard.cs — remove the AddEndSteps override; the only thing it did was schedule the now-empty Step_GenerateFiles(atBuildStart: false).

Preserved (future slices will address these):

  • Get_Configuration_OperatingSystem_props (D1).
  • OperatingSystems/*.cs and Context.OS.* surface.
  • PrepareWindows.targets, DotNet.targets, Java.Interop's Prepare.targets.

Diff: 4 files changed, 5 insertions(+), 82 deletions(-).

Verification

  1. dotnet build build-tools/xaprepare/xaprepare/xaprepare.csproj -c DebugBuild succeeded. 0 Warning(s). 0 Error(s).

  2. build.cmd -t:Prepare -c Debug (Windows, cold tree) — succeeds; external/Java.Interop/bin/BuildDebug/JdkInfo.props exists.

  3. Compare-Object of the resulting JdkInfo.props before vs after this change — byte-identical:

    Baseline SHA256: DE59A8061B7657831788FFED7BC1DEECA442E9181605083A4553DE7AC8C003A1  (1493 bytes)
    After    SHA256: DE59A8061B7657831788FFED7BC1DEECA442E9181605083A4553DE7AC8C003A1  (1493 bytes)
    Compare-Object result: (no differences)
    

    This confirms Java.Interop's overwrite is what always ends up on disk.

  4. Grep audit under build-tools/xaprepare/: no remaining references to Step_GenerateFiles.Windows, JdkInfo.Windows.props.in, or AddOSSpecificSteps.

Related PRs

Follows previous xaprepare deletion slices #11568, #11580, #11608, #11613, #11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821, #11825, #11826.

On Windows, xaprepare's Step_GenerateFiles.Windows.cs writes
external/Java.Interop/bin/Build$(Configuration)/JdkInfo.props from
build-tools/xaprepare/xaprepare/Resources/JdkInfo.Windows.props.in.

But this file is immediately overwritten. The PrepareWindows.targets
Prepare flow runs, in order:

  1. `dotnet xaprepare -a` — writes JdkInfo.props (this code).
  2. `MSBuild Xamarin.Android.BootstrapTasks.sln` — does not read JdkInfo.props.
  3. `MSBuild src/workloads/workloads.csproj` — does not read JdkInfo.props.
  4. `CallTarget PrepareJavaInterop` → `dotnet build -t:Prepare Java.Interop.sln`
     → external/Java.Interop/build-tools/scripts/Prepare.targets → runs the
     `JdkInfo` MSBuild task → overwrites JdkInfo.props with its own generated
     content.

Nothing between step 1 and step 4 reads the file, and Java.Interop's Prepare
always regenerates it. Now that external/Java.Interop is in-tree, we can
safely delete the redundant write.

This is the smallest-diff removal:

  * Delete Step_GenerateFiles.Windows.cs (the AddOSSpecificSteps partial).
  * Delete Resources/JdkInfo.Windows.props.in.
  * In Step_GenerateFiles.cs, drop the `partial void AddOSSpecificSteps`
    declaration and collapse GetFilesToGenerate so `atBuildStart == false`
    returns null. Ctor surface (atBuildStart, onlyRequired) is unchanged so
    Scenario_Required.cs is unaffected.
  * In Scenario_Standard.cs, remove the AddEndSteps override — the only
    thing it did was schedule the now-empty Step_GenerateFiles(atBuildStart:
    false).

Preserved (future slices will address these):
  * Get_Configuration_OperatingSystem_props (D1).
  * OperatingSystems/*.cs and Context.OS.* surface.
  * PrepareWindows.targets, DotNet.targets, Java.Interop's Prepare.targets.

Verification:

  * dotnet build build-tools/xaprepare/xaprepare/xaprepare.csproj -c Debug
    → Build succeeded. 0 Warning(s). 0 Error(s).
  * build.cmd -t:Prepare -c Debug (Windows, cold tree) → succeeds; the file
    external/Java.Interop/bin/BuildDebug/JdkInfo.props exists.
  * Compare-Object of the resulting JdkInfo.props before vs after this
    change → byte-identical (1493 bytes, SHA256
    DE59A8061B7657831788FFED7BC1DEECA442E9181605083A4553DE7AC8C003A1),
    confirming Java.Interop's overwrite is what always ends up on disk.
  * Grep audit under build-tools/xaprepare/: no remaining references to
    Step_GenerateFiles.Windows, JdkInfo.Windows.props.in, or
    AddOSSpecificSteps.

Follows previous xaprepare deletion slices #11568, #11580, #11608, #11613,
#11631, #11731, #11732, #11733, #11737, #11740, #11760, #11803, #11821,
#11825, #11826.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings July 1, 2026 20:17

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

Removes xaprepare’s redundant Windows-only generation of external/Java.Interop/bin/Build$(Configuration)/JdkInfo.props, since Java.Interop’s own Prepare flow reliably regenerates (and overwrites) the file later in the prepare pipeline.

Changes:

  • Deleted the Windows-specific Step_GenerateFiles partial that generated JdkInfo.props.
  • Deleted the corresponding JdkInfo.Windows.props.in template resource.
  • Simplified Step_GenerateFiles and Scenario_Standard to stop scheduling the now-empty “end” generation step and to return null when atBuildStart == false.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

File Description
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.Windows.cs Deleted the Windows-only generator that produced JdkInfo.props.
build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs Removed OS-specific partial plumbing and simplified generation to only run at build start.
build-tools/xaprepare/xaprepare/Scenarios/Scenario_Standard.cs Removed the end-of-scenario Step_GenerateFiles(atBuildStart: false) scheduling.
build-tools/xaprepare/xaprepare/Resources/JdkInfo.Windows.props.in Deleted the unused template that previously fed the Windows generator.

@jonathanpeppers jonathanpeppers enabled auto-merge (squash) July 1, 2026 22:23
@jonathanpeppers jonathanpeppers merged commit e18dc17 into main Jul 1, 2026
43 checks passed
@jonathanpeppers jonathanpeppers deleted the jonathanpeppers-delete-windows-jdkinfo-gen branch July 1, 2026 22:36
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