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 689cf78956db2284c5a49b194f9a12088e0da71e Author: Peter <[email protected]> AuthorDate: Thu Oct 8 09:43:51 2026 +0200 build(desktop): ship unopkg as upstream's .com/.exe/.bin, and let the launchers start program/ now has upstream's three files for unopkg, each of which finds the next by its own filename: unopkg.com (unopkgio) -> unopkg.exe (guiloader) -> unopkg.bin (the tool). Before, the tool itself was staged as unopkg.exe and the front ends under their build names, so the .com's console-to-UTF-16 input conversion was unreachable. crashrep.com (guistdio) is produced the same way. The names are made by copy_file at the producing package; staging accepts .bin and .com. Every small EXE in desktop, and crashrep.exe, now embeds the VC90 manifest on the winXP builds. All of them link /MD with /MANIFEST:NO, so on winXP-x86 and winXP-x64 fifteen of them -- the swriter/scalc/... launchers, quickstart, rebaseoo, rebasegui, unoinfo, the loaders and crashrep -- died at load with a System Error box. The win10 build gets no VC90 manifest, unopkg included: its runtime is not side-by-side. Co-Authored-By: Claude Opus 5.5 <[email protected]> --- main/crashrep/BUILD.bazel | 18 +++++- main/desktop/BUILD.bazel | 118 +++++++++++++++++++++++++++------- main/staging/collect_files_aspect.bzl | 4 +- 3 files changed, 112 insertions(+), 28 deletions(-) diff --git a/main/crashrep/BUILD.bazel b/main/crashrep/BUILD.bazel index 4c75696c1f..b9df9b03f8 100644 --- a/main/crashrep/BUILD.bazel +++ b/main/crashrep/BUILD.bazel @@ -88,6 +88,20 @@ _COPTS = [ "/D_INPATH=\\\"wntmsci9\\\"", ] +# VC9 runtime manifest at RT_MANIFEST id 1, winXP builds only -- the same +# select as the small EXEs in //main/desktop, which explains it. Without it +# crashrep.exe died at load with a "System Error" box, i.e. a crash produced a +# second failure instead of a report. +_VC90_MANIFEST_INPUTS = select({ + "//build/constraints:is_win10": [], + "//conditions:default": ["//main/external/msvcp90:vc90_app_manifest_res"], +}) + +_VC90_MANIFEST_LINKOPTS = select({ + "//build/constraints:is_win10": [], + "//conditions:default": ["$(execpath //main/external/msvcp90:vc90_app_manifest_res)"], +}) + # ── crashrep.exe — Windows GUI crash reporter (= soreport.exe in dmake) ────── # d.lst delivers soreport.exe as bin/crashrep.exe; naming the target "crashrep" # achieves the rename without a post-build step. @@ -107,7 +121,7 @@ cc_binary( additional_linker_inputs = [ ":soreport_res", "//main/sal:sal_implib", - ], + ] + _VC90_MANIFEST_INPUTS, linkopts = [ "$(execpath :soreport_res)", "$(execpath //main/sal:sal_implib)", @@ -122,7 +136,7 @@ cc_binary( "psapi.lib", "/SUBSYSTEM:WINDOWS", "/MANIFEST:NO", - ], + ] + _VC90_MANIFEST_LINKOPTS, deps = [ "//main/sal:sal_headers", "//main/stlport:stlport", diff --git a/main/desktop/BUILD.bazel b/main/desktop/BUILD.bazel index 7ffd93048b..02daf6ebfb 100644 --- a/main/desktop/BUILD.bazel +++ b/main/desktop/BUILD.bazel @@ -1,5 +1,6 @@ package(default_visibility = ["//visibility:public"]) +load("@bazel_skylib//rules:copy_file.bzl", "copy_file") load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library") load("//build/rules:rsc_pipeline.bzl", "rsc_res") load("//build/rules:gtest_test.bzl", "gtest_test") @@ -788,11 +789,13 @@ cc_binary( ":unopkgapp", # Launcher / helper EXEs shipped alongside soffice.exe ":officeloader", - ":guiloader", ":unoinfo", - ":guistdio", - ":unopkgio", - ":unopkg", + # Under their installed names only -- guiloader, guistdio and unopkgio + # are never shipped under their build names (desktop/prj/d.lst). + ":unopkg_com", + ":unopkg_exe", + ":unopkg_bin", + ":crashrep_com", ":swriter", ":scalc", ":sdraw", @@ -807,6 +810,25 @@ cc_binary( visibility = ["//visibility:public"], ) +# ── VC9 runtime manifest for the small EXEs ─────────────────────────────────── +# Every EXE below links /MD and /MANIFEST:NO. Under VC9 the CRT is a +# side-by-side assembly: without a manifest naming Microsoft.VC90.CRT the +# loader never consults WinSxS, MSVCR90.dll is unresolvable, and the process +# dies before main() with a "System Error" box (0xC0000135). dmake embedded a +# manifest into every EXE with mt.exe; here it is linked in as a .res at +# RT_MANIFEST id 1. The modern toolchain's runtime is not side-by-side, so a +# win10 build gets nothing -- a VC90 manifest there would demand an assembly +# the image never uses. +_VC90_MANIFEST_INPUTS = select({ + "//build/constraints:is_win10": [], + "//conditions:default": ["//main/external/msvcp90:vc90_app_manifest_res"], +}) + +_VC90_MANIFEST_LINKOPTS = select({ + "//build/constraints:is_win10": [], + "//conditions:default": ["$(execpath //main/external/msvcp90:vc90_app_manifest_res)"], +}) + # ── officeloader.exe ────────────────────────────────────────────────────────── # Bootstrap loader (delivered as soffice.exe in the final install) cc_binary( @@ -829,7 +851,8 @@ cc_binary( "advapi32.lib", "shell32.lib", "shlwapi.lib", "user32.lib", "/SUBSYSTEM:WINDOWS", "/MANIFEST:NO", - ], + ] + _VC90_MANIFEST_LINKOPTS, + additional_linker_inputs = _VC90_MANIFEST_INPUTS, visibility = ["//visibility:public"], ) @@ -858,7 +881,8 @@ cc_binary( "shlwapi.lib", "user32.lib", "/SUBSYSTEM:WINDOWS", "/MANIFEST:NO", - ], + ] + _VC90_MANIFEST_LINKOPTS, + additional_linker_inputs = _VC90_MANIFEST_INPUTS, visibility = ["//visibility:public"], ) @@ -882,7 +906,8 @@ cc_binary( linkopts = [ "/SUBSYSTEM:CONSOLE", "/MANIFEST:NO", - ], + ] + _VC90_MANIFEST_LINKOPTS, + additional_linker_inputs = _VC90_MANIFEST_INPUTS, visibility = ["//visibility:public"], ) @@ -904,7 +929,8 @@ cc_binary( "user32.lib", "/SUBSYSTEM:CONSOLE", "/MANIFEST:NO", - ], + ] + _VC90_MANIFEST_LINKOPTS, + additional_linker_inputs = _VC90_MANIFEST_INPUTS, visibility = ["//visibility:public"], ) @@ -925,12 +951,15 @@ cc_binary( linkopts = [ "/SUBSYSTEM:CONSOLE", "/MANIFEST:NO", - ], + ] + _VC90_MANIFEST_LINKOPTS, + additional_linker_inputs = _VC90_MANIFEST_INPUTS, visibility = ["//visibility:public"], ) -# ── unopkg.exe ──────────────────────────────────────────────────────────────── -# Thin bootstrap loader that calls unopkg_main() from unopkgapp.dll +# ── unopkg.exe → program/unopkg.bin ────────────────────────────────────────── +# Thin bootstrap that calls unopkg_main() from unopkgapp.dll. Upstream ships it +# as unopkg.bin behind two front ends (see "unopkg front ends" below); staging +# takes it from :unopkg_bin under that name, never under its build name. cc_binary( name = "unopkg", srcs = ["source/pkgchk/unopkg/unopkg_main.c"], @@ -943,27 +972,62 @@ cc_binary( "SUPD=680", ], deps = ["//main/sal:sal_headers"], - # The VC90-CRT manifest at RT_MANIFEST id 1, as uno-skeletonmaker carries - # it. Staging installs this exe AS program/unopkg.exe (upstream's - # unopkg.bin, behind a guiloader unopkg.exe) and stages no external - # unopkg.exe.manifest, so without it the /MD CRT is unresolvable and the - # process dies at load with 0xC0000135 before running a line -- every - # `unopkg add/list/remove` failed silently that way. additional_linker_inputs = [ - "//main/external/msvcp90:vc90_app_manifest_res", "//main/sal:sal_implib", ":unopkgapp_implib", - ], + ] + _VC90_MANIFEST_INPUTS, linkopts = [ - "$(execpath //main/external/msvcp90:vc90_app_manifest_res)", "$(execpath //main/sal:sal_implib)", "$(execpath :unopkgapp_implib)", "/SUBSYSTEM:WINDOWS", "/MANIFEST:NO", - ], + ] + _VC90_MANIFEST_LINKOPTS, visibility = ["//visibility:public"], ) +# ── unopkg front ends ───────────────────────────────────────────────────────── +# Upstream installs THREE files for one tool (desktop/prj/d.lst, scp2 +# common_brand.scp), and each finds the next by its OWN filename: +# unopkg.com = unopkgio.exe console wrapper; guistdio.inc swaps its .COM +# for .EXE and relays stdin/stdout/stderr +# unopkg.exe = guiloader.exe extendLoaderEnvironment() swaps .exe for .bin +# unopkg.bin = :unopkg the tool +# So the names are the lookup keys and are produced here, at the producing +# package, not by a staging rename table. Typed at a console, `unopkg` +# resolves to unopkg.COM (PATHEXT puts .COM before .EXE), which is the point: +# unopkg.bin is a /SUBSYSTEM:WINDOWS image whose output reaches a console only +# through the .com's pipes. The copies live under brand/ so that unopkg.exe +# does not collide with :unopkg's own output in this package. +copy_file( + name = "unopkg_com", + src = ":unopkgio", + out = "brand/unopkg.com", + is_executable = True, +) + +copy_file( + name = "unopkg_exe", + src = ":guiloader", + out = "brand/unopkg.exe", + is_executable = True, +) + +copy_file( + name = "unopkg_bin", + src = ":unopkg", + out = "brand/unopkg.bin", + is_executable = True, +) + +# crashrep.com — same trick for the crash reporter (scp2 file_crashrep.scp): +# guistdio.exe renamed, which starts crashrep.exe beside it. +copy_file( + name = "crashrep_com", + src = ":guistdio", + out = "brand/crashrep.com", + is_executable = True, +) + # ── Application launcher EXEs (swriter, scalc, etc.) ───────────────────────── [cc_binary( name = app, @@ -985,7 +1049,8 @@ cc_binary( "user32.lib", "/SUBSYSTEM:WINDOWS", "/MANIFEST:NO", - ], + ] + _VC90_MANIFEST_LINKOPTS, + additional_linker_inputs = _VC90_MANIFEST_INPUTS, visibility = ["//visibility:public"], ) for app in ["swriter", "scalc", "sdraw", "simpress", "sbase", "smath", "sweb"]] @@ -1011,7 +1076,8 @@ cc_binary( "shell32.lib", "imagehlp.lib", "user32.lib", "/SUBSYSTEM:WINDOWS", "/MANIFEST:NO", - ], + ] + _VC90_MANIFEST_LINKOPTS, + additional_linker_inputs = _VC90_MANIFEST_INPUTS, visibility = ["//visibility:public"], ) @@ -1037,7 +1103,8 @@ cc_binary( "shell32.lib", "imagehlp.lib", "user32.lib", "/SUBSYSTEM:WINDOWS", "/MANIFEST:NO", - ], + ] + _VC90_MANIFEST_LINKOPTS, + additional_linker_inputs = _VC90_MANIFEST_INPUTS, visibility = ["//visibility:public"], ) @@ -1064,7 +1131,8 @@ cc_binary( "oleaut32.lib", "comdlg32.lib", "kernel32.lib", "uuid.lib", "/SUBSYSTEM:WINDOWS", "/MANIFEST:NO", - ], + ] + _VC90_MANIFEST_LINKOPTS, + additional_linker_inputs = _VC90_MANIFEST_INPUTS, visibility = ["//visibility:public"], ) diff --git a/main/staging/collect_files_aspect.bzl b/main/staging/collect_files_aspect.bzl index 23f222c10b..d16c4ed32e 100644 --- a/main/staging/collect_files_aspect.bzl +++ b/main/staging/collect_files_aspect.bzl @@ -112,7 +112,9 @@ res_stage = rule( # "pyd": Python extension modules. Python 2.7's importer accepts ONLY this # suffix on Windows (Python/dynload_win.c), so pyuno ships as pyuno.pyd; without # it here the file is collected but silently dropped on the way to program/. -_INSTALL_EXTS = {"exe": True, "dll": True, "pyd": True, "rdb": True, "zip": True, "py": True, "ini": True, "manifest": True} +# "bin"/"com": unopkg.bin, unopkg.com and crashrep.com, the launcher front ends +# //main/desktop produces under their installed names (see unopkg_com there). +_INSTALL_EXTS = {"exe": True, "dll": True, "pyd": True, "rdb": True, "zip": True, "py": True, "ini": True, "manifest": True, "bin": True, "com": True} def _flat_install_impl(ctx): all_files = depset(transitive = [
