CMakeCompilerIdDetection.cmake 4.93 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

#=============================================================================
# Copyright 2014 Stephen Kelly <steveire@gmail.com>
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distribute this file outside of CMake, substitute the full
#  License text for the above reference.)

function(_readFile file)
  include(${file})
  get_filename_component(name ${file} NAME_WE)
  string(REGEX REPLACE "-.*" "" CompilerId ${name})
  set(_compiler_id_version_compute_${CompilerId} ${_compiler_id_version_compute} PARENT_SCOPE)
20
  set(_compiler_id_simulate_${CompilerId} ${_compiler_id_simulate} PARENT_SCOPE)
21
22
23
  set(_compiler_id_pp_test_${CompilerId} ${_compiler_id_pp_test} PARENT_SCOPE)
endfunction()

24
25
include(${CMAKE_CURRENT_LIST_DIR}/CMakeParseArguments.cmake)

26
27
28
function(compiler_id_detection outvar lang)

  if (NOT lang STREQUAL Fortran)
29
    file(GLOB lang_files
30
      "${CMAKE_ROOT}/Modules/Compiler/*-DetermineCompiler.cmake")
31
32
33
34
35
36
37
38
    set(nonlang CXX)
    if (lang STREQUAL CXX)
      set(nonlang C)
    endif()

    file(GLOB nonlang_files
      "${CMAKE_ROOT}/Modules/Compiler/*-${nonlang}-DetermineCompiler.cmake")
    list(REMOVE_ITEM lang_files ${nonlang_files})
39
40
  endif()

41
  set(files ${lang_files})
42
43
44
45
46
  if (files)
    foreach(file ${files})
      _readFile(${file})
    endforeach()

47
    set(options ID_STRING VERSION_STRINGS ID_DEFINE PLATFORM_DEFAULT_COMPILER)
48
    set(oneValueArgs PREFIX)
49
50
51
52
53
    cmake_parse_arguments(CID "${options}" "${oneValueArgs}" "${multiValueArgs}"  ${ARGN})
    if (CID_UNPARSED_ARGUMENTS)
      message(FATAL_ERROR "Unrecognized arguments: \"${CID_UNPARSED_ARGUMENTS}\"")
    endif()

54
55
56
57
58
59
60
61
    # Order is relevant here. For example, compilers which pretend to be
    # GCC must appear before the actual GCC.
    if (lang STREQUAL CXX)
      list(APPEND ordered_compilers
        Comeau
      )
    endif()
    list(APPEND ordered_compilers
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
      Intel
      PathScale
      Embarcadero
      Borland
      Watcom
      OpenWatcom
      SunPro
      HP
      Compaq
      zOS
      XL
      VisualAge
      PGI
      Cray
      TI
77
78
79
80
81
82
83
    )
    if (lang STREQUAL C)
      list(APPEND ordered_compilers
        TinyCC
      )
    endif()
    list(APPEND ordered_compilers
84
      SCO
85
86
      AppleClang
      Clang
87
88
89
90
      GNU
      MSVC
      ADSP
      IAR
91
92
93
94
95
96
97
    )
    if (lang STREQUAL C)
      list(APPEND ordered_compilers
        SDCC
      )
    endif()
    list(APPEND ordered_compilers
98
99
      MIPSpro)

100
101
    if(CID_ID_DEFINE)
      foreach(Id ${ordered_compilers})
102
        set(CMAKE_${lang}_COMPILER_ID_CONTENT "${CMAKE_${lang}_COMPILER_ID_CONTENT}# define ${CID_PREFIX}COMPILER_IS_${Id} 0\n")
103
104
105
      endforeach()
    endif()

106
    set(pp_if "#if")
107
    if (CID_VERSION_STRINGS)
108
      set(CMAKE_${lang}_COMPILER_ID_CONTENT "${CMAKE_${lang}_COMPILER_ID_CONTENT}\n/* Version number components: V=Version, R=Revision, P=Patch
109
   Version date components:   YYYY=Year, MM=Month,   DD=Day  */\n")
110
    endif()
111
112
113
114
115

    foreach(Id ${ordered_compilers})
      if (NOT _compiler_id_pp_test_${Id})
        message(FATAL_ERROR "No preprocessor test for \"${Id}\"")
      endif()
116
117
      set(id_content "${pp_if} ${_compiler_id_pp_test_${Id}}\n")
      if (CID_ID_STRING)
118
119
120
        set(PREFIX ${CID_PREFIX})
        string(CONFIGURE "${_compiler_id_simulate_${Id}}" SIMULATE_BLOCK @ONLY)
        set(id_content "${id_content}# define ${CID_PREFIX}COMPILER_ID \"${Id}\"${SIMULATE_BLOCK}")
121
      endif()
122
      if (CID_ID_DEFINE)
123
124
        set(id_content "${id_content}# undef ${CID_PREFIX}COMPILER_IS_${Id}\n")
        set(id_content "${id_content}# define ${CID_PREFIX}COMPILER_IS_${Id} 1\n")
125
      endif()
126
      if (CID_VERSION_STRINGS)
127
        set(PREFIX ${CID_PREFIX})
128
129
        set(MACRO_DEC DEC)
        set(MACRO_HEX HEX)
130
131
        string(CONFIGURE "${_compiler_id_version_compute_${Id}}" VERSION_BLOCK @ONLY)
        set(id_content "${id_content}${VERSION_BLOCK}\n")
132
      endif()
133
134
135
136
      set(CMAKE_${lang}_COMPILER_ID_CONTENT "${CMAKE_${lang}_COMPILER_ID_CONTENT}\n${id_content}")
      set(pp_if "#elif")
    endforeach()

137
138
    if (CID_PLATFORM_DEFAULT_COMPILER)
      set(platform_compiler_detection "
139
140
141
142
/* These compilers are either not known or too old to define an
  identification macro.  Try to identify the platform and guess that
  it is the native compiler.  */
#elif defined(__sgi)
143
# define ${CID_PREFIX}COMPILER_ID \"MIPSpro\"
144
145

#elif defined(__hpux) || defined(__hpua)
146
# define ${CID_PREFIX}COMPILER_ID \"HP\"
147
148

#else /* unknown compiler */
149
# define ${CID_PREFIX}COMPILER_ID \"\"")
150
    endif()
151

152
    set(CMAKE_${lang}_COMPILER_ID_CONTENT "${CMAKE_${lang}_COMPILER_ID_CONTENT}\n${platform_compiler_detection}\n#endif")
153
154
155
156
  endif()

  set(${outvar} ${CMAKE_${lang}_COMPILER_ID_CONTENT} PARENT_SCOPE)
endfunction()