-
-
Notifications
You must be signed in to change notification settings - Fork 40
Building OpenGlass
- 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.
msbuild OpenGlass.slnx /m /restore /p:Configuration=Release /p:Platform=x64The solution contains shared Host and GUI projects plus two explicit DLL projects:
-
OpenGlass.Legacy.vcxprojfor builds below 28000 -
OpenGlass.MILComp.vcxprojfor 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.
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=ReleasePackaging 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.
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.
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
mainrun the same verification and package the unified unsigned installer and symbol archive; - manual runs expose a
package_artifactsswitch 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.
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.exeOpenGlassRenderTest.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.