Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
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