mirror of
https://github.com/Kitware/CMake.git
synced 2025-12-31 02:39:48 -06:00
Divert LCC compiler as a new one, instead of treating it as GNU. Since old times, Elbrus C/C++/Fortran Compiler (LCC) by MCST has been passing checks for GNU compilers, so it has been identified as GNU. Now, with intent of seriously upstreaming its support, it has been added as a separate LCC compiler, and its version displays not a supported GCC version, but LCC version itself (e.g. LCC 1.25.19 instead of GNU 7.3.0). This commit adds its support for detection, and also converts basically every check like 'is this compiler GNU?' to 'is this compiler GNU or LCC?'. The only places where this check is untouched, is where it regards other platforms where LCC is unavailable (primarily non-Linux), and where it REALLY differs from GNU compiler. Note: this transition may break software that are already ported to Elbrus, but hardly relies that LCC will be detected as GNU; still such software is not known.
159 lines
4.7 KiB
CMake
159 lines
4.7 KiB
CMake
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
|
|
|
|
|
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)
|
|
set(_compiler_id_simulate_${CompilerId} ${_compiler_id_simulate} PARENT_SCOPE)
|
|
set(_compiler_id_pp_test_${CompilerId} ${_compiler_id_pp_test} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
function(compiler_id_detection outvar lang)
|
|
|
|
if (NOT "x${lang}" STREQUAL "xFortran" AND NOT "x${lang}" STREQUAL "xCSharp"
|
|
AND NOT "x${lang}" STREQUAL "xISPC")
|
|
file(GLOB lang_files
|
|
"${CMAKE_ROOT}/Modules/Compiler/*-DetermineCompiler.cmake")
|
|
set(nonlang CXX)
|
|
if ("x${lang}" STREQUAL "xCXX")
|
|
set(nonlang C)
|
|
endif()
|
|
|
|
file(GLOB nonlang_files
|
|
"${CMAKE_ROOT}/Modules/Compiler/*-${nonlang}-DetermineCompiler.cmake")
|
|
list(REMOVE_ITEM lang_files ${nonlang_files})
|
|
endif()
|
|
|
|
set(files ${lang_files})
|
|
if (files)
|
|
foreach(file ${files})
|
|
_readFile(${file})
|
|
endforeach()
|
|
|
|
set(options ID_STRING VERSION_STRINGS ID_DEFINE PLATFORM_DEFAULT_COMPILER)
|
|
set(oneValueArgs PREFIX)
|
|
cmake_parse_arguments(CID "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
|
if (CID_UNPARSED_ARGUMENTS)
|
|
message(FATAL_ERROR "Unrecognized arguments: \"${CID_UNPARSED_ARGUMENTS}\"")
|
|
endif()
|
|
|
|
# Order is relevant here. For example, compilers which pretend to be
|
|
# GCC must appear before the actual GCC.
|
|
if ("x${lang}" STREQUAL "xCXX")
|
|
list(APPEND ordered_compilers
|
|
Comeau
|
|
)
|
|
endif()
|
|
list(APPEND ordered_compilers
|
|
Intel
|
|
IntelLLVM
|
|
PathScale
|
|
Embarcadero
|
|
Borland
|
|
Watcom
|
|
OpenWatcom
|
|
SunPro
|
|
HP
|
|
Compaq
|
|
zOS
|
|
XLClang
|
|
XL
|
|
VisualAge
|
|
NVHPC
|
|
PGI
|
|
Cray
|
|
TI
|
|
FujitsuClang
|
|
Fujitsu
|
|
GHS
|
|
)
|
|
if ("x${lang}" STREQUAL "xC")
|
|
list(APPEND ordered_compilers
|
|
TinyCC
|
|
Bruce
|
|
)
|
|
endif()
|
|
list(APPEND ordered_compilers
|
|
SCO
|
|
ARMCC
|
|
AppleClang
|
|
ARMClang
|
|
)
|
|
list(APPEND ordered_compilers
|
|
Clang
|
|
LCC
|
|
GNU
|
|
MSVC
|
|
ADSP
|
|
IAR
|
|
)
|
|
if ("x${lang}" STREQUAL "xC")
|
|
list(APPEND ordered_compilers
|
|
SDCC
|
|
)
|
|
endif()
|
|
|
|
if("x${lang}" STREQUAL "xCUDA")
|
|
set(ordered_compilers NVIDIA Clang)
|
|
endif()
|
|
|
|
if(CID_ID_DEFINE)
|
|
foreach(Id ${ordered_compilers})
|
|
string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT "# define ${CID_PREFIX}COMPILER_IS_${Id} 0\n")
|
|
endforeach()
|
|
# Hard-code definitions for compilers that are no longer supported.
|
|
string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT "# define ${CID_PREFIX}COMPILER_IS_MIPSpro 0\n")
|
|
endif()
|
|
|
|
set(pp_if "#if")
|
|
if (CID_VERSION_STRINGS)
|
|
string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT "\n/* Version number components: V=Version, R=Revision, P=Patch
|
|
Version date components: YYYY=Year, MM=Month, DD=Day */\n")
|
|
endif()
|
|
|
|
foreach(Id ${ordered_compilers})
|
|
if (NOT _compiler_id_pp_test_${Id})
|
|
message(FATAL_ERROR "No preprocessor test for \"${Id}\"")
|
|
endif()
|
|
set(id_content "${pp_if} ${_compiler_id_pp_test_${Id}}\n")
|
|
if (CID_ID_STRING)
|
|
set(PREFIX ${CID_PREFIX})
|
|
string(CONFIGURE "${_compiler_id_simulate_${Id}}" SIMULATE_BLOCK @ONLY)
|
|
string(APPEND id_content "# define ${CID_PREFIX}COMPILER_ID \"${Id}\"${SIMULATE_BLOCK}")
|
|
endif()
|
|
if (CID_ID_DEFINE)
|
|
string(APPEND id_content "# undef ${CID_PREFIX}COMPILER_IS_${Id}\n")
|
|
string(APPEND id_content "# define ${CID_PREFIX}COMPILER_IS_${Id} 1\n")
|
|
endif()
|
|
if (CID_VERSION_STRINGS)
|
|
set(PREFIX ${CID_PREFIX})
|
|
set(MACRO_DEC DEC)
|
|
set(MACRO_HEX HEX)
|
|
string(CONFIGURE "${_compiler_id_version_compute_${Id}}" VERSION_BLOCK @ONLY)
|
|
string(APPEND id_content "${VERSION_BLOCK}\n")
|
|
endif()
|
|
string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT "\n${id_content}")
|
|
set(pp_if "#elif")
|
|
endforeach()
|
|
|
|
if (CID_PLATFORM_DEFAULT_COMPILER)
|
|
set(platform_compiler_detection "
|
|
/* 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(__hpux) || defined(__hpua)
|
|
# define ${CID_PREFIX}COMPILER_ID \"HP\"
|
|
|
|
#else /* unknown compiler */
|
|
# define ${CID_PREFIX}COMPILER_ID \"\"")
|
|
endif()
|
|
|
|
string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT "\n${platform_compiler_detection}\n#endif")
|
|
endif()
|
|
|
|
set(${outvar} ${CMAKE_${lang}_COMPILER_ID_CONTENT} PARENT_SCOPE)
|
|
endfunction()
|