2010-06-28 11 views
24

Attualmente sto lavorando all'utilizzo di cmake per creare alcuni progetti, con le piattaforme principali Visual C++, GG MinGW e GCC Linux. Quando si costruisce con GCC, ho bisogno di specificare l'opzione del compilatore -Wno-invalid-offsetof.Come applicare diverse opzioni del compilatore per diversi compilatori in cmake?

mio correzione attuale è la seguente ...

if ( "${CMAKE_GENERATOR}" MATCHES "^Visual Studio" 
    OR "${CMAKE_GENERATOR}" MATCHES "^NMake" 
    ) 
    set (CPPLIB_COMPILER_OPTS "") 
else() 
    set (CPPLIB_COMPILER_OPTS "-Wno-invalid-offsetof") 
endif() 

... 

set_target_properties(sh_core PROPERTIES COMPILE_FLAGS "${CPPLIB_COMPILER_OPTS}") 
# repeated for all targets 

Questo funziona, ma partendo dal presupposto che tutti i generatori diversi da quelli di Visual Studio costruiranno con gcc è ovviamente pericoloso. Per cominciare, ci sono i generatori IIRC per i compilatori di Borland. Ancora più importante, usare make non significa sempre usare gcc.

Altri compilatori che probabilmente userò sono llvm-gcc e clang. Fortunatamente, penso che anche clang supporti le opzioni compatibili con gcc. Ma questa logica è valida solo finché il codice pertinente non viene mai rilasciato.

Cmake sembra controllare i compilatori disponibili e generare un makefile specifico per quel compilatore (sollevando la domanda - perché non avere almeno la possibilità di costruire il progetto direttamente, senza la necessità di un middle man come make?).

Stando così le cose, speravo di poter provare direttamente per gcc nei miei file CMakeLists.txt. Finora, però, non riesco a trovare una variabile appropriata da testare o un'altra soluzione ovvia.

È possibile?

risposta

35

Per creare un sistema di generazione portatile, è preferibile non eseguire il test delle piattaforme, ma verificare le funzionalità.

Invece di testare "se Windows fa questo", prova per "se il flag -Wno-invalid-offsetof funziona allora usalo". È possibile farlo con il modulo CheckCCompilerFlag, ad esempio:

include(CheckCCompilerFlag) 
check_c_compiler_flag(-Wno-invalid-offsetof HAS_NO_INVALID_OFFSETOF) 
if (HAS_NO_INVALID_OFFSETOF) 
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-invalid-offsetof") 
endif() 

per C++ c'è un CheckCXXCompilerFlag simile con un comando check_cxx_compiler_flag(flag var).

+1

Perfetto! Una cosa irrilevante, però ... non c'è molto da verificare questa opzione per C, dato che non esiste un offset non valido in C - accade solo in C++. – Steve314

+0

Non lo sapevo. In effetti non sapevo a cosa servisse l'opzione, ma ha perfettamente senso, dato che C ha solo POD tipi http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Warning-Options.html. E CMake ignora l'avviso del compilatore durante il suo test - "se lo compila funziona". – richq

+0

C'è un modo per verificare le combinazioni di opzioni? Inoltre volevo assicurarmi che non ci fossero avvisi in fase di compilazione, quindi stavo cercando un modo per indagare anche sugli avvertimenti. – thoni56

Problemi correlati