From e845f63d9e2c0d03307c54083fd363ec6d121626 Mon Sep 17 00:00:00 2001 From: bsncubed Date: Sat, 1 Aug 2026 08:14:40 +1000 Subject: [PATCH] Created the windows installer Inno Setup script for a per-user x64 install, plus the icon it uses for setup.exe. The Mesa DLLs are an optional component rather than a default: a local opengl32.dll beats the system one for everything in the same folder, so shipping them unconditionally would force software rendering on machines with a working GPU. Ignore Output/ so the compiled installer stays out of the repo. Co-Authored-By: Claude Opus 5 --- .gitignore | 1 + Inno-compile.iss | 83 ++++++++++++++++++++++++++++++++++++++++++++++ cmd/haul/Icon.ico | Bin 0 -> 16839 bytes 3 files changed, 84 insertions(+) create mode 100644 Inno-compile.iss create mode 100644 cmd/haul/Icon.ico diff --git a/.gitignore b/.gitignore index d0b0bbc..0407457 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /bin/ /dist/ /haul.app/ +/Output/ diff --git a/Inno-compile.iss b/Inno-compile.iss new file mode 100644 index 0000000..c136bf6 --- /dev/null +++ b/Inno-compile.iss @@ -0,0 +1,83 @@ +; Inno Setup script for haul — build with: iscc Inno-compile.iss +; +; Source paths below are relative to this file, so the script compiles from a +; clone of the repo on any machine. Build the binary first: +; +; go build -trimpath -ldflags "-s -w -H=windowsgui" -o bin\haul.exe .\cmd\haul +; +; The optional Mesa component picks up whatever DLLs are sitting in bin\ — see +; "Running over Remote Desktop" in README.md for where to get them. +; +; Non-commercial use only + +#define MyAppName "Haul" +#define MyAppVersion "0.1.0" +#define MyAppPublisher "A Apointless Space" +#define MyAppURL "https://gitea.apointless.space/bsncubed/haul" +#define MyAppExeName "haul.exe" + +[Setup] +; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. +AppId={{E7059C44-7B67-430F-BF2E-6BED87C720B6} +AppName={#MyAppName} +AppVersion={#MyAppVersion} +AppPublisher={#MyAppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +; PrivilegesRequired=lowest makes {autopf} resolve to %LOCALAPPDATA%\Programs, +; which is the per-user equivalent of Program Files. Use the constant rather +; than a literal %LOCALAPPDATA% — Inno does not expand environment variables in +; that form, and would create a folder named "%LOCALAPPDATA%" instead. +DefaultDirName={autopf}\{#MyAppName} +UninstallDisplayIcon={app}\{#MyAppExeName} +; "ArchitecturesAllowed=x64compatible" specifies that Setup cannot run +; on anything but x64 and Windows 11 on Arm. +ArchitecturesAllowed=x64compatible +; "ArchitecturesInstallIn64BitMode=x64compatible" requests that the +; install be done in "64-bit mode" on x64 or Windows 11 on Arm, +; meaning it should use the native 64-bit Program Files directory and +; the 64-bit view of the registry. +ArchitecturesInstallIn64BitMode=x64compatible +DisableProgramGroupPage=yes +; Remove the following line to run in administrative install mode (install for all users). +PrivilegesRequired=lowest +SetupIconFile=cmd\haul\Icon.ico +OutputBaseFilename=haul-{#MyAppVersion}-setup-x64 +Compression=lzma2/max +SolidCompression=yes +WizardStyle=modern + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Types] +Name: "standard"; Description: "Standard installation" +Name: "rdp"; Description: "Remote Desktop / virtual machine (adds software OpenGL)" +Name: "custom"; Description: "Custom installation"; Flags: iscustom + +; A local opengl32.dll always wins over the system one, because Windows searches +; the executable's own directory first — so shipping Mesa unconditionally would +; force software rendering on every machine, including ones with a real GPU. +; Hence it is opt-in, for the RDP/Hyper-V/basic-display case that needs it. +[Components] +Name: "app"; Description: "Haul"; Types: standard rdp custom; Flags: fixed +Name: "mesa"; Description: "Software OpenGL renderer (Mesa llvmpipe)"; Types: rdp + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + +[Files] +Source: "bin\{#MyAppExeName}"; DestDir: "{app}"; Components: app; Flags: ignoreversion +; Wildcard rather than a hand-maintained list: the Mesa distribution's file set +; changes between releases, and a missing entry fails at compile time while a +; stale one silently ships a DLL that no longer loads. +Source: "bin\*.dll"; DestDir: "{app}"; Components: mesa; Flags: ignoreversion +; NOTE: Don't use "Flags: ignoreversion" on any shared system files + +[Icons] +Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" +Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon + +[Run] +Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent diff --git a/cmd/haul/Icon.ico b/cmd/haul/Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f02c0c4168143107dd298d4e3ac4e98b5be37803 GIT binary patch literal 16839 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 Tq?wJrUE+^O)y4mMp!I(Mt@?tf literal 0 HcmV?d00001