Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
2f871f5
pwiz: Fixed four vendor readers failing from an installer-based install
chambm Sep 4, 2026
ed2e1bc
pwiz: Added a vendor-bundled installer variant for offline installs
chambm Sep 4, 2026
d8e7bd7
pwiz: Fixed a failed installer build being reported as a successful C…
chambm Sep 4, 2026
f1f64f3
pwiz: Stopped staging Linux vendor binaries into the Windows installer
chambm Sep 8, 2026
3aea566
pwiz: Fixed Agilent failing from an installer-based install on a clea…
chambm Sep 9, 2026
72c4c95
pwiz: Ported msdiff, which the container sweep needs to validate conv…
chambm Sep 10, 2026
63c80f3
pwiz: Triggered the net10 container from changed paths instead of by …
chambm Sep 10, 2026
df584a8
pwiz: Added reference mzML generation to the pwiz-sharp test harness
chambm Sep 11, 2026
5ab98c7
pwiz: Stopped triggering the last cpp build config from master changes
chambm Sep 11, 2026
7e340b3
pwiz: Recorded the index range in reference mzMLs so a subset says so…
chambm Sep 11, 2026
fd37438
pwiz: Moved the container's msconvert sweep into scripts/container/tc…
chambm Sep 11, 2026
b589704
pwiz: Moved the Agilent Cecil patch out of the build and into the SDK…
chambm Sep 11, 2026
c5a01f3
Merge remote-tracking branch 'origin/Skyline/work/20260612_net8_port'…
chambm Sep 11, 2026
a902059
pwiz: Added the sweep's flags to the container config's tctest.sh step
chambm Sep 11, 2026
8a9831b
pwiz: Scoped the CI triggers for the sweep script and the vendor arch…
chambm Sep 11, 2026
031d0ee
pwiz: Updated two Sciex references the index-range recording had inva…
chambm Sep 11, 2026
5dcaf2c
pwiz: Excluded the vendor method builder tests from the container's S…
chambm Sep 14, 2026
00c164c
pwiz: Shared one Sciex data provider per wiff across concurrent readers
chambm Sep 14, 2026
4b88eea
Revert "pwiz: Shared one Sciex data provider per wiff across concurre…
chambm Sep 14, 2026
7597c09
pwiz: Built the Sciex data provider through DataProviderFactory, as c…
chambm Sep 14, 2026
b55ef7f
pwiz: Dropped a redundant long-path prefix before handing a path to S…
chambm Sep 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 26 additions & 4 deletions pwiz-sharp/build.bat
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ REM #
REM # Usage:
REM # build.bat [Debug|Release] [--i-agree-to-the-vendor-licenses]
REM # [--require-vendor-support] [--without-mascot]
REM # [--automated] [--coverage]
REM # [--automated] [--coverage] [--with-vendor-sdks]
REM #
REM # Flags:
REM # --i-agree-to-the-vendor-licenses
Expand All @@ -23,6 +23,16 @@ REM # Fail the build if vendor support isn't enabled. Use in CI to make
REM # sure --i-agree was passed, instead of silently building a stripped
REM # artifact.
REM #
REM # --with-vendor-sdks
REM # Also produce ProteoWizard-WithVendorSdks-Setup-<ver>.exe: the
REM # bundled-runtime installer plus every Windows vendor SDK, extracted
REM # into VendorSdkLoader's cache. That build needs no network at run
REM # time (it carries the .NET runtime too), which is what the wine
REM # container needs. Costs ~30 s and ~26 MB over the default variants,
REM # so it is opt-in here and passed by tcbuild.bat on CI. No effect
REM # without --i-agree-to-the-vendor-licenses: the whole installer step
REM # is skipped in that case.
REM #
REM # --without-mascot
REM # Disable Mascot (.dat) support in BiblioSpec. msparser is bundled
REM # under libraries\msparser_3_1_0_x86_win64\, so Mascot support is ON
Expand Down Expand Up @@ -60,6 +70,7 @@ set REQUIRE_VENDOR=0
set AUTOMATED=0
set COVERAGE=0
set WITHOUT_MASCOT=0
set WITH_VENDOR_SDKS=0
set ERROR_TEXT=

REM # Parse args. First non-flag arg is the configuration (Debug|Release).
Expand All @@ -68,6 +79,7 @@ if "%~1"=="" goto endparse
if /i "%~1"=="--i-agree-to-the-vendor-licenses" (set IAGREE=1) else ^
if /i "%~1"=="--require-vendor-support" (set REQUIRE_VENDOR=1) else ^
if /i "%~1"=="--without-mascot" (set WITHOUT_MASCOT=1) else ^
if /i "%~1"=="--with-vendor-sdks" (set WITH_VENDOR_SDKS=1) else ^
if /i "%~1"=="--automated" (set AUTOMATED=1) else ^
if /i "%~1"=="--coverage" (set COVERAGE=1) else ^
if /i "%~1"=="Debug" (set CONFIG=Debug) else ^
Expand Down Expand Up @@ -136,10 +148,20 @@ if %IAGREE%==1 (
if exist "%ProgramFiles%\Inno Setup 6\ISCC.exe" set HAVE_ISCC=1
if exist "%ProgramFiles(x86)%\Inno Setup 6\ISCC.exe" set HAVE_ISCC=1
if !HAVE_ISCC!==1 (
echo ##teamcity[progressMessage 'installer/build.ps1 -SkipBuild ^(uses Release artifacts^)']
pwsh -NoProfile -ExecutionPolicy Bypass -File "%SCRIPT_DIR%\installer\build.ps1" -SkipBuild
set INSTALLER_ARGS=-SkipBuild
if !WITH_VENDOR_SDKS!==1 set INSTALLER_ARGS=!INSTALLER_ARGS! -WithVendorSdks
echo ##teamcity[progressMessage 'installer/build.ps1 !INSTALLER_ARGS! ^(uses Release artifacts^)']
pwsh -NoProfile -ExecutionPolicy Bypass -File "%SCRIPT_DIR%\installer\build.ps1" !INSTALLER_ARGS!
REM # Fatal, not a warning. Reaching here means ISCC IS present -- the machine
REM # that lacks it took the else branch below -- so a failure is a real one.
REM # Downgrading it produced a false green: the installer never got built,
REM # Installer.Tests then went Inconclusive on "no ProteoWizard-Setup-*.exe
REM # found" and reported "Test Run Successful ... Skipped: 2", and the build
REM # went green with the vendor-resolution coverage silently not run.
if !ERRORLEVEL! NEQ 0 (
echo ##teamcity[message text='installer build failed; Installer.Tests will skip' status='WARNING']
set EXIT=!ERRORLEVEL!
set ERROR_TEXT=installer/build.ps1 failed; Installer.Tests cannot run
goto error
)
) else (
echo ##teamcity[message text='Inno Setup ^(ISCC.exe^) not found; skipping installer build and Installer.Tests will skip' status='WARNING']
Expand Down
31 changes: 26 additions & 5 deletions pwiz-sharp/build/vendor-sdk-pins.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,18 @@
"copy instead of pwiz_aux/msrc/utility/vendor_api_Bruker.7z: the upstream archive is",
"shared with the C++ build, which still wants CompassXtract in the same archive."
],
"$comment2": [
"BaseCommon / BaseDataAccess / BaseError / BaseTof are deliberately NOT here. They are",
"Agilent MHDAC assemblies and this archive holds none of them (it ships exactly two",
"DLLs: baf2sql_c and timsdata). Listing them here broke Agilent from every",
"installer-based install: FindPin returns the FIRST pin whose prefix matches, Bruker",
"precedes Agilent, so a BaseCommon bind resolved to this archive and failed with",
"'extracted cleanly but contains no BaseCommon.dll'. Dev and CI builds never saw it",
"because they keep the vendor DLLs app-local, which the resolver prefers over the cache."
],
"path": "pwiz-sharp/vendor-archives/vendor_api_Bruker.7z",
"prefixes": [
"Bruker.", "BaseDataAccess", "ProtocolBuffers", "BaseError", "BaseCommon", "BaseTof",
"timsdata", "baf2sql", "mcd_lib"
"Bruker.", "ProtocolBuffers", "timsdata", "baf2sql", "mcd_lib"
]
},
{
Expand Down Expand Up @@ -76,10 +84,16 @@
},
{
"name": "Agilent",
"$comment": [
"MIDAC has no trailing dot on purpose. Prefixes are matched with StartsWith against the",
"assembly simple name, and this archive's assembly is plain 'MIDAC', which never starts",
"with 'MIDAC.' - so the dotted form silently matched nothing and Agilent failed one",
"assembly later than the BaseCommon collision, with 'Could not load MIDAC'."
],
"path": "pwiz_aux/msrc/utility/vendor_api_Agilent.7z",
"prefixes": [
"Agilent.", "BaseDataAccess", "MIDAC.", "Mhdac.", "MassHunter.", "MassSpecDataReader",
"agtsampleinforw"
"Agilent.", "BaseCommon", "BaseDataAccess", "BaseError", "BaseTof", "MIDAC", "Mhdac.",
"MassHunter.", "MassSpecDataReader", "agtsampleinforw"
]
},
{
Expand All @@ -102,8 +116,15 @@
},
{
"name": "Mobilion",
"$comment": [
"MobilionShim is deliberately NOT a prefix here. It is pwiz-sharp's own shim assembly,",
"built from src/Vendor/Mobilion, not something this archive carries (the archive holds",
"MBI_SDK.dll and its headers). Listing it made the installer's staging filter strip a",
"binary nothing could then supply, so Mobilion failed from every installer-based install",
"with 'archive contains no library matching MobilionShim.dll'."
],
"path": "pwiz_aux/msrc/utility/vendor_api_Mobilion.7z",
"prefixes": [ "Mobilion.", "MBISDK", "MBI_SDK", "MobilionShim" ]
"prefixes": [ "Mobilion.", "MBISDK", "MBI_SDK" ]
}
]
}
84 changes: 73 additions & 11 deletions pwiz-sharp/installer/Setup.iss
Original file line number Diff line number Diff line change
@@ -1,24 +1,31 @@
; -----------------------------------------------------------------------------
; Inno Setup script for ProteoWizard-Sharp.
; Inno Setup script for ProteoWizard.
;
; build.ps1 invokes ISCC twice from this one script to produce two variants:
; build.ps1 invokes ISCC from this one script to produce up to three variants:
;
; ProteoWizard-Sharp-Setup.exe (~62 MB)
; ProteoWizard-Setup.exe (~78 MB)
; Bundles the .NET 10 Desktop Runtime installer. On install, checks for
; .NET 10; if missing, silently invokes the bundled runtime installer
; (which triggers UAC for its per-machine install).
;
; ProteoWizard-Sharp-NoNetRuntime-Setup.exe (~5 MB)
; ProteoWizard-NoNetRuntime-Setup.exe (~22 MB)
; Same payload minus the bundled runtime. On install, aborts with a
; dialog + download link if .NET 10 isn't already present. For users
; who manage their own runtime install (corp deployments, dev boxes
; that already have it, etc.).
;
; ProteoWizard-WithVendorSdks-Setup.exe (~104 MB, opt-in: build.ps1 -WithVendorSdks)
; The bundled-runtime variant PLUS every Windows vendor SDK, pre-extracted
; into VendorSdkLoader's cache. Carries the .NET runtime too -- the name
; says only what it adds over the default variant, not what it inherits.
; Nothing it needs is fetched at run time, so it is the one to use where
; there is no network: an offline site install, or the wine container.
;
; Both variants:
; - Ask the user to pick "for me" (per-user, no admin) or "for everyone"
; (per-machine, admin) at install time
; - Install to %LOCALAPPDATA%\Programs\ProteoWizard-Sharp\ or
; %ProgramFiles%\ProteoWizard-Sharp\ accordingly
; - Install to %LOCALAPPDATA%\Programs\ProteoWizard\ or
; %ProgramFiles%\ProteoWizard\ accordingly
; - Create Start Menu shortcuts for MSConvertGUI and SeeMS
; - Register Windows Explorer right-click verbs
; - Standard uninstall via Programs and Features
Expand All @@ -35,7 +42,7 @@
; `winget install JRSoftware.InnoSetup`).
; -----------------------------------------------------------------------------

#define MyAppName "ProteoWizard-Sharp"
#define MyAppName "ProteoWizard"
; Version comes in from build.ps1 via /DMyAppVersion=4.0.YYDOY-gitsha. The
; fallback below keeps direct ISCC invocations buildable for local debugging.
#ifndef MyAppVersion
Expand All @@ -53,7 +60,13 @@
#define OutputDir "build"
#endif
#ifndef OutputBaseFilename
#define OutputBaseFilename "ProteoWizard-Sharp-Setup"
#define OutputBaseFilename "ProteoWizard-Setup"
#endif
; WithVendorSdks: bundle the vendor SDKs and pre-populate VendorSdkLoader's cache, so the
; installed app never reaches raw.githubusercontent.com. build.ps1 -WithVendorSdks sets this
; and points VendorCacheDir at a tree it extracted into the runtime's own cache layout.
#ifndef VendorCacheDir
#define VendorCacheDir "build\vendor-cache"
#endif

[Setup]
Expand All @@ -64,7 +77,7 @@
; own uninstaller log. Same-version reinstalls still upgrade in place.
;
; The base GUID stays stable so future migration code (or scripts iterating
; "all ProteoWizard-Sharp installs") can match on the prefix.
; "all ProteoWizard installs") can match on the prefix.
;
; Shared resources policy (last-installed-wins, no automatic cleanup):
; - Explorer context-menu verbs are SHARED across versions: each install
Expand Down Expand Up @@ -138,6 +151,24 @@ Source: "cache\windowsdesktop-runtime-10.0-win-x64.exe"; DestDir: "{tmp}"; \
Flags: deleteafterinstall; Check: not IsDotNetDesktopInstalled
#endif

#ifdef WithVendorSdks
; Vendor SDKs, pre-extracted by build.ps1 into exactly the layout
; VendorSdkLoader.EnsureExtracted would have produced on first use — one
; <Vendor>-<ShortSha> directory per pin, flattened, each holding a .ok marker.
; The marker is the whole point: with it present the loader neither downloads
; nor extracts, so the app works offline and needs no write access to the cache.
;
; Destination is {commonappdata}, not {localappdata}: one copy shared by every
; user on the machine, which is what the cache-root override below is for.
;
; uninsneveruninstall because the cache is keyed by SDK version, not by app
; version, so side-by-side pwiz-sharp installs share these directories — the
; same last-installed-wins / leave-it-alone policy the Explorer verbs use.
Comment on lines +164 to +166
; Removing every version therefore leaves the cache behind on purpose.
Source: "{#VendorCacheDir}\*"; DestDir: "{commonappdata}\ProteoWizard\vendor"; \
Flags: ignoreversion recursesubdirs createallsubdirs uninsneveruninstall
#endif

[Icons]
Name: "{group}\MSConvertGUI"; Filename: "{app}\MSConvertGUI-sharp.exe"; \
WorkingDir: "{app}"; Tasks: startmenu_msconvertgui; \
Expand Down Expand Up @@ -285,6 +316,37 @@ begin
end;
end;

#ifdef WithVendorSdks
{ ----- Point VendorSdkLoader at the bundled cache -----
The loader's default cache root is %LOCALAPPDATA%\ProteoWizard\vendor, but this
variant installs one shared copy under %PROGRAMDATA%. GetCacheRoot() reads a path
out of %PROGRAMDATA%\ProteoWizard\vendor-cache-root.txt when that file exists, so
writing it is what makes the bundled cache the one the app actually consults.
Without this the SDKs would sit on disk unused and the app would still try to
download them.

ProgramData is writable by standard users for new subdirectories, so this works
for a per-user install too; if it ever does not, failing loudly beats installing
a cache nothing reads. }
procedure StampVendorCacheRoot();
var
dir: String;
begin
dir := ExpandConstant('{commonappdata}\ProteoWizard');
if not ForceDirectories(dir) then
RaiseException('Could not create ' + dir);
if not SaveStringToFile(dir + '\vendor-cache-root.txt',
ExpandConstant('{commonappdata}\ProteoWizard\vendor'), False) then
RaiseException('Could not write vendor-cache-root.txt in ' + dir);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
StampVendorCacheRoot();
end;
#endif

{ ----- Pre-flight check (NoNetRuntime variant only) -----
When this installer was built without the bundled .NET runtime
(build.ps1's second ISCC pass), we can't install .NET ourselves. Abort
Expand All @@ -302,9 +364,9 @@ begin
if not IsDotNetDesktopInstalled() then
begin
rc := MsgBox(
'ProteoWizard-Sharp requires the .NET 10 Desktop Runtime (x64), which is not installed on this machine.' + #13#10#13#10 +
'ProteoWizard requires the .NET 10 Desktop Runtime (x64), which is not installed on this machine.' + #13#10#13#10 +
'Click OK to open the Microsoft download page in your browser, then re-run this installer after installing the runtime.' + #13#10#13#10 +
'If you prefer an installer that bundles the runtime, use ProteoWizard-Sharp-Setup.exe instead.',
'If you prefer an installer that bundles the runtime, use ProteoWizard-Setup.exe instead.',
mbError, MB_OKCANCEL);
if rc = IDOK then
ShellExec('', 'https://dotnet.microsoft.com/download/dotnet/10.0/runtime',
Expand Down
8 changes: 4 additions & 4 deletions pwiz-sharp/installer/build-linux.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
# Mirrors the Windows pipeline and its two-variant split:
#
# Windows Linux
# ProteoWizard-Sharp-Setup-<ver>.exe ProteoWizard-Sharp-linux-x64-<ver>.tar.gz
# ProteoWizard-Setup-<ver>.exe ProteoWizard-linux-x64-<ver>.tar.gz
# bundles the .NET desktop runtime self-contained: the runtime is IN the payload
# ProteoWizard-Sharp-NoNetRuntime-Setup-<ver>.exe ProteoWizard-Sharp-NoNetRuntime-linux-x64-<ver>.tar.gz
# ProteoWizard-NoNetRuntime-Setup-<ver>.exe ProteoWizard-NoNetRuntime-linux-x64-<ver>.tar.gz
# needs .NET 8 already installed framework-dependent: same requirement
#
# "Setup" is dropped for the runtime identifier because a tarball is not an installer; the
Expand Down Expand Up @@ -139,8 +139,8 @@ package() {
}

RC=0
package self-contained true "ProteoWizard-Sharp-$RID-$APP_VERSION" || RC=1
package framework-dependent false "ProteoWizard-Sharp-NoNetRuntime-$RID-$APP_VERSION" || RC=1
package self-contained true "ProteoWizard-$RID-$APP_VERSION" || RC=1
package framework-dependent false "ProteoWizard-NoNetRuntime-$RID-$APP_VERSION" || RC=1

# Same side-car build.ps1 writes, so packaging tests can pin the version without re-deriving it
# from a filename.
Expand Down
Loading
Loading