The SKIRT code must be compatible with various C/C++ compilers (Clang, GCC, Intel) using different run-time libraries on various operating systems (macOS, Linux, Windows). Moreover, each of these tools are updated regularly, potentially introducing changes. Even with a strictly standardized C/C++ language, it turns out that there are subtle differences between the various compilers and runtime systems.
For example, a standard library header often indirectly includes one or more other standard library headers. This behavior is not documented and may differ between library implementations. As a result, a source file may compile successfully on one system (because a certain header is indirectly included) while it fails to compile on another system (because that header is not included). The problem is easily fixed by explictly including the missing header, but it is very hard to detect it without testing on a large number of compiler implementations.
Another annoying issue is related to the warnings generated by various compilers. The SKIRT design rules dictate that, with the compiler settings configured by the CMake build procedure, the code should compile without warnings. However, compiler implementations differ, and sometimes new compiler versions support new warning types because the internal logic has become better at detecting potential problems at compile time. Often the extra warnings can be avoided with small code changes. Alternatively, the compiler settings in the build procedure can be updated to suppress the warnings.
The SKIRT repository on GitHub has been configured with several actions that run whenever a new pull request is created (or a new commit is pushed to a pull request). These actions compile and build the SKIRT code using virtual machines on the GitHub server with various operating system and compiler combinations. These actions form a first important check that the code still works on multiple systems. However, it is obviously not feasible to include all possible compiler and system combinations. Furthermore, these actions don't include the MPI and MakeUp build options.
For more information, look inside the hidden .github/workflows directory in the SKIRT repository and refer to the GitHub documentation.
While the GitHub action mechanism is wonderful for detecting unexpected issues, it is not practical to debug and fix compiler issues this way because each compilation attempt requires a new commit to the repository. Also, there is limited flexibility in the available compiler and operating system versions.
An excellent alternative for the administrator is to use a virtual machine emulator on the local computer. It should be fairly straightfoward to install multiple operating system and compiler combinations, each inside their own virtual machine.
A great virtual machine emulator for macOS is Parallels Desktop (https://www.parallels.com/), however this is commercial software with a subscription fee. Other, free options may be VirtualBox or VMware.