feat(windows): Delphi CE interactive build workflow#16044
feat(windows): Delphi CE interactive build workflow#16044MattGyverLee wants to merge 10 commits into
Conversation
User Test ResultsTest specification and instructions ERROR: user tests have not yet been defined |
|
This pull request is from an external repo and will not automatically be built. The build must still be passed before it can be merged. Ask one of the team members to make a manual build of this PR. |
|
Took a hard look at the groupproj-batching path. Sharing the analysis so we can pick the cheapest workable design. Coverage and order — what each groupproj would buy us on CE
So before any other consideration, adopting What
|
|
I had Claude plow through the build and tell me what to do every time I hit an error until I could compile and run everything. I hit all those A-F chicken/egg compile problems above trying to follow the build. I wonder if the CLI version would hit some of the same blockers if it was put onto a fresh new machine, but I can't test that (and don't want to start from scratch again while in "hackathon" mode. I only know it worked on my machine after all the intervening workarounds. |
mcdurdin
left a comment
There was a problem hiding this comment.
There's a lot of redundant and incorrect information in the docs. I think this needs a thorough rework
| * **Keyman 19 (official release)** installed from | ||
| https://keyman.com/desktop. This is *not* optional for Delphi 12 CE | ||
| developers -- the dev kmshell.exe runtime-discovers its install path via | ||
| `TKeymanPaths.KeymanDesktopInstallPath()`, which is hardcoded to | ||
| `C:\Program Files (x86)\Keyman\Keyman Desktop\`. Without the install, | ||
| kmshell crashes at startup with `SKApplicationTitle has had a fatal | ||
| error...` before its main form appears. See section 7 (Running). |
There was a problem hiding this comment.
This doesn't seem right; TKeymanPaths.KeymanDesktopInstallPath() does not hard code this path as it is read from the registry.
To run keyman.exe properly so that it can interact with elevated UI processes (uiAccess=true in the manifest), it needs to be signed with a valid cert, and be installed in a hardened path such as Program Files. But for debugging, you can run keyman.exe unsigned with uiAccess=false, in non-elevated processes. All other components should be runnable outside of Program Files, although there are libraries that have to be located.
There was a problem hiding this comment.
You're right — I hadn't actually followed TKeymanPaths.KeymanDesktopInstallPath() to see where the path comes from. It reads from a registry key the Keyman installer populates, not a hardcoded path. Reworded the §1 prereq (install simplifies setup by populating that key rather than being strictly required) and updated the §7 troubleshooting entry to attribute the failure to the missing registry key. URL corrected to keyman.com/windows.
| installed Developer support files. | ||
| * **7-Zip** (`choco install 7zip`) for extracting the CEF libcef payload. | ||
|
|
||
| ## 2. One-time setup |
There was a problem hiding this comment.
Most of this section should be in windows.md and if that file is not correct, should be corrected; it's best not to duplicate.
There was a problem hiding this comment.
Removed — §2 collapsed to just the CE-specific bits (Library Search Paths registry setup and env vars). Everything else lives in windows.md now.
There was a problem hiding this comment.
Removed — §2 collapsed to just the CE-specific bits (Library Search Paths registry setup and env vars). Everything else lives in windows.md now.
| `common/windows/cef-checkout.sh` normally does this, but if you're driving | ||
| Delphi from the IDE you'll want to do it once by hand. Some payload files | ||
| exceed GitHub's 100 MB limit and ship as `.zip` files inside the repo; they | ||
| must be extracted in place. |
There was a problem hiding this comment.
Why? This doesn't require any Delphi bits in order to be checked out.
There was a problem hiding this comment.
Removed. Wasn't Delphi-specific, shouldn't have been here.
| ### 2.6 Install Keyman 19 official | ||
|
|
||
| Install Keyman 19.0 from https://keyman.com/desktop. After install verify | ||
| `C:\Program Files (x86)\Keyman\Keyman Desktop\kmshell.exe` exists and that | ||
| `HKLM\SOFTWARE\WOW6432Node\Keyman\Keyman Engine` is populated. The overlay | ||
| workflow in section 7 depends on these. |
There was a problem hiding this comment.
This is not right. keyman.com/windows. s/overlay/debugging. The reason for installing Keyman is to simplify the install environment but it is possible to debug without Keyman installed.
There was a problem hiding this comment.
Reworded — install "simplifies setup" rather than "required", and it's possible to debug without an official install. URL corrected to keyman.com/windows. See the TKeymanPaths reply above for the underlying reason.
There was a problem hiding this comment.
Once this PR is clean, I need to test with a full uninstall/rebuild to make sure. It seemed very much to be required to move forward.
| ```powershell | ||
| # Elevated PowerShell -- back up first | ||
| reg export 'HKCU\Software\Embarcadero\BDS\23.0\Library' ` | ||
| C:\Projects\keyman\keyman\delphi-library-paths.backup.reg /y | ||
|
|
||
| $key32 = 'HKCU:\Software\Embarcadero\BDS\23.0\Library\Win32' | ||
| $key64 = 'HKCU:\Software\Embarcadero\BDS\23.0\Library\Win64' | ||
|
|
||
| $paths = @( | ||
| # Keyman common includes (mirrors DELPHIINCLUDES in delphi_flags.inc.sh) | ||
| 'C:\Projects\keyman\keyman\common\windows\delphi\ext\cef4delphi\source', | ||
| 'C:\Projects\keyman\keyman\common\windows\delphi\ext\dcpcrypt', | ||
| 'C:\Projects\keyman\keyman\common\windows\delphi\ext\jwa\Win32API', | ||
| 'C:\Projects\keyman\keyman\common\windows\delphi\ext\sentry', | ||
| 'C:\Projects\keyman\keyman\developer\src\ext\mbcolor', | ||
| 'C:\Projects\keyman\keyman\developer\src\ext\scfontcombobox', | ||
| # JCL / JVCL source roots (needed for TIKE) | ||
| 'C:\Projects\keyman\keyman\developer\src\ext\jedi\jcl\jcl\source\common', | ||
| 'C:\Projects\keyman\keyman\developer\src\ext\jedi\jcl\jcl\source\prototypes', | ||
| 'C:\Projects\keyman\keyman\developer\src\ext\jedi\jcl\jcl\source\vcl', | ||
| 'C:\Projects\keyman\keyman\developer\src\ext\jedi\jcl\jcl\source\windows', | ||
| 'C:\Projects\keyman\keyman\developer\src\ext\jedi\jcl\jcl\source\include', # jcl.inc | ||
| 'C:\Projects\keyman\keyman\developer\src\ext\jedi\jvcl\jvcl\design', | ||
| 'C:\Projects\keyman\keyman\developer\src\ext\jedi\jvcl\jvcl\run', | ||
| 'C:\Projects\keyman\keyman\developer\src\ext\jedi\jvcl\jvcl\common', # jvcl.inc | ||
| 'C:\Projects\keyman\keyman\developer\src\ext\jedi\jvcl\jvcl\resources', # JvConsts.res | ||
| 'C:\Projects\keyman\keyman\developer\src\ext\jedi\jedi', # jedi.inc | ||
| 'C:\Projects\keyman\keyman\developer\src\ext\jedi' # parent for {$I jedi\jedi.inc} | ||
| ) | ||
|
|
||
| foreach ($key in @($key32, $key64)) { | ||
| $cur = (Get-ItemProperty -Path $key -Name 'Search Path' ` | ||
| -ErrorAction SilentlyContinue).'Search Path' | ||
| $merged = (@($cur -split ';') + $paths | | ||
| Where-Object { $_ } | | ||
| Select-Object -Unique) -join ';' | ||
| Set-ItemProperty -Path $key -Name 'Search Path' -Value $merged | ||
| } | ||
| ``` |
There was a problem hiding this comment.
This is fragile because if we make changes to the project the docs will need to be updated so we don't get out of sync. I don't like having this kind of thing twice really.
There was a problem hiding this comment.
Kept the explicit list because when I hit F1026 File not found: jvcl.inc on my first .dproj open, chasing it down took me longer than the recipe took to write — I'd rather leave a working recipe with drift risk than a pointer a future CE contributor has to reconstruct. Added a note that the first six paths mirror DELPHIINCLUDES (verified against the file) and the other eleven don't. Fair on the drift risk though, this is a doc that'll need refreshing if either side changes.
| ### `E2010 Incompatible types: 'Cardinal' and 'Boolean'` (JCL) | ||
|
|
||
| JCL Boolean -> BOOL casts missing. See section 3.4. | ||
|
|
||
| ### `E2003 Undeclared identifier: 'OldCreateOrder'` (JVCL) | ||
|
|
||
| JvComponent.pas not patched. See section 3.5. | ||
|
|
||
| ### `E2003 Undeclared identifier: 'null'` (HTMLColors) | ||
|
|
||
| mbcolor's `mxs.inc` not patched for VER350/VER360 -- the `Variants` unit | ||
| was silently dropped from the `uses` clause. See section 3.6. | ||
|
|
||
| ### `E2029 Declaration expected` near SourceRootPath.pas | ||
|
|
||
| devtools/SourceRootPath.pas hit the `{$ELSE} {$MESSAGE ERROR}` fallback. | ||
| See section 3.7. | ||
|
|
||
| ### `E2012 Type of expression must be BOOLEAN` near EnumFontFamiliesEx | ||
|
|
||
| CleartypeDrawCharacter.pas guard not extended for VER350/VER360. See | ||
| section 3.10. |
There was a problem hiding this comment.
Agreed, false positive from the delphi docs.
There was a problem hiding this comment.
Removed — those were the source-compat error entries. §7 now points to #16043 for source-compat and only troubleshoots CE-specific things.
| ### `SKApplicationTitle has had a fatal error...` on kmshell launch | ||
|
|
||
| kmshell can't find its strings.xml / locale files because | ||
| `KeymanDesktopInstallPath()` is hardcoded to `Program Files`, and Keyman | ||
| 19 official isn't installed (or its install support files were removed by | ||
| an aborted dev experiment). Install Keyman 19 official from keyman.com. |
There was a problem hiding this comment.
hmm don't think this is correct diagnosis
There was a problem hiding this comment.
Fixed per the TKeymanPaths reply above — entry now attributes the failure to the missing registry key rather than a hardcoded path lookup.
|
|
||
| --- | ||
|
|
||
| ## Upstream candidates |
There was a problem hiding this comment.
Removed. That section belonged in PR bodies, not a workflow doc.
| These should *not* be PR'd upstream-Keyman as-is; the bundled third-party | ||
| copies should be refreshed from their respective maintainers instead. | ||
|
|
||
| ## Reverting before a PR |
There was a problem hiding this comment.
Removed. §5's revert step and §3's backup restore already cover it.
| # Local artifacts from the Delphi CE dev workflow (see docs/build/windows-delphi-ce.md) | ||
| /delphi-library-paths.backup*.reg | ||
| /local-delphi-12-patches.patch | ||
| /configure.log | ||
| /core-build.log | ||
| /cpp-engine-build.log | ||
| /install-build-env.log | ||
| /kmcmplib-build.log | ||
| /web-build.log |
There was a problem hiding this comment.
I really don't know where these files come from. They do not seem to be generated
There was a problem hiding this comment.
You were right, they aren't repo-generated — those were leftovers from my local workflow (registry backup, patch file, .log files from wrappers I run outside the repo). Added them because they were cluttering my git status. Removed all of them.
|
Any movement on this @MattGyverLee? We're need to close stale pull requests so please let me know where you plan to take this. |
|
@mcdurdin , looking at this now. |
Pro-tier Delphi 11/12 users had no way to discover the env-var knob introduced by this PR - it was documented only in the PR body and in the CE-workflow doc from keymanapp#16044. Add a short paragraph to the Delphi requirements section pointing at the two Studio path values and reaffirming that the unset default preserves CI behavior. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
Reworked substantively based on your review. Doc dropped from 939 → 253 lines. Trying to map your inline comments to what changed:
Also one thing I got wrong in my own doc and only caught spot-checking after your review: I'd claimed all 17 Library Search Path entries mirror Flagging for scope — this PR also drops |
Lets the existing tree compile under Delphi 11 (VER350) and Delphi 12 (VER360) without breaking Delphi 10.3 (VER330). CI is unchanged: with KEYMAN_DELPHI_VERSION unset, every build script keeps defaulting to Delphi 10.3 (BDS 20.0) exactly as before. This is a bridge to lower contributor friction on keymanapp#4599 (deprecate Delphi). The 10.3 build server can also be upgraded to a paid Delphi 11/12 license on top of these patches if/when that's wanted. Build-script knob: * resources/build/win/configure_environment.inc.sh, resources/build/win/delphi_environment.inc.sh: DELPHI_VERSION now reads ${KEYMAN_DELPHI_VERSION:-20.0}. * resources/builder.inc.sh: builder_describe_platform's delphi tool detection respects the same KEYMAN_DELPHI_VERSION default, so machines with only Delphi 12 installed no longer have win,delphi- gated targets silently skipped. Keyman-owned source compat (additive VER350/VER360 arms; VER330 paths untouched): * common/windows/delphi/tools/devtools/SourceRootPath.pas: teach DelphiMajorVersion about BDS 22.0 / 23.0 install dirs. * common/windows/delphi/web/Keyman.System.HttpServer.Base.pas: extend the IFNDEF VER330 tripwire to accept VER340/350/360. * common/windows/delphi/components/FixedTrackbar.pas: same tripwire extension. * common/windows/delphi/general/CleartypeDrawCharacter.pas: EnumFontFamiliesEx integer-return comparison on VER340/350/360 (was VER340-only). * common/windows/delphi/general/JsonUtil.pas: pass [] options arg to TJSONAncestor.ToChars on VER350/360 (Delphi 11+ added the parameter). Vendored third-party patches (each hunk annotated with a "Keyman local patch" comment plus refresh strategy): * developer/src/ext/jedi/jcl/jcl/source/common/JclSynch.pas: wrap Boolean args to CreateEvent / OpenEvent / CreateWaitableTimer / OpenWaitableTimer / OpenSemaphore / CreateMutex / OpenMutex in explicit BOOL() casts (Delphi 12 tightened implicit Boolean->BOOL at call sites); switch JclWin32.CreateMutex -> Winapi.Windows.CreateMutex to match the file's existing pattern for the other Winapi calls. * developer/src/ext/jedi/jvcl/jvcl/run/JvComponent.pas: on VER350+, unconditionally call DoCreate (Embarcadero removed the OldCreateOrder property in Delphi 11; modern behavior is equivalent to OldCreateOrder=True). * developer/src/ext/mbcolor/mxs.inc: add VER350/VER360 blocks defining DELPHI_5_UP through DELPHI_10_UP. Without these, HTMLColors.pas silently drops Variants from its uses clause and breaks with "Undeclared identifier: 'null'". .gitignore: add patterns for per-arch version*.res and meson wraplock files. Relates-to: keymanapp#4599
Pro-tier Delphi 11/12 users had no way to discover the env-var knob introduced by this PR - it was documented only in the PR body and in the CE-workflow doc from keymanapp#16044. Add a short paragraph to the Delphi requirements section pointing at the two Studio path values and reaffirming that the unset default preserves CI behavior. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Per @mcdurdin's review: he built with unmodified JclSynch.pas and verified the Delphi 12 compile succeeds without the BOOL casts. The patches were defensive against a compile failure I never actually observed on this file — I assumed Delphi 12's tightened implicit-Boolean handling required them without empirically checking. Removing. If a real compile failure on JclSynch shows up later, address it then with a specific error to fix rather than a preemptive patch. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Per @mcdurdin's review: the OldCreateOrder-was-removed premise disagrees with the Athens documentation he linked (https://docwiki.embarcadero.com/Libraries/Athens/en/Vcl.Forms.TForm.OldCreateOrder). Given JclSynch.pas turned out to be an unnecessary defensive patch, this one deserves the same skepticism. Reverting until a specific Delphi 12 compile failure on JVCL surfaces that motivates a targeted fix. The remaining vendored ext patch (mbcolor/mxs.inc) stays because it produces a concrete E2003 Undeclared identifier: 'null' at HTMLColors.pas:290 on Delphi 12 — reproducible, not defensive. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- FixedTrackbar.pas: extend the existing 'Tested on' comment block to note VER350/VER360 IFNDEF arms are added without full verification against Vcl.Grids.pas — same self-documentation pattern @mcdurdin used when he added the 10.3 attestation line in 2019. - HttpServer.Base.pas: extend the pre-existing "may need to check" comment to name the newly-silenced tripwire arms and record that Indy's URL handling on 10.4/11/12 has not been re-verified. The workaround stays applied conservatively rather than removed optimistically. - Drop `.wraplock` .gitignore rule — Meson subproject artifact, no connection to Delphi 11/12 source compat. Scope drift. - windows.md: trim the "so CI is unaffected" tail from the KEYMAN_DELPHI_VERSION paragraph. CI default is a separate concern from the env-var default. Motivated by the same "no unverified defensive extensions" concern that led me to revert the JclSynch and JvComponent patches earlier. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
e58423a to
d0daa8e
Compare
resources/build/minimum-versions.inc.sh pins KEYMAN_MIN_VERSION_EMSCRIPTEN at 3.1.64, but the windows.md walkthrough still told contributors to `emsdk install 3.1.58`. That version now fails to compile core/src/wasm.cpp because a recent Core commit (9909d7d "expose km_core_state_options_update to WASM") uses stricter emscripten pointer-binding APIs. Bumping the docs to match the pin. Discovered while running the CE build walkthrough on this branch. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Lets developers on the free Delphi Community Edition tier build the still-Delphi parts of the tree, even though CE 11+ blocks the dcc32 CLI that build.sh normally drives. None of the compiler / runtime stack moves; this is purely build-environment work plus docs. CI is unchanged. KEYMAN_DELPHI_CE is unset by default, so build.sh keeps invoking msbuild.exe exactly as before. Depends on the Delphi 11/12 source-compat work in a sibling PR — that PR adds the VER350/VER360 IFDEF arms and KEYMAN_DELPHI_VERSION knob needed for the IDE to actually compile. Build-script knob: * resources/build/win/environment.inc.sh: delphi_msbuild() now checks KEYMAN_DELPHI_CE=1. When set, it prints an IDE-build prompt naming the .dproj and waits for Enter instead of running msbuild.exe. The pre-build (rc.exe) and post-build (binary copy, codegen) steps in build.sh run normally around the prompt, so the developer only has to drive the Delphi compile by hand. Docs: * docs/build/windows.md: one-line pointer to windows-delphi-ce.md from the existing "Delphi 10.3 CE no longer available" warning, so future CE users find the workaround instead of dead-ending. * docs/build/windows-delphi-ce.md: ~940-line guide -- prerequisites, registry library-path setup, source patches required on the sibling branch, the canonical build order (including the tsysinfox64 -> .bin -> tsysinfo_x64.res chicken-and-egg), install-and-overlay workflow, debugging, and a troubleshooting catalog. Written against Delphi 12 Athens CE specifically (currently the only free tier); Delphi 11 CE works with the same approach modulo a couple of paths. engine.groupproj fix (independent of the Delphi work but unblocks IDE "Build All", which CE users rely on): * windows/src/engine/engine.groupproj: drop the inst\insthelper reference. The path doesn't resolve -- insthelper.dproj lives at windows/src/engine/insthelper, not .../inst/insthelper -- and IDE "Build All" was failing on it. build.sh-based builds were never affected because they don't walk the groupproj. .gitignore: add patterns for the per-script log files that the CE workflow writes (configure.log, core-build.log, etc.). Relates-to: keymanapp#4599
Address @mcdurdin's "redundant and incorrect information" review. Drop 836 lines. Trim scope to what this PR actually introduces (KEYMAN_DELPHI_CE=1 interactive prompt) plus the CE-specific prerequisites the standard windows.md doesn't cover: - Remove content that belongs in PR keymanapp#16043 (the source-compat patches for JCL, JVCL, mbcolor, SourceRootPath, HttpServer, FixedTrackbar, CleartypeDraw, JsonUtil). Point readers there. - Delete the pre-PR engine.groupproj / insthelper workaround section - this PR removes that reference, so the workaround no longer applies to trees on this branch. - Drop internal memory-system references ([[double-bracket-wiki]]) that would render as literal text on GitHub. - Fix the VER340->'21.0' factual error (it's Delphi 10.4's real Studio path, not a CE-license rev bump). - Collapse duplicated content: uiAccess/kmshell-path explanation, install-Keyman-19 step, revert-before-PR warning, .res file handling, engine.groupproj discussion. - Fix broken cross-references to "section 5.2 step (a)/(b)" and "BSD block" that had no matching structure. - Consolidate build order and shell workflow into one section. - Convert the a-f cross-project dependency graph into a table for scanability. Doc now ~270 lines vs. 939. Scope matches the PR: what KEYMAN_DELPHI_CE=1 does, plus the CE-only setup (Library Search Paths, Keyman 19 install requirement, dependency ordering under IDE prompts). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Working through the inline comments that the initial rework didn't already resolve: - Fix TKeymanPaths.KeymanDesktopInstallPath() explanation: the path is read from a registry key the installer populates, not hardcoded. Reword the prereq accordingly and the corresponding troubleshooting entry. - Soften "Keyman 19 required" to "strongly recommended". It is possible to debug without an official install; the install just simplifies the setup by giving you a working system to overlay onto. Also fix the URL (keyman.com/windows, not /desktop). - Switch env-var setup to SETX to match the style used throughout windows.md. - Replace the manual PowerShell manifest.in patch with `./build.sh debug-manifest`, which swaps in the pre-existing debug-manifest.in template that already exists for this purpose. - Fix dependency (e) failure description: the runtime failure appears when launching Keyman, not on enable-keyboard. - Trim the debugging section: drop the incorrect claim about symbol behavior and note that C++/Delphi cross-stepping is out of scope (windbg territory). - Drop the canonical numbered build order - the script prompts the developer in the right order already, the list was redundant. - Drop §8 "reverting before a PR" - covered by the §5 revert note and §3 backup restore. - Remove the local-workflow entries from .gitignore (delphi-library-paths.backup*.reg, local-delphi-12-patches.patch, the six *.log entries). These files aren't generated by any repo script - they were leftovers from my local build workflow. Doc now ~245 lines vs. 272 in the first rework, ~939 originally. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- §3 registry recipe: only the first six paths mirror DELPHIINCLUDES in delphi_flags.inc.sh (verified: that variable defines exactly those six). The remaining eleven JCL/JVCL/jedi paths are IDE-only and have no equivalent in the CLI build path; my earlier claim that all seventeen mirror DELPHIINCLUDES was wrong. - Replace two "see PR keymanapp#16043" references with pointers to windows.md's Delphi requirements section, which will remain the canonical entry point after 16043 merges (PR-number cross-refs age badly). - §6 debugging: add one-line acknowledgment that the content isn't CE-specific but has no other current home, per review feedback that the section drifts from the doc's stated scope. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
d0daa8e to
223c2f8
Compare
|
This PR currently includes all the commits from #16043. Can you rebase onto master so we can look at just the changes for this PR? |
Summary
Lets developers on the free Delphi Community Edition tier build the still-Delphi parts of the tree, even though CE 11+ deliberately blocks the
dcc32CLI thatbuild.shnormally drives. None of the compiler / runtime stack moves; this is purely build-environment work plus docs.CI is unchanged.
KEYMAN_DELPHI_CEis unset by default, sobuild.shkeeps invokingmsbuild.exeexactly as before.Split off from #16039 per @mcdurdin's review — that PR bundled the CE workflow with the Delphi 11/12 source-compat patches. This PR is the CE half; the compat half is #16043.
Depends on #16043 for the source-compat patches and the
KEYMAN_DELPHI_VERSIONknob that lets the IDE find Delphi 11/12.Why this matters for the Delphi removal roadmap
Delphi 10.3 Pro is no longer obtainable, and CE 10.3 has been removed from Embarcadero's downloads. New contributors who want to help finish #4599 currently hit a wall: they can install CE 12, but CE blocks
dcc32andbuild.shfalls over before reaching any Delphi project. This PR fixes the wall — without committing to keep Delphi alive.What's in the change
1. CE-aware
delphi_msbuildresources/build/win/environment.inc.sh:delphi_msbuild()now checksKEYMAN_DELPHI_CE. When=1, it prints an IDE-build prompt naming the.dprojand waits for Enter instead of invokingmsbuild.exe. The pre-build (rc.exe, manifest gen) and post-build (binary copy, codegen) steps inbuild.shrun normally around the prompt, so the developer only has to drive the Delphi compile by hand.This is the approach @mcdurdin proposed in #16039 (comment) — gate by version in the existing shell script rather than parallel PowerShell helpers.
2. Docs
docs/build/windows.md: one-line pointer towindows-delphi-ce.mdfrom the existing "Delphi 10.3 CE no longer available" warning, so future CE users find the workaround instead of dead-ending.docs/build/windows-delphi-ce.md: ~940-line guide — prerequisites, registry library-path setup, source patches required on chore(windows): Delphi 11/12 source compatibility #16043, the canonical build order (including thetsysinfox64->.bin->tsysinfo_x64.reschicken-and-egg), install-and-overlay workflow, debugging, troubleshooting catalog, and a section labeling which patches are safe to upstream. Written against Delphi 12 Athens CE specifically (currently the only free tier); Delphi 11 CE works with the same approach modulo a couple of paths.3.
engine.groupprojfixwindows/src/engine/engine.groupproj: drop theinst\insthelperreference. The path doesn't resolve —insthelper.dprojlives atwindows/src/engine/insthelper, not.../inst/insthelper— and IDE "Build All" was failing on it.build.sh-based builds were never affected because they don't walk the groupproj.Technically independent of the CE work, but bundled here because IDE "Build All" is the path CE users actually exercise. Happy to split into its own PR if reviewers prefer.
4.
.gitignorePatterns for the per-script log files that the CE workflow writes (
configure.log,core-build.log, etc.).Reviewer notes
if [[ "${KEYMAN_DELPHI_CE:-}" == "1" ]]branch indelphi_msbuild(). Everything else is docs / .gitignore / the orthogonalengine.groupprojcleanup.KEYMAN_DELPHI_CE=1 ./build.sh.windows-delphi-ce.md(notwindows-d12.md) so the same workflow guide applies if/when a future Delphi 11 CE user shows up; the body is Delphi 12-specific because that's what's been actually tested.User Testing
User testing not required: build-environment / docs change with no runtime behaviour modification. CI will exercise the non-CE default path (
KEYMAN_DELPHI_CEunset); the CE flow is manually validated via the steps indocs/build/windows-delphi-ce.md.Relates-to
Relates-to: #4599
Depends-on: #16043
Replaces: #16039 (split into #16043 + this PR)