2012-03-03 17 views
18

Sembra che CMake sia abbastanza radicato nella sua visione che ci dovrebbe essere uno e solo uno, CMAKE_CXX_COMPILER per tutti i file di origine C++. Non riesco a trovare un modo per ignorarlo in base al target. Ciò rende molto difficile la combinazione di compilazione host-and-cross in un singolo CMakeList.txt con le funzionalità CMake integrate.Utilizzo di CMake con più compilatori per la stessa lingua

Quindi, la mia domanda è: qual è il modo migliore per utilizzare più compilatori per lo stesso linguaggio (cioè C++)?

risposta

12

È impossibile farlo con CMake.

CMake conserva solo un set di proprietà del compilatore condiviso da tutte le destinazioni in un file CMakeLists.txt. Se si desidera utilizzare due compilatori, è necessario eseguire CMake due volte. Questo è vero anche per es. costruire binari a 32 bit e 64 bit dalla stessa toolchain del compilatore.

Il modo più semplice e intuitivo è utilizzare comandi personalizzati. Ma poi finisci con quelli che sono fondamentalmente glorificati script di shell, che probabilmente non è quello che vuoi.

La soluzione pulita è: non inserirli nello stesso CMakeLists.txt! Non è comunque possibile collegare tra diverse architetture, quindi non è necessario che si trovino nello stesso file. È possibile ridurre le ridondanze rielaborando parti comuni degli script di CMake in file separati e include().

Lo svantaggio principale qui è che si perde la possibilità di creare con un singolo comando, ma è possibile risolverlo scrivendo un wrapper nel proprio linguaggio di scripting preferito che si occupa di chiamare i diversi makefile CMake.

+2

Sembra che add_directory (altra_build_kind_folder) sia una possibilità, al contrario di creare un wrapper personalizzato, poiché è quello che ho fatto e sembra funzionare. :-) – cdleary

+2

@cdleary Potresti chiarire come funziona? In che modo 'add_subdirectory' (o intendevi veramente add_directory'?) Ti permette di cambiare toolchain? –

+1

Wow, questo è davvero un pessimo design ... –

0

Per estendere la risposta di @ Bill Hoffman: genera il progetto come un super-build, utilizzando una sorta di modello come quello qui https://github.com/Sarcasm/cmake-superbuild che configura sia le dipendenze che il progetto come ExternalProject (ambiente di configurazione/build/installazione standalone cmake).

Problemi correlati