Separating external dependencies based on the technology (e.g. threads, mpi, gpu, etc.) and make them optional
By separating external dependencies based on the technology (e.g. threads, mpi, gpu, etc.) it becomes possible to make them optional during CMake configuration/build and prevent extra times for configuring/building when it's not necessary.