2009-10-24 10 views
52

질문은 꽤 분명하다고 생각합니다. 어떤 컴파일러가 사용되었고 어떤 버전인지에 대한 어플리케이션 정보를 포함 할 수 있도록 컴파일러 탐지 헤더를 작성하려고합니다.#define 지시문을 통해 LLVM 및 해당 버전을 검색하는 방법은 무엇입니까?

이 내가 사용하고 코드의 일부입니다

다음과 같이 사용할 수
/* GNU C Compiler Detection */ 
#elif defined __GNUC__ 
    #ifdef __MINGW32__ 
     #define COMPILER "MinGW GCC %d.%d.%d" 
    #else 
     #define COMPILER "GCC %d.%d.%d" 
    #endif 
    #define COMP_VERSION __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__ 
#endif 

:

printf(" Compiled using " COMPILER "\n", COMP_VERSION); 

LLVM 및 버전을 감지 할 수있는 방법이 있나요? 그리고 CLANG? InitPreprocessor.cpp에서

+0

큰 문제는, 내가 그것에 전혀 –

+0

당신은 가끔, 연타의 통합 어셈블러를 사용하는 경우 알 필요도 어떤 DOCO를 찾을 수 없습니다. 유스 케이스는 현대의 GCC이며 컴파일러는 AESNI, AVX, BMI 등을 어셈블하기 위해 오래된 GAS가 아닌 어셈블러로 Clang을 사용합니다. Apple의 AS 및 LD가 너무 오래되어 전면에서 생성 된 어셈블리를 소비하기 때문에 Integrated Assembler를 사용합니다 - 끝. – jww

답변

64

__llvm____clang__ 매크로는 각각 LLVM 컴파일러 (llvm-gcc 또는 clang) 또는 clang을 확인하는 공식 방법입니다.

__has_feature__has_builtin는 연타를 사용할 때 옵션 컴파일러 기능 검사의 권장되는 방법, 그들은 here을 문서화되어 있습니다. 사용 GCC, LLVM-GCC, 그리고 그 소리에 내장 컴파일러 매크로의 목록을 찾을 수 있습니다

참고 :

echo | clang -dM -E - 

이 빈 문자열을 사전 처리 컴파일러에 의해 정의 된 모든 매크로를 뱉어.

+22

'__GNUC__'는 clang과 llvm-gcc에 대해서도 정의되어 있음에 유의하십시오. – pqnet

10

발췌문 : 그래도 난 LLVM과 그 소리 자체의 버전을 얻을 수있는 방법을 찾을 수 없습니다

// Compiler version introspection macros. 
    DefineBuiltinMacro(Buf, "__llvm__=1"); // LLVM Backend 
    DefineBuiltinMacro(Buf, "__clang__=1"); // Clang Frontend 

    // Currently claim to be compatible with GCC 4.2.1-5621. 
    DefineBuiltinMacro(Buf, "__GNUC_MINOR__=2"); 
    DefineBuiltinMacro(Buf, "__GNUC_PATCHLEVEL__=1"); 
    DefineBuiltinMacro(Buf, "__GNUC__=4"); 
    DefineBuiltinMacro(Buf, "__GXX_ABI_VERSION=1002"); 
    DefineBuiltinMacro(Buf, "__VERSION__=\"4.2.1 Compatible Clang Compiler\""); 

.. 그 소리를 들어

+0

내가 지금 주장한 GCC에 대한 지원이 버전에 따라 달라질 수 있으며, 확장을위한 clang/llvm은 –

21

, 당신은 버전 번호를 테스트하지 말아야 feature checking macros으로 원하는 기능을 확인해야합니다.

+1

hm입니다. 이것은 좋은 지적입니다. 이에 관한 공식 자료에 대한 링크를 제공 할 수 있습니까? –

+1

@Matt Joiner, 내 생각에, Chris 자신이 어떤 공무원입니다. 그의 홈페이지 http://nondot.org/sabre/에서 인용 : "나는 LLVM 컴파일러 인프라의 주 저자이다." – osgx

+2

@osgx : 그럼에도 불구하고 그는 프로젝트의 유용성을 높이기 위해 링크를 제공하고 문서를 추가 할 수있었습니다. –

4

Pre-defined Compiler Macros page을보고 Compilers->Clang을 선택하십시오. 표준, 컴파일러, 라이브러리, OS, 아키텍처 등에 대한 많은 다른 매크로 정보가 있습니다. 완성도, 여기에 대답 그래서

내가 여기에 대한 답변을 찾을 수없는
+0

굉장합니다. 그냥 내 베이컨을 구하십시오 :) –

30

만, 답변에 대한 링크 :

__clang__    // set to 1 if compiler is clang 
__clang_major__  // integer: major marketing version number of clang 
__clang_minor__  // integer: minor marketing version number of clang 
__clang_patchlevel__ // integer: marketing patch level of clang 
__clang_version__  // string: full version number 

나는 현재 수 :

__clang__=1 
__clang_major__=3 
__clang_minor__=2 
__clang_patchlevel__=0 
__clang_version__="3.2 (tags/RELEASE_32/final)" 
2

나는 최선의 선택임을 동의 에는 매크로가 있고 버전 매크로는 없습니다. boost와 예 :

#include <boost/config.hpp> 

#if defined(BOOST_NO_CXX11_NOEXCEPT) 
#if defined(BOOST_MSVC) 
    #define MY_NOEXCEPT throw() 
#else 
    #define MY_NOEXCEPT 
#endif 
#else 
#define MY_NOEXCEPT noexcept 
#endif 

void my_noexcept_function() MY_NOEXCEPT; // it's example, use BOOST_NOEXCEPT (: 

하지만 컴파일러 버전 필요하면 어쨌든, 당신이 사용할 수있는 boost.predef :

#include <iostream> 
#include <boost/predef.h> 

int main() { 
#if (BOOST_COMP_CLANG) 
    std::cout << BOOST_COMP_CLANG_NAME << "-" << BOOST_COMP_CLANG << std::endl; 
#else 
    std::cout << "Unknown compiler" << std::endl; 
#endif 
    return 0; 
} 

출력 예 :

Clang-30400000 
Clang-50000000 
0

주 당신이 ' llvm을 사용하여 바이트 코드를 해킹하고 llvm include 파일을 #include에게 보내면 ca n llvm/Config/llvm-config.h의 매크로를 확인하십시오.그리고 구체적으로 :

/* Major version of the LLVM API */ 
#define LLVM_VERSION_MAJOR 3 

/* Minor version of the LLVM API */ 
#define LLVM_VERSION_MINOR 8 

/* Patch version of the LLVM API */ 
#define LLVM_VERSION_PATCH 0 

/* LLVM version string */ 
#define LLVM_VERSION_STRING "3.8.0"