Non sovrascrivere CMAKE_C_COMPILER
, ma esportare CC
(e CXX
) prima di chiamare cmake:
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
L'esportazione deve essere eseguita solo una volta, la prima volta che si configura il progetto, quindi quei valori verranno letti dalla cache di CMake.
AGGIORNAMENTO : spiegazione più lunga sul perché non sovrascrivere CMAKE_C(XX)_COMPILER
dopo il commento di Jake
Raccomando di non sovrascrivere il CMAKE_C(XX)_COMPILER
valore per due motivi principali: perché non funziona bene con la cache di CMake e perché interrompe i controlli del compilatore e il rilevamento degli strumenti.
Quando si utilizza il set
comando, sono disponibili tre opzioni:
- senza cache, per creare una variabile normale
- con cache, per creare una variabile memorizzata nella cache
- forza cache, per forzare sempre il valore della cache durante la configurazione
Vediamo cosa succede per le tre possibili chiamate a set
:
Senza cache
set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
Quando si esegue questa operazione, si crea una variabile "normale" CMAKE_C(XX)_COMPILER
che nasconde la variabile cache con lo stesso nome. Ciò significa che il tuo compilatore è ora hardcoded nello script di build e non puoi assegnargli un valore personalizzato. Questo sarà un problema se hai più ambienti di compilazione con compilatori diversi. Potresti semplicemente aggiornare lo script ogni volta che desideri utilizzare un compilatore diverso, ma ciò rimuove il valore dell'utilizzo di CMake in primo luogo.
Ok, allora, aggiorniamo la cache ...
Con cache
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")
Questa versione semplicemente "non funzionerà". La CMAKE_C(XX)_COMPILER
variabile è già nella cache, quindi non verrà aggiornata a meno che non venga forzata.
Ah ... usiamo la forza, allora ...
Forza cache
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)
Questa è quasi la stessa della versione variabile "normale", l'unica differenza è che il tuo valore verrà impostato nella cache, in modo che gli utenti possano vederlo. Ma qualsiasi modifica verrà sovrascritta dal set
comando.
Rompere i controlli e gli strumenti del compilatore
All'inizio del processo di configurazione, CMake esegue controlli sul compilatore: funziona? È in grado di produrre eseguibili? ecc. Utilizza anche il compilatore per rilevare strumenti correlati, come ar
e ranlib
. Quando si sovrascrive il valore del compilatore in uno script, è "troppo tardi", tutti i controlli e i rilevamenti sono già stati eseguiti.
Ad esempio, sulla mia macchina con gcc come compilatore predefinito, quando si utilizza il set
comando su /usr/bin/clang
, ar
è impostato su /usr/bin/gcc-ar-7
. Quando si utilizza un'esportazione prima di eseguire CMake, è impostata su /usr/lib/llvm-3.8/bin/llvm-ar
.
/opt
piuttosto che in/usr/local
. Preferibilmente/opt/gcc-x.y.z
. In questo modo, se hai bisogno di una versione ancora più recente, non avrai problemi a disinstallare quella precedente.