There is also another (but rather niche) option - using splits and terminal buffers in Neovim. In the past I used such a configuration on a remote Linux server which, surprisingly, had Neovim installed but neither screen nor tmux.
I would launch nvim, type ':term' and later, in case I needed more terminal windows, I would open another terminal buffer in a split, tab or directly in a current window (':sp | term'/':vsp | term', ':tabnew | term' and ':term' respectively).
Nice one! But I would still recommend invoking a build and an installation via CMake, 'cmake --build .' and 'cmake --install .' respectively, instead of calling 'make' and 'make install' directly. This is just more portable as it provides an uniform abstract commands regardless of a generator used (e.g. 'Unix Makefiles' vs Ninja).
Such an approach is specially useful for additional, top-level, build scripts (like a Python/Bash script calling CMake with all the right parameters/defines for a project) or while integrating an external packaging/dependency management system, like Conan, into a project.