2015-11-09 21 views
37

Voglio capire quale versione di clang Apple è stata installata nel mio macbook, per vedere con C++ 11 e/o C++ 14 sono disponibili le funzionalità. ho digitato questo comando:Ottieni versione clang di Apple e corrispondente versione LLVM upstream

clang --version 

//----response 
Apple LLVM version 7.0.0 (clang-700.1.76)  
Target: x86_64-apple-darwin15.0.0  
Thread model: posix 

ma io non sono in grado di capire che cosa significa (clang-700.1.76). Come posso convertire questo codice in una versione clang?

Questo è il sito in cui si potrebbe verificare C++ funzionalità disponibili in versione clang http://clang.llvm.org/cxx_status.html

+1

Apparentemente, veniva utilizzato per segnalare la versione LLVM upstream basata su: [Xcode clang versions] (https://gist.github.com/yamaya/2924292), ma come lo hai trovato non funziona più. Direi che sia 3.6 o 3.7. – melak47

+0

Rettonato * "Ottieni versione clang di Apple e corrispondente versione LLVM upstream" * per riepilogare le cose – smci

risposta

1

La (Apple) il numero di versione del compilatore è in gran parte inutile, dal momento che è inoltre necessario considerare se il codice viene compilato con libstdc++ o con libc++ (o qualsiasi altra libreria standard) - e quale versione di quelli.

Se si desidera verificare per caratteristiche del linguaggio o di libreria, è meglio controllare altri valori definiti, ad esempio, __cplusplus, __cpp_constexpr, __cpp_variadic_templates, ecc Non è perfetto, ma sembra funzionare meglio (se volete la portabilità) nella mia esperienza e il supporto di tutti i principali compilatori sta migliorando.

Ogni versione standard C++ definisce un valore per __cplusplus, alcuni compilatori utilizzano valori intermedi per dire "abbiamo già avviato su C++ 14, ma non ci siamo ancora". Utilizzare >= per testare quando necessario.

Le altre macro di test di funzionalità sono simili, è possibile trovare la versione corrente a N4440. Tuttavia, non tutti i compilatori implementano N4440.

+9

"Il numero di versione del compilatore è in gran parte inutile" Cosa? Voglio sapere se un bug che ho visto nel loro tracker è stato corretto. se so che è un bug clang (relativo a constexpr o qualsiasi altra cosa), come è ** per lo più inutile **? Si tratta di un reclamo grande, non supportato – Ven

+7

@Ven Si intende ** nel contesto di questa domanda **, non universalmente. Il numero di versione è in gran parte inutile per il rilevamento di funzionalità quando la libreria standard è coinvolta poiché il numero di versione del compilatore non (e non può) include quale versione di 'libstdC++' è usata. Inoltre, poiché Apple utilizza uno schema di versione diverso da Clang, non puoi semplicemente abbinare il numero di versione di Apple al database dei bug di Clang. –

12

Ecco la lista migliore che ho trovato che correla le versioni clangore di Apple con le versioni LLVM:

https://trac.macports.org/wiki/XcodeVersionInfo

versioni precedenti dicevano che versione LLVM corrispondessero a, ma a partire da 7.0, Apple deciso di non farlo più. Definiscono anche il __clang_version__ e le macro relative al preprocessore per indicare il numero di versione di Apple, non la versione LLVM. Quindi sono inutili anche per questo.

Sfortunatamente, sembra che l'unico modo per vedere se si dispone di una funzionalità è provarlo e controllare se funziona. per esempio. 7.0.2 non ha ancora OpenMP abilitato di default (anche se è enable-able), quindi credo che sia ancora 3.6, non ancora 3.7.

1

Se si utilizza il comando string sul compilatore, è possibile ottenere la versione LLVM.

Per esempio, se si dispone della versione clangore che si identifica come di Apple LLVM versione 7.0.2 (clang-700.1.81), l'uscita di stringhe avrà questo valore:

LLVM 3.7.0svn 

Questo doesn 't sembrano funzionare con la versione di Apple LLVM versione 7.3.0 (clang-703.0.29)

+0

Le stringhe attuali di Apple clang contengono solo il nome binario. O mi sto perdendo qualcosa qui? https://gist.github.com/webmaster128/73dee3783694b04987290e5b120aa3e5 –

7

Come accennato da pkolbus, si può guardare la /src/CMakeLists.txt di indovinare la versione Clang corrispondente. Ad esempio, Apple Clang 800.0.38 e 800.0.42.1 sembrano entrambi basati su Clang 3.9.0 secondo

if(NOT DEFINED LLVM_VERSION_MAJOR) 
    set(LLVM_VERSION_MAJOR 3) 
endif() 
if(NOT DEFINED LLVM_VERSION_MINOR) 
    set(LLVM_VERSION_MINOR 9) 
endif() 
if(NOT DEFINED LLVM_VERSION_PATCH) 
    set(LLVM_VERSION_PATCH 0) 
endif() 
if(NOT DEFINED LLVM_VERSION_SUFFIX) 
    set(LLVM_VERSION_SUFFIX svn) 
endif() 
2

si può tentare di compilare alcuni file con --verbose opzione.

Per esempio: C++ --verbose -c test1.cpp

Apple LLVM version 7.0.2 (clang-700.1.81) 
Target: x86_64-apple-darwin14.5.0 
Thread model: posix 
"/Library/Developer/CommandLineTools/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.10.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name test1.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 253.9 -v -dwarf-column-info -coverage-file /Users/az/ctest/test1.cpp -resource-dir /Library/Developer/CommandLineTools/usr/bin/../lib/clang/7.0.2 -stdlib=libc++ -fdeprecated-macro -fdebug-compilation-dir /Users/az/ctest -ferror-limit 19 -fmessage-length 130 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.10.0 -fencode-extended-block-signature -fcxx-exceptions -fexceptions -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -o test1.o -x c++ test1.cpp 
clang -cc1 version 7.0.2 based upon LLVM 3.7.0svn default target x86_64-apple-darwin14.5.0 

Lo fa Versione stampabile LLVM svn (3.7.0 nel nostro esempio)

+0

Non funziona più per l'attuale clang di Apple, vedere https://gist.github.com/webmaster128/7734385cdd7eee4cfc6c6171725ffb1c –

+0

funziona per macOS 10.13.2 –