blob: 9a3638f471916fd3eb11475f367ff1072cd8c793 [file] [log] [blame]
Brad King86578ec2016-09-27 15:01:08 -04001# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2# file Copyright.txt or https://cmake.org/licensing for details.
Bill Hoffmanb7fa8202005-12-14 13:51:08 -05003
Brad King3a666592009-09-28 11:46:51 -04004
Brad King3df81b42012-08-24 09:10:34 -04005if(CMAKE_CXX_COMPILER_FORCED)
6 # The compiler configuration was forced by the user.
7 # Assume the user has configured all compiler information.
8 set(CMAKE_CXX_COMPILER_WORKS TRUE)
9 return()
10endif()
11
Kitware Robot77543bd2012-08-13 13:47:32 -040012include(CMakeTestCompilerCommon)
David Colef48660f2010-02-12 14:32:20 -050013
Jean-Christophe Fillion-Robin20737382020-07-21 17:35:14 -040014# work around enforced code signing and / or missing executable target type
Gregor Jasny11da8822018-01-15 22:21:10 +010015set(__CMAKE_SAVED_TRY_COMPILE_TARGET_TYPE ${CMAKE_TRY_COMPILE_TARGET_TYPE})
16if(_CMAKE_FEATURE_DETECTION_TARGET_TYPE)
17 set(CMAKE_TRY_COMPILE_TARGET_TYPE ${_CMAKE_FEATURE_DETECTION_TARGET_TYPE})
18endif()
19
Brad King3df81b42012-08-24 09:10:34 -040020# Remove any cached result from an older CMake version.
21# We now store this in CMakeCXXCompiler.cmake.
22unset(CMAKE_CXX_COMPILER_WORKS CACHE)
23
Brad King1d21dd02020-05-25 14:12:18 -040024# Try to identify the ABI and configure it into CMakeCXXCompiler.cmake
25include(${CMAKE_ROOT}/Modules/CMakeDetermineCompilerABI.cmake)
26CMAKE_DETERMINE_COMPILER_ABI(CXX ${CMAKE_ROOT}/Modules/CMakeCXXCompilerABI.cpp)
27if(CMAKE_CXX_ABI_COMPILED)
28 # The compiler worked so skip dedicated test below.
29 set(CMAKE_CXX_COMPILER_WORKS TRUE)
30 message(STATUS "Check for working CXX compiler: ${CMAKE_CXX_COMPILER} - skipped")
31endif()
32
Bill Hoffman2f4ea982003-01-21 12:50:48 -050033# This file is used by EnableLanguage in cmGlobalGenerator to
luz.paz287e7a12018-02-15 22:02:13 -050034# determine that the selected C++ compiler can actually compile
Brad Kingae28d812003-08-27 16:02:37 -040035# and link the most basic of programs. If not, a fatal error
Bill Hoffman2f4ea982003-01-21 12:50:48 -050036# is set and cmake stops processing commands and will not generate
37# any makefiles or projects.
Kitware Robot77543bd2012-08-13 13:47:32 -040038if(NOT CMAKE_CXX_COMPILER_WORKS)
Alex Turbov7b2dd9d2019-08-13 05:02:14 +030039 PrintTestCompilerStatus("CXX")
Fred Baksik72e0c112019-01-08 23:52:12 -050040 __TestCompiler_setTryCompileTargetType()
Kitware Robot77543bd2012-08-13 13:47:32 -040041 file(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testCXXCompiler.cxx
Bill Hoffmane78a5752004-10-11 11:55:39 -040042 "#ifndef __cplusplus\n"
43 "# error \"The CMAKE_CXX_COMPILER is set to a C compiler\"\n"
44 "#endif\n"
45 "int main(){return 0;}\n")
Brad King3ddd7f32021-07-15 12:58:44 -040046 # Clear result from normal variable.
47 unset(CMAKE_CXX_COMPILER_WORKS)
48 # Puts test result in cache variable.
Matthew Woehlke2edf0fc2022-09-13 10:07:56 -040049 try_compile(CMAKE_CXX_COMPILER_WORKS
50 SOURCES ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testCXXCompiler.cxx
Brad King5f6985a2011-12-15 08:29:43 -050051 OUTPUT_VARIABLE __CMAKE_CXX_COMPILER_OUTPUT)
Brad King3df81b42012-08-24 09:10:34 -040052 # Move result from cache to normal variable.
53 set(CMAKE_CXX_COMPILER_WORKS ${CMAKE_CXX_COMPILER_WORKS})
54 unset(CMAKE_CXX_COMPILER_WORKS CACHE)
Fred Baksik72e0c112019-01-08 23:52:12 -050055 __TestCompiler_restoreTryCompileTargetType()
Brad King1d21dd02020-05-25 14:12:18 -040056 if(NOT CMAKE_CXX_COMPILER_WORKS)
57 PrintTestCompilerResult(CHECK_FAIL "broken")
58 file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
59 "Determining if the CXX compiler works failed with "
60 "the following output:\n${__CMAKE_CXX_COMPILER_OUTPUT}\n\n")
61 string(REPLACE "\n" "\n " _output "${__CMAKE_CXX_COMPILER_OUTPUT}")
62 message(FATAL_ERROR "The C++ compiler\n \"${CMAKE_CXX_COMPILER}\"\n"
63 "is not able to compile a simple test program.\nIt fails "
64 "with the following output:\n ${_output}\n\n"
65 "CMake will not be able to correctly generate this project.")
66 endif()
67 PrintTestCompilerResult(CHECK_PASS "works")
68 file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
69 "Determining if the CXX compiler works passed with "
70 "the following output:\n${__CMAKE_CXX_COMPILER_OUTPUT}\n\n")
Kitware Robot9db31162012-08-13 13:50:14 -040071endif()
Brad King81be61b2003-12-01 13:06:35 -050072
Brad King1d21dd02020-05-25 14:12:18 -040073# Try to identify the compiler features
74include(${CMAKE_ROOT}/Modules/CMakeDetermineCompileFeatures.cmake)
75CMAKE_DETERMINE_COMPILE_FEATURES(CXX)
Brad Kinga28b1972008-01-21 18:30:17 -050076
Brad King1d21dd02020-05-25 14:12:18 -040077# Re-configure to save learned information.
78configure_file(
79 ${CMAKE_ROOT}/Modules/CMakeCXXCompiler.cmake.in
80 ${CMAKE_PLATFORM_INFO_DIR}/CMakeCXXCompiler.cmake
81 @ONLY
82 )
83include(${CMAKE_PLATFORM_INFO_DIR}/CMakeCXXCompiler.cmake)
Brad King3df81b42012-08-24 09:10:34 -040084
Brad King1d21dd02020-05-25 14:12:18 -040085if(CMAKE_CXX_SIZEOF_DATA_PTR)
86 foreach(f ${CMAKE_CXX_ABI_FILES})
87 include(${f})
88 endforeach()
89 unset(CMAKE_CXX_ABI_FILES)
Kitware Robot9db31162012-08-13 13:50:14 -040090endif()
Brad King5f6985a2011-12-15 08:29:43 -050091
Gregor Jasny11da8822018-01-15 22:21:10 +010092set(CMAKE_TRY_COMPILE_TARGET_TYPE ${__CMAKE_SAVED_TRY_COMPILE_TARGET_TYPE})
93unset(__CMAKE_SAVED_TRY_COMPILE_TARGET_TYPE)
Kitware Robot77543bd2012-08-13 13:47:32 -040094unset(__CMAKE_CXX_COMPILER_OUTPUT)