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
 

Reply via email to