1# Distributed under the OSI-approved BSD 3-Clause License. See accompanying 2# file Copyright.txt or https://cmake.org/licensing for details. 3 4 5# This file sets the basic flags for the C++ language in CMake. 6# It also loads the available platform file for the system-compiler 7# if it exists. 8# It also loads a system - compiler - processor (or target hardware) 9# specific file, which is mainly useful for crosscompiling and embedded systems. 10 11include(CMakeLanguageInformation) 12 13# some compilers use different extensions (e.g. sdcc uses .rel) 14# so set the extension here first so it can be overridden by the compiler specific file 15if(UNIX) 16 set(CMAKE_CXX_OUTPUT_EXTENSION .o) 17else() 18 set(CMAKE_CXX_OUTPUT_EXTENSION .obj) 19endif() 20 21set(_INCLUDED_FILE 0) 22 23# Load compiler-specific information. 24if(CMAKE_CXX_COMPILER_ID) 25 include(Compiler/${CMAKE_CXX_COMPILER_ID}-CXX OPTIONAL) 26endif() 27 28set(CMAKE_BASE_NAME) 29get_filename_component(CMAKE_BASE_NAME "${CMAKE_CXX_COMPILER}" NAME_WE) 30# since the gnu compiler has several names force g++ 31if(CMAKE_COMPILER_IS_GNUCXX) 32 set(CMAKE_BASE_NAME g++) 33endif() 34 35 36# load a hardware specific file, mostly useful for embedded compilers 37if(CMAKE_SYSTEM_PROCESSOR) 38 if(CMAKE_CXX_COMPILER_ID) 39 include(Platform/${CMAKE_EFFECTIVE_SYSTEM_NAME}-${CMAKE_CXX_COMPILER_ID}-CXX-${CMAKE_SYSTEM_PROCESSOR} OPTIONAL RESULT_VARIABLE _INCLUDED_FILE) 40 endif() 41 if (NOT _INCLUDED_FILE) 42 include(Platform/${CMAKE_EFFECTIVE_SYSTEM_NAME}-${CMAKE_BASE_NAME}-${CMAKE_SYSTEM_PROCESSOR} OPTIONAL) 43 endif () 44endif() 45 46# load the system- and compiler specific files 47if(CMAKE_CXX_COMPILER_ID) 48 include(Platform/${CMAKE_EFFECTIVE_SYSTEM_NAME}-${CMAKE_CXX_COMPILER_ID}-CXX OPTIONAL RESULT_VARIABLE _INCLUDED_FILE) 49endif() 50if (NOT _INCLUDED_FILE) 51 include(Platform/${CMAKE_EFFECTIVE_SYSTEM_NAME}-${CMAKE_BASE_NAME} OPTIONAL 52 RESULT_VARIABLE _INCLUDED_FILE) 53endif () 54 55# load any compiler-wrapper specific information 56if (CMAKE_CXX_COMPILER_WRAPPER) 57 __cmake_include_compiler_wrapper(CXX) 58endif () 59 60# We specify the compiler information in the system file for some 61# platforms, but this language may not have been enabled when the file 62# was first included. Include it again to get the language info. 63# Remove this when all compiler info is removed from system files. 64if (NOT _INCLUDED_FILE) 65 include(Platform/${CMAKE_SYSTEM_NAME} OPTIONAL) 66endif () 67 68if(CMAKE_CXX_SIZEOF_DATA_PTR) 69 foreach(f ${CMAKE_CXX_ABI_FILES}) 70 include(${f}) 71 endforeach() 72 unset(CMAKE_CXX_ABI_FILES) 73endif() 74 75# This should be included before the _INIT variables are 76# used to initialize the cache. Since the rule variables 77# have if blocks on them, users can still define them here. 78# But, it should still be after the platform file so changes can 79# be made to those values. 80 81if(CMAKE_USER_MAKE_RULES_OVERRIDE) 82 # Save the full path of the file so try_compile can use it. 83 include(${CMAKE_USER_MAKE_RULES_OVERRIDE} RESULT_VARIABLE _override) 84 set(CMAKE_USER_MAKE_RULES_OVERRIDE "${_override}") 85endif() 86 87if(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX) 88 # Save the full path of the file so try_compile can use it. 89 include(${CMAKE_USER_MAKE_RULES_OVERRIDE_CXX} RESULT_VARIABLE _override) 90 set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX "${_override}") 91endif() 92 93 94# Create a set of shared library variable specific to C++ 95# For 90% of the systems, these are the same flags as the C versions 96# so if these are not set just copy the flags from the c version 97if(NOT CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS) 98 set(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS ${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS}) 99endif() 100 101if(NOT CMAKE_CXX_COMPILE_OPTIONS_PIC) 102 set(CMAKE_CXX_COMPILE_OPTIONS_PIC ${CMAKE_C_COMPILE_OPTIONS_PIC}) 103endif() 104 105if(NOT CMAKE_CXX_COMPILE_OPTIONS_PIE) 106 set(CMAKE_CXX_COMPILE_OPTIONS_PIE ${CMAKE_C_COMPILE_OPTIONS_PIE}) 107endif() 108if(NOT CMAKE_CXX_LINK_OPTIONS_PIE) 109 set(CMAKE_CXX_LINK_OPTIONS_PIE ${CMAKE_C_LINK_OPTIONS_PIE}) 110endif() 111if(NOT CMAKE_CXX_LINK_OPTIONS_NO_PIE) 112 set(CMAKE_CXX_LINK_OPTIONS_NO_PIE ${CMAKE_C_LINK_OPTIONS_NO_PIE}) 113endif() 114 115if(NOT CMAKE_CXX_COMPILE_OPTIONS_DLL) 116 set(CMAKE_CXX_COMPILE_OPTIONS_DLL ${CMAKE_C_COMPILE_OPTIONS_DLL}) 117endif() 118 119if(NOT CMAKE_SHARED_LIBRARY_CXX_FLAGS) 120 set(CMAKE_SHARED_LIBRARY_CXX_FLAGS ${CMAKE_SHARED_LIBRARY_C_FLAGS}) 121endif() 122 123if(NOT DEFINED CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS) 124 set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS ${CMAKE_SHARED_LIBRARY_LINK_C_FLAGS}) 125endif() 126 127if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_CXX_FLAG) 128 set(CMAKE_SHARED_LIBRARY_RUNTIME_CXX_FLAG ${CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG}) 129endif() 130 131if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_CXX_FLAG_SEP) 132 set(CMAKE_SHARED_LIBRARY_RUNTIME_CXX_FLAG_SEP ${CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG_SEP}) 133endif() 134 135if(NOT CMAKE_SHARED_LIBRARY_RPATH_LINK_CXX_FLAG) 136 set(CMAKE_SHARED_LIBRARY_RPATH_LINK_CXX_FLAG ${CMAKE_SHARED_LIBRARY_RPATH_LINK_C_FLAG}) 137endif() 138 139if(NOT DEFINED CMAKE_EXE_EXPORTS_CXX_FLAG) 140 set(CMAKE_EXE_EXPORTS_CXX_FLAG ${CMAKE_EXE_EXPORTS_C_FLAG}) 141endif() 142 143if(NOT DEFINED CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG) 144 set(CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG ${CMAKE_SHARED_LIBRARY_SONAME_C_FLAG}) 145endif() 146 147if(NOT CMAKE_EXECUTABLE_RUNTIME_CXX_FLAG) 148 set(CMAKE_EXECUTABLE_RUNTIME_CXX_FLAG ${CMAKE_SHARED_LIBRARY_RUNTIME_CXX_FLAG}) 149endif() 150 151if(NOT CMAKE_EXECUTABLE_RUNTIME_CXX_FLAG_SEP) 152 set(CMAKE_EXECUTABLE_RUNTIME_CXX_FLAG_SEP ${CMAKE_SHARED_LIBRARY_RUNTIME_CXX_FLAG_SEP}) 153endif() 154 155if(NOT CMAKE_EXECUTABLE_RPATH_LINK_CXX_FLAG) 156 set(CMAKE_EXECUTABLE_RPATH_LINK_CXX_FLAG ${CMAKE_SHARED_LIBRARY_RPATH_LINK_CXX_FLAG}) 157endif() 158 159if(NOT DEFINED CMAKE_SHARED_LIBRARY_LINK_CXX_WITH_RUNTIME_PATH) 160 set(CMAKE_SHARED_LIBRARY_LINK_CXX_WITH_RUNTIME_PATH ${CMAKE_SHARED_LIBRARY_LINK_C_WITH_RUNTIME_PATH}) 161endif() 162 163if(NOT CMAKE_INCLUDE_FLAG_CXX) 164 set(CMAKE_INCLUDE_FLAG_CXX ${CMAKE_INCLUDE_FLAG_C}) 165endif() 166 167# for most systems a module is the same as a shared library 168# so unless the variable CMAKE_MODULE_EXISTS is set just 169# copy the values from the LIBRARY variables 170if(NOT CMAKE_MODULE_EXISTS) 171 set(CMAKE_SHARED_MODULE_CXX_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) 172 set(CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS ${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS}) 173endif() 174 175# repeat for modules 176if(NOT CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS) 177 set(CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS ${CMAKE_SHARED_MODULE_CREATE_C_FLAGS}) 178endif() 179 180if(NOT CMAKE_SHARED_MODULE_CXX_FLAGS) 181 set(CMAKE_SHARED_MODULE_CXX_FLAGS ${CMAKE_SHARED_MODULE_C_FLAGS}) 182endif() 183 184# Initialize CXX link type selection flags from C versions. 185foreach(type SHARED_LIBRARY SHARED_MODULE EXE) 186 if(NOT CMAKE_${type}_LINK_STATIC_CXX_FLAGS) 187 set(CMAKE_${type}_LINK_STATIC_CXX_FLAGS 188 ${CMAKE_${type}_LINK_STATIC_C_FLAGS}) 189 endif() 190 if(NOT CMAKE_${type}_LINK_DYNAMIC_CXX_FLAGS) 191 set(CMAKE_${type}_LINK_DYNAMIC_CXX_FLAGS 192 ${CMAKE_${type}_LINK_DYNAMIC_C_FLAGS}) 193 endif() 194endforeach() 195 196if(CMAKE_EXECUTABLE_FORMAT STREQUAL "ELF") 197 if(NOT DEFINED CMAKE_CXX_LINK_WHAT_YOU_USE_FLAG) 198 set(CMAKE_CXX_LINK_WHAT_YOU_USE_FLAG "LINKER:--no-as-needed") 199 endif() 200 if(NOT DEFINED CMAKE_LINK_WHAT_YOU_USE_CHECK) 201 set(CMAKE_LINK_WHAT_YOU_USE_CHECK ldd -u -r) 202 endif() 203endif() 204 205# add the flags to the cache based 206# on the initial values computed in the platform/*.cmake files 207# use _INIT variables so that this only happens the first time 208# and you can set these flags in the cmake cache 209set(CMAKE_CXX_FLAGS_INIT "$ENV{CXXFLAGS} ${CMAKE_CXX_FLAGS_INIT}") 210 211cmake_initialize_per_config_variable(CMAKE_CXX_FLAGS "Flags used by the CXX compiler") 212 213if(CMAKE_CXX_STANDARD_LIBRARIES_INIT) 214 set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES_INIT}" 215 CACHE STRING "Libraries linked by default with all C++ applications.") 216 mark_as_advanced(CMAKE_CXX_STANDARD_LIBRARIES) 217endif() 218 219if(NOT CMAKE_CXX_COMPILER_LAUNCHER AND DEFINED ENV{CMAKE_CXX_COMPILER_LAUNCHER}) 220 set(CMAKE_CXX_COMPILER_LAUNCHER "$ENV{CMAKE_CXX_COMPILER_LAUNCHER}" 221 CACHE STRING "Compiler launcher for CXX.") 222endif() 223 224if(NOT CMAKE_CXX_LINKER_LAUNCHER AND DEFINED ENV{CMAKE_CXX_LINKER_LAUNCHER}) 225 set(CMAKE_CXX_LINKER_LAUNCHER "$ENV{CMAKE_CXX_LINKER_LAUNCHER}" 226 CACHE STRING "Linker launcher for CXX.") 227endif() 228 229include(CMakeCommonLanguageInclude) 230 231# now define the following rules: 232# CMAKE_CXX_CREATE_SHARED_LIBRARY 233# CMAKE_CXX_CREATE_SHARED_MODULE 234# CMAKE_CXX_COMPILE_OBJECT 235# CMAKE_CXX_LINK_EXECUTABLE 236 237# variables supplied by the generator at use time 238# <TARGET> 239# <TARGET_BASE> the target without the suffix 240# <OBJECTS> 241# <OBJECT> 242# <LINK_LIBRARIES> 243# <FLAGS> 244# <LINK_FLAGS> 245 246# CXX compiler information 247# <CMAKE_CXX_COMPILER> 248# <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> 249# <CMAKE_CXX_SHARED_MODULE_CREATE_FLAGS> 250# <CMAKE_CXX_LINK_FLAGS> 251 252# Static library tools 253# <CMAKE_AR> 254# <CMAKE_RANLIB> 255 256 257# create a shared C++ library 258if(NOT CMAKE_CXX_CREATE_SHARED_LIBRARY) 259 set(CMAKE_CXX_CREATE_SHARED_LIBRARY 260 "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") 261endif() 262 263# create a c++ shared module copy the shared library rule by default 264if(NOT CMAKE_CXX_CREATE_SHARED_MODULE) 265 set(CMAKE_CXX_CREATE_SHARED_MODULE ${CMAKE_CXX_CREATE_SHARED_LIBRARY}) 266endif() 267 268 269# Create a static archive incrementally for large object file counts. 270# If CMAKE_CXX_CREATE_STATIC_LIBRARY is set it will override these. 271if(NOT DEFINED CMAKE_CXX_ARCHIVE_CREATE) 272 set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>") 273endif() 274if(NOT DEFINED CMAKE_CXX_ARCHIVE_APPEND) 275 set(CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>") 276endif() 277if(NOT DEFINED CMAKE_CXX_ARCHIVE_FINISH) 278 set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>") 279endif() 280 281# compile a C++ file into an object file 282if(NOT CMAKE_CXX_COMPILE_OBJECT) 283 set(CMAKE_CXX_COMPILE_OBJECT 284 "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>") 285endif() 286 287if(NOT CMAKE_CXX_LINK_EXECUTABLE) 288 set(CMAKE_CXX_LINK_EXECUTABLE 289 "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>") 290endif() 291 292mark_as_advanced( 293CMAKE_VERBOSE_MAKEFILE 294) 295 296set(CMAKE_CXX_INFORMATION_LOADED 1) 297