Es scheint, als ob CMake in seiner Ansicht fest verankert ist, dass es einen und nur einen CMAKE_CXX_COMPILER für alle C++-Quelldateien geben sollte. Ich kann keine Möglichkeit finden, dies pro Ziel zu überschreiben. Dies macht eine Mischung aus Host- und Cross-Kompilierung in einer einzigen CMakeLists.txt mit den integrierten CMake-Funktionen sehr schwierig.
Meine Frage lautet also: Was ist der beste Weg, mehrere Compiler für dieselbe Sprache (dh C++) zu verwenden?
Mit CMake ist das nicht möglich.
CMake behält nur einen Satz von Compiler-Eigenschaften bei, der von allen Zielen in einer CMakeLists.txt-Datei geteilt wird. Wenn Sie zwei Compiler verwenden möchten, müssen Sie CMake zweimal ausführen. Dies gilt beispielsweise sogar für das Erstellen von 32-Bit- und 64-Bit-Binärdateien aus derselben Compiler-Toolchain.
Der schnelle und schmutzige Weg, dies zu umgehen, ist die Verwendung benutzerdefinierter Befehle. Aber dann landen Sie im Grunde bei verherrlichten Shell-Skripten, was wahrscheinlich nicht das ist, was Sie wollen.
Die saubere Lösung ist: Fügen Sie sie nicht in die gleiche CMakeLists.txt ein! Sie können sowieso keine Verknüpfungen zwischen verschiedenen Architekturen herstellen, sodass sie sich nicht in derselben Datei befinden müssen. Sie können Redundanzen reduzieren, indem Sie gemeinsame Teile der CMake-Skripte in separate Dateien umgestalten und include()
Sie.
Der Hauptnachteil hier ist, dass Sie die Fähigkeit verlieren, mit einem einzigen Befehl zu bauen, aber Sie können das lösen, indem Sie einen Wrapper in Ihrer bevorzugten Skriptsprache schreiben, der sich um den Aufruf der verschiedenen CMake-Makefiles kümmert.
Um die Antwort von @ Bill Hoffman zu erweitern: Erstellen Sie Ihr Projekt als Super-Build, indem Sie eine Art Vorlage wie die hier verwenden https://github.com/Sarcasm/cmake-superbuild
Dadurch werden sowohl die Abhängigkeiten als auch Ihr Projekt als ExternalProject (eigenständige cmake-Konfigurations-/Build-/Installationsumgebung) konfiguriert.