Understanding the 1500+ projects in the solution file
CMake's FetchContent downloads each dependency's entire source tree and generates Visual Studio projects for everything — including examples, tests, benchmarks, and documentation targets that we never build or use.
The biggest culprit is Eigen — a header-only math library that ships with 1,400+ example programs, each generating its own .vcxproj. None of these are compiled during a normal build.
| Source | What It Is | Projects | Used? |
|---|---|---|---|
| Eigen | Linear algebra (header-only). Projects are examples/tests/demos/BLAS. | 1,462 | 95% unused |
| Catch2 | Unit test framework. 2 libs + build helpers. | 5 | test only |
| GLFW | Window/input library. Main lib + examples. | 5 | 1 used |
| GLAD | OpenGL loader. Single lib + build targets. | 4 | 1 used |
| PortAudio | Cross-platform audio I/O. Static lib + extras. | 2 | 1 used |
| ImGui | Immediate-mode GUI. Compiled as our own static lib. | 0 | via imgui_lib |
| CMake meta | ALL_BUILD, INSTALL, ZERO_CHECK — generated by CMake. | 47 | auto-generated |
| Our code | The actual Modal Synthesis application. | 13 | all used |
| Library | Version | Role | How We Use It |
|---|---|---|---|
| Eigen | 3.4+ | Linear algebra | Sparse matrices (K, M), dense eigensolvers, SimplicialLDLT. Header-only — no .lib is compiled from Eigen itself. |
| CUDA Toolkit | 12.6 | GPU compute | cuSOLVER for dense eigenproblems, custom CUDA kernels for audio synthesis. Not fetched by CMake — system install. |
| GLFW | 3.3+ | Windowing | Creates the OpenGL window, handles keyboard/mouse input. Compiles to glfw3.lib. |
| GLAD | — | GL loader | Loads OpenGL 4.5 function pointers at runtime. Single C file → glad.lib. |
| Dear ImGui | docking | User interface | Toolbar, panels, mode buttons, sliders, charts. Compiled into imgui_lib.lib with GLFW + OpenGL3 backends. |
| PortAudio | — | Audio output | Real-time audio callback at 44.1kHz, 512-sample buffer. Compiles to portaudio_static_x64.lib. |
| Triangle | 1.6 | 2D meshing | Delaunay triangulation of polygons and rings. Single C file compiled directly into modal_lib. |
| Catch2 | 3.x | Testing | Unit test framework. Only linked by tests/ executables, not the main app. |
What actually gets compiled and linked when you build modal_viewer:
Total: 5 static libraries linked. The 1,462 Eigen projects are never compiled — Eigen is header-only. They exist because CMake generates a project for every example in Eigen's source tree.
When you open ModalSynth.sln in Visual Studio, the Solution Explorer shows ~1500 projects. Here's what to collapse/ignore:
| Folder / Project | Action | Why |
|---|---|---|
_deps/eigen-build/ | 🔽 Collapse & ignore | 1,462 examples/tests/demos. Never compiled. |
_deps/catch2-build/ | 🔽 Collapse | Test framework internals. |
_deps/*-subbuild/ | 🔽 Collapse | CMake FetchContent download helpers. |
ALL_BUILD | Ignore | Meta-target that builds everything. |
ZERO_CHECK | Ignore | Triggers CMake reconfigure if CMakeLists changed. |
INSTALL | Ignore | Install target (we don't use install). |
modal_viewer | ⭐ Set as Startup | The main application. |
modal_lib | ⭐ Core library | FEM, synthesis, meshing. |
imgui_lib | ⭐ UI library | Dear ImGui + backends. |
You don't need Visual Studio to build — use the batch files:
These call MSBuild directly on modal_viewer.vcxproj, which builds only the 5 required projects (~30s). Not the 1,500+ unused ones.