This is an automated email from the ASF dual-hosted git repository. leginee pushed a commit to branch bazel-migration in repository https://gitbox.apache.org/repos/asf/openoffice.git
commit 954df93df432a663942f4f750144997a615697b9 Author: Peter <[email protected]> AuthorDate: Thu Oct 8 09:43:52 2026 +0200 docs: the unopkg front-end chain, and the VC90 manifest every EXE needs Co-Authored-By: Claude Opus 5.5 <[email protected]> --- .agent/common/20-build-conventions.md | 9 +++++++++ .agent/migration/frontier.md | 11 +++++++++-- main/desktop/readme.md | 35 +++++++++++++++++++++++++++++++---- main/swext/README.md | 8 +++++--- 4 files changed, 54 insertions(+), 9 deletions(-) diff --git a/.agent/common/20-build-conventions.md b/.agent/common/20-build-conventions.md index 3d12062ba8..b1b6eddd9c 100644 --- a/.agent/common/20-build-conventions.md +++ b/.agent/common/20-build-conventions.md @@ -44,6 +44,15 @@ → same "loading component library failed" class as fileacc/uui. To reach upstream parity (cosmetic): apply .uno infix in the link/staging step AND regenerate services.rdb together so both sides move in lockstep. Left as-is for the en-US demo. +- EVERY staged /MD EXE needs the VC90 manifest on the winXP builds, embedded at + RT_MANIFEST id 1 (`//main/external/msvcp90:vc90_app_manifest_res` in + additional_linker_inputs + linkopts), gated off with + `//build/constraints:is_win10` (the modern runtime is not side-by-side). + Without it a `/MANIFEST:NO` EXE dies before main() with a "System Error" box, + and nothing in the build notices -- 15 launchers sat broken that way until + 2026-10-08. Audit a staged tree: dumpbin /dependents shows MSVCR90.dll, and + the file contains neither the string `Microsoft.VC90.CRT` nor a sibling + `<name>.manifest`. Pattern: `_VC90_MANIFEST_INPUTS` in main/desktop/BUILD.bazel. - IDL pipeline: tools link /MD (dynamic CRT); stage msvcr90/msvcp90 DLLs + external .manifest files alongside EXEs (no mt.exe embedding); use ctx.actions.symlink (pure Bazel, no shell) for staging diff --git a/.agent/migration/frontier.md b/.agent/migration/frontier.md index ff8380d4ad..4932d9b376 100644 --- a/.agent/migration/frontier.md +++ b/.agent/migration/frontier.md @@ -916,8 +916,15 @@ swext ✅ DONE 2026-10-03 — wiki-publisher.oxt (//main/swext:wiki-pub URE_MORE_* chain recurses = startup stack overflow 0xC00000FD. TEST LANDMINES: headless + fresh -env:UserInstallation exits 0 in seconds unless -nofirststartwizard; unopkg's license answer must be - UTF-16LE on stdin (8-bit "yes" loops forever, 200+ MB). Still open: - unopkg.com (unopkgio.exe staged under its build name). + UTF-16LE on stdin (8-bit "yes" loops forever, 200+ MB) -- or go + through unopkg.com, which converts. unopkg.com/.exe/.bin + triad DONE 2026-10-08 (verified all 3 configs: oxt installs + via `echo yes| unopkg.com add`, 12 parts registered). FOUND + ALONG THE WAY: 15 EXEs could not start at all on winXP-x86/ + x64 -- swriter/scalc/... launchers, quickstart, crashrep, + rebaseoo/gui, unoinfo, the loaders -- /MD + /MANIFEST:NO, no + VC90 manifest => "System Error" box before main(). Now + embedded, winXP only. See main/desktop/readme.md. See main/swext/README.md. unodevtools ✅ MIGRATED 2026-08-18 and MOVED OUT of this bucket — it is not Java and never was. `uno-skeletonmaker.exe`, 9 C++ sources, no diff --git a/main/desktop/readme.md b/main/desktop/readme.md index 01fe802fb7..8f2e18eb02 100644 --- a/main/desktop/readme.md +++ b/main/desktop/readme.md @@ -15,10 +15,12 @@ | `//main/desktop:unopkgapp` | `unopkgapp.dll` | Package manager app DLL; exports `unopkg_main` | | `//main/desktop:soffice` | `soffice.exe` | Main OOo launcher EXE | | `//main/desktop:officeloader` | `officeloader.exe` | Bootstrap loader (delivered as soffice.exe) | -| `//main/desktop:guiloader` | `guiloader.exe` | Generic GUI loader (also: unopkg.exe, testtool.exe) | -| `//main/desktop:guistdio` | `guistdio.exe` | Console stdio bridge (also: crashrep.com) | -| `//main/desktop:unopkgio` | `unopkgio.exe` | Package manager console bridge (also: unopkg.com) | -| `//main/desktop:unopkg` | `unopkg.exe` | Package manager launcher | +| `//main/desktop:guiloader` | `guiloader.exe` | Generic GUI loader; staged only as `unopkg.exe` | +| `//main/desktop:guistdio` | `guistdio.exe` | Console stdio bridge; staged only as `crashrep.com` | +| `//main/desktop:unopkgio` | `unopkgio.exe` | Package manager console bridge; staged only as `unopkg.com` | +| `//main/desktop:unopkg` | `unopkg.exe` | The package manager itself; staged only as `unopkg.bin` | +| `//main/desktop:unopkg_com` / `unopkg_exe` / `unopkg_bin` | `brand/unopkg.{com,exe,bin}` | The three installed files of `unopkg` (copies, see below) | +| `//main/desktop:crashrep_com` | `brand/crashrep.com` | Console front end of `crashrep.exe` | | `//main/desktop:unoinfo` | `unoinfo.exe` | UNO environment info | | `//main/desktop:swriter` | `swriter.exe` | Writer app launcher | | `//main/desktop:scalc` | `scalc.exe` | Calc app launcher | @@ -33,6 +35,31 @@ ## Key migration notes +- **unopkg is three files, and each finds the next by its own filename** + (`prj/d.lst`, scp2 `common_brand.scp`): `unopkg.com` (unopkgio) swaps `.COM` + for `.EXE` and relays stdio; `unopkg.exe` (guiloader) swaps `.exe` for `.bin`; + `unopkg.bin` is the tool. So the names are produced here with `copy_file` + (under `brand/`, to not collide with `:unopkg`'s own `unopkg.exe`), and + soffice's `data` lists only those. Until 2026-10-08 staging shipped the tool + itself as `unopkg.exe` with the front ends under their build names. What the + `.com` adds is real, not cosmetic: its input thread converts console-code-page + input to UTF-16, so `echo yes| unopkg.com add x.oxt` accepts a license, where + `unopkg.bin` alone needs UTF-16LE on stdin. Its OUTPUT goes through + `WriteConsoleW` only, so redirected `unopkg.com` output is always empty + (upstream too) -- capture output from `unopkg.bin` instead. `crashrep.com` + (guistdio) is the same trick for `crashrep.exe`. + +- **Every small EXE embeds the VC9 manifest on the winXP builds** + (`_VC90_MANIFEST_INPUTS`/`_LINKOPTS`, RT_MANIFEST id 1, gated off on + `//build/constraints:is_win10`). All of them link `/MD` + `/MANIFEST:NO`; + without a manifest naming Microsoft.VC90.CRT the loader never consults + WinSxS and the process dies before `main()` with a "System Error" box. Until + 2026-10-08 that was true of swriter/scalc/sdraw/simpress/sbase/smath/sweb, + quickstart, rebaseoo, rebasegui, unoinfo, officeloader, guiloader, guistdio + and unopkgio (and crashrep.exe in //main/crashrep) -- only soffice.exe, which + has an external manifest, and unopkg had one. dmake embedded one into every + EXE with mt.exe. The win10 build needs none: its runtime is not side-by-side. + - **Deployment sub-libs**: `deployment_manager_lib`, `deployment_registry_lib`, and 7 registry backend libs all compile with `alwayslink = True` and are linked into `deployment.uno.dll`. `dp_services.cxx` declares `extern` symbols referencing each backend so the linker pulls them. diff --git a/main/swext/README.md b/main/swext/README.md index 7ea4927c25..47dd167638 100644 --- a/main/swext/README.md +++ b/main/swext/README.md @@ -111,9 +111,11 @@ Each one alone made any extension with a Java component unusable: missing `unorc` falls back to `fundamental.ini` and would recurse into a stack overflow at startup. -Not fixed: upstream's `unopkg.com` console wrapper (`unopkgio.exe`) is staged -under its build name, and `unopkg.exe` is upstream's `unopkg.bin` (no guiloader -in front), so console output reaches only a redirected handle. +Since 2026-10-08 `program/` has upstream's three files -- `unopkg.com` -> +`unopkg.exe` (guiloader) -> `unopkg.bin` -- so `echo yes| unopkg.com add +wiki-publisher.oxt` accepts the license with plain 8-bit input (verified on all +three configs). See main/desktop/readme.md for how the chain works and why +`unopkg.com`'s output cannot be redirected. ### Testing it
