Skip to content

Building OpenGlass

ALTaleX edited this page Aug 24, 2026 · 4 revisions

Building OpenGlass

Prerequisites

  • Visual Studio 2026 with the Desktop development with C++ workload
  • MSVC v145 C++ toolset
  • Windows SDK 10.0
  • Python 3
  • vcpkg manifest integration
  • the repository's NuGet dependencies, including VC-LTL and SourceLink

Run vcpkg integrate install once for the active developer environment.

Solution build

msbuild OpenGlass.slnx /m /restore /p:Configuration=Release /p:Platform=x64

The solution contains shared Host and GUI projects plus two explicit DLL projects:

  • OpenGlass.Legacy.vcxproj for builds below 28000
  • OpenGlass.MILComp.vcxproj for builds 28000 and later

The source tree intentionally keeps ordinary Debug, Release, and ReleaseSigned configurations. Architecture selection is performed by the two DLL projects rather than by configuration-name proliferation.

Output is isolated as follows:

Build\x64\<Configuration>\common\
Build\x64\<Configuration>\legacy\
Build\x64\<Configuration>\milcomp\
Cache\<ProjectName>\x64\<Configuration>\

Host and GUI are built once into common; each architecture receives its own OpenGlass.dll, PDB, generated projection metadata, and intermediates.

Packaging

Inno Setup is optional for ordinary builds. A Release or ReleaseSigned solution build creates one installer containing both architecture DLLs when ISCC.exe is available and reports a nonfatal skip when it is absent. The installer selects and writes only the DLL matching the detected OS build. Set OpenGlassInstallerEnabled=false to suppress packaging explicitly.

Each successful package also creates OpenGlassSymbols.zip. It stores the architecture-specific DLL PDBs as legacy/OpenGlass.pdb and milcomp/OpenGlass.pdb, with the common OpenGlassHost.pdb and OpenGlassGUI.pdb at the archive root.

Build the unified installer explicitly with:

msbuild Scripts/OpenGlass.Packaging.proj /m /p:Configuration=Release

Packaging stages the two DLLs independently under legacy and milcomp, combines them with the common Host and GUI, and embeds both in OpenGlassSetup.exe. They remain separate build products even though they share one installer.

ReleaseSigned

Official releases use ReleaseSigned, which depends on the shared signing environment and uses macros that prevent signature abuse. A signed solution package preserves the original unsigned DLL, Host, and GUI, then creates unsigned OpenGlassSetup.exe from those unsigned files and final OpenGlassSetup.Signed.exe from the signed files. Solution packaging resolves the latest installed Windows SDK x64 signtool.exe when possible and otherwise falls back to PATH; a direct packaging invocation may set OpenGlassSignTool explicitly.

Never mix ReleaseSigned binaries with ordinary Release binaries. A ReleaseSigned Host enforces Authenticode validation for its DLL and, when the Host itself has a valid signature, requires the DLL to have the same signer certificate.

Signing credentials, certificate-provider authentication, formal tags, and GitHub Releases remain part of the controlled manual release process. They are not available to GitHub Actions.

Automated CI

The CI workflow runs on pull requests targeting main, pushes to main, and manual dispatches:

  • pull requests run Python tests, both projection schema validators, a dual-architecture Release build, the non-injecting C++ tests, and output/source-tree checks without packaging;
  • pushes to main run the same verification and package the unified unsigned installer and symbol archive;
  • manual runs expose a package_artifacts switch and package by default.

Packaged runs upload one seven-day Actions artifact named v<OpenGlassProductVersion>-unsigned. It contains exactly:

OpenGlassSetup.exe
OpenGlassSymbols.zip

The workflow verifies that both staged DLLs have the expected architecture description, that the delivery DLLs, Host, GUI, and installer are unsigned, and that the symbol ZIP contains exactly the two architecture-specific OpenGlass.pdb entries plus the common nonempty OpenGlassHost.pdb and OpenGlassGUI.pdb. The artifact name does not create a Git tag or GitHub Release. CI never runs ReleaseSigned or accesses signing credentials.

Tests

python -m unittest discover -s Scripts -p "test_*.py"
python -m unittest discover -s .agents/skills/maintain-dwm-offsets/tests -p "test_*.py"
python Scripts/maintain_symbol_catalog.py verify .
python .agents/skills/maintain-dwm-offsets/scripts/validate_projection_symbols.py . --architecture legacy
python .agents/skills/maintain-dwm-offsets/scripts/validate_projection_symbols.py . --architecture milcomp
msbuild OpenGlassTests/OpenGlassTests.vcxproj /m /p:Configuration=Release /p:Platform=x64
Build\x64\Release\common\OpenGlassTests.exe

OpenGlassRenderTest.exe is an interactive GPU/effect benchmark, not a hermetic automated test. Report separately whether it was built and whether it was exercised manually.

Generated projection files belong only under each project's $(IntDir)\Generated\Projection. Do not edit or commit them.

Clone this wiki locally