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 Objective-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 15set(CMAKE_OBJCXX_OUTPUT_EXTENSION .o) 16 17set(_INCLUDED_FILE 0) 18 19# Load compiler-specific information. 20if(CMAKE_OBJCXX_COMPILER_ID) 21 include(Compiler/${CMAKE_OBJCXX_COMPILER_ID}-OBJCXX OPTIONAL) 22endif() 23 24set(CMAKE_BASE_NAME) 25get_filename_component(CMAKE_BASE_NAME "${CMAKE_OBJCXX_COMPILER}" NAME_WE) 26# since the gnu compiler has several names force g++ 27if(CMAKE_COMPILER_IS_GNUOBJCXX) 28 set(CMAKE_BASE_NAME g++) 29endif() 30 31 32# load a hardware specific file, mostly useful for embedded compilers 33if(CMAKE_SYSTEM_PROCESSOR) 34 if(CMAKE_OBJCXX_COMPILER_ID) 35 include(Platform/${CMAKE_EFFECTIVE_SYSTEM_NAME}-${CMAKE_OBJCXX_COMPILER_ID}-OBJCXX-${CMAKE_SYSTEM_PROCESSOR} OPTIONAL RESULT_VARIABLE _INCLUDED_FILE) 36 endif() 37 if (NOT _INCLUDED_FILE) 38 include(Platform/${CMAKE_EFFECTIVE_SYSTEM_NAME}-${CMAKE_BASE_NAME}-${CMAKE_SYSTEM_PROCESSOR} OPTIONAL) 39 endif () 40endif() 41 42# load the system- and compiler specific files 43if(CMAKE_OBJCXX_COMPILER_ID) 44 include(Platform/${CMAKE_EFFECTIVE_SYSTEM_NAME}-${CMAKE_OBJCXX_COMPILER_ID}-OBJCXX OPTIONAL RESULT_VARIABLE _INCLUDED_FILE) 45endif() 46if (NOT _INCLUDED_FILE) 47 include(Platform/${CMAKE_EFFECTIVE_SYSTEM_NAME}-${CMAKE_BASE_NAME} OPTIONAL 48 RESULT_VARIABLE _INCLUDED_FILE) 49endif () 50 51# load any compiler-wrapper specific information 52if (CMAKE_OBJCXX_COMPILER_WRAPPER) 53 __cmake_include_compiler_wrapper(OBJCXX) 54endif () 55 56# We specify the compiler information in the system file for some 57# platforms, but this language may not have been enabled when the file 58# was first included. Include it again to get the language info. 59# Remove this when all compiler info is removed from system files. 60if (NOT _INCLUDED_FILE) 61 include(Platform/${CMAKE_SYSTEM_NAME} OPTIONAL) 62endif () 63 64if(CMAKE_OBJCXX_SIZEOF_DATA_PTR) 65 foreach(f ${CMAKE_OBJCXX_ABI_FILES}) 66 include(${f}) 67 endforeach() 68 unset(CMAKE_OBJCXX_ABI_FILES) 69endif() 70 71# This should be included before the _INIT variables are 72# used to initialize the cache. Since the rule variables 73# have if blocks on them, users can still define them here. 74# But, it should still be after the platform file so changes can 75# be made to those values. 76 77if(CMAKE_USER_MAKE_RULES_OVERRIDE) 78 # Save the full path of the file so try_compile can use it. 79 include(${CMAKE_USER_MAKE_RULES_OVERRIDE} RESULT_VARIABLE _override) 80 set(CMAKE_USER_MAKE_RULES_OVERRIDE "${_override}") 81endif() 82 83if(CMAKE_USER_MAKE_RULES_OVERRIDE_OBJCXX) 84 # Save the full path of the file so try_compile can use it. 85 include(${CMAKE_USER_MAKE_RULES_OVERRIDE_OBJCXX} RESULT_VARIABLE _override) 86 set(CMAKE_USER_MAKE_RULES_OVERRIDE_OBJCXX "${_override}") 87endif() 88 89 90# Create a set of shared library variable specific to Objective-C++ 91# For 90% of the systems, these are the same flags as the Objective-C versions 92# so if these are not set just copy the flags from the Objective-C version 93if(NOT CMAKE_SHARED_LIBRARY_CREATE_OBJCXX_FLAGS) 94 set(CMAKE_SHARED_LIBRARY_CREATE_OBJCXX_FLAGS ${CMAKE_SHARED_LIBRARY_CREATE_OBJC_FLAGS}) 95endif() 96 97if(NOT CMAKE_OBJCXX_COMPILE_OPTIONS_PIC) 98 set(CMAKE_OBJCXX_COMPILE_OPTIONS_PIC ${CMAKE_OBJC_COMPILE_OPTIONS_PIC}) 99endif() 100 101if(NOT CMAKE_OBJCXX_COMPILE_OPTIONS_PIE) 102 set(CMAKE_OBJCXX_COMPILE_OPTIONS_PIE ${CMAKE_OBJC_COMPILE_OPTIONS_PIE}) 103endif() 104if(NOT CMAKE_OBJCXX_LINK_OPTIONS_PIE) 105 set(CMAKE_OBJCXX_LINK_OPTIONS_PIE ${CMAKE_OBJC_LINK_OPTIONS_PIE}) 106endif() 107if(NOT CMAKE_OBJCXX_LINK_OPTIONS_NO_PIE) 108 set(CMAKE_OBJCXX_LINK_OPTIONS_NO_PIE ${CMAKE_OBJC_LINK_OPTIONS_NO_PIE}) 109endif() 110 111if(NOT CMAKE_OBJCXX_COMPILE_OPTIONS_DLL) 112 set(CMAKE_OBJCXX_COMPILE_OPTIONS_DLL ${CMAKE_OBJC_COMPILE_OPTIONS_DLL}) 113endif() 114 115if(NOT CMAKE_SHARED_LIBRARY_OBJCXX_FLAGS) 116 set(CMAKE_SHARED_LIBRARY_OBJCXX_FLAGS ${CMAKE_SHARED_LIBRARY_OBJC_FLAGS}) 117endif() 118 119if(NOT DEFINED CMAKE_SHARED_LIBRARY_LINK_OBJCXX_FLAGS) 120 set(CMAKE_SHARED_LIBRARY_LINK_OBJCXX_FLAGS ${CMAKE_SHARED_LIBRARY_LINK_OBJC_FLAGS}) 121endif() 122 123if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_OBJCXX_FLAG) 124 set(CMAKE_SHARED_LIBRARY_RUNTIME_OBJCXX_FLAG ${CMAKE_SHARED_LIBRARY_RUNTIME_OBJC_FLAG}) 125endif() 126 127if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_OBJCXX_FLAG_SEP) 128 set(CMAKE_SHARED_LIBRARY_RUNTIME_OBJCXX_FLAG_SEP ${CMAKE_SHARED_LIBRARY_RUNTIME_OBJC_FLAG_SEP}) 129endif() 130 131if(NOT CMAKE_SHARED_LIBRARY_RPATH_LINK_OBJCXX_FLAG) 132 set(CMAKE_SHARED_LIBRARY_RPATH_LINK_OBJCXX_FLAG ${CMAKE_SHARED_LIBRARY_RPATH_LINK_OBJC_FLAG}) 133endif() 134 135if(NOT DEFINED CMAKE_EXE_EXPORTS_OBJCXX_FLAG) 136 set(CMAKE_EXE_EXPORTS_OBJCXX_FLAG ${CMAKE_EXE_EXPORTS_OBJC_FLAG}) 137endif() 138 139if(NOT DEFINED CMAKE_SHARED_LIBRARY_SONAME_OBJCXX_FLAG) 140 set(CMAKE_SHARED_LIBRARY_SONAME_OBJCXX_FLAG ${CMAKE_SHARED_LIBRARY_SONAME_OBJC_FLAG}) 141endif() 142 143if(NOT CMAKE_EXECUTABLE_RUNTIME_OBJCXX_FLAG) 144 set(CMAKE_EXECUTABLE_RUNTIME_OBJCXX_FLAG ${CMAKE_SHARED_LIBRARY_RUNTIME_OBJCXX_FLAG}) 145endif() 146 147if(NOT CMAKE_EXECUTABLE_RUNTIME_OBJCXX_FLAG_SEP) 148 set(CMAKE_EXECUTABLE_RUNTIME_OBJCXX_FLAG_SEP ${CMAKE_SHARED_LIBRARY_RUNTIME_OBJCXX_FLAG_SEP}) 149endif() 150 151if(NOT CMAKE_EXECUTABLE_RPATH_LINK_OBJCXX_FLAG) 152 set(CMAKE_EXECUTABLE_RPATH_LINK_OBJCXX_FLAG ${CMAKE_SHARED_LIBRARY_RPATH_LINK_OBJCXX_FLAG}) 153endif() 154 155if(NOT DEFINED CMAKE_SHARED_LIBRARY_LINK_OBJCXX_WITH_RUNTIME_PATH) 156 set(CMAKE_SHARED_LIBRARY_LINK_OBJCXX_WITH_RUNTIME_PATH ${CMAKE_SHARED_LIBRARY_LINK_OBJC_WITH_RUNTIME_PATH}) 157endif() 158 159if(NOT CMAKE_INCLUDE_FLAG_OBJCXX) 160 set(CMAKE_INCLUDE_FLAG_OBJCXX ${CMAKE_INCLUDE_FLAG_C}) 161endif() 162 163# for most systems a module is the same as a shared library 164# so unless the variable CMAKE_MODULE_EXISTS is set just 165# copy the values from the LIBRARY variables 166if(NOT CMAKE_MODULE_EXISTS) 167 set(CMAKE_SHARED_MODULE_OBJCXX_FLAGS ${CMAKE_SHARED_LIBRARY_OBJCXX_FLAGS}) 168 set(CMAKE_SHARED_MODULE_CREATE_OBJCXX_FLAGS ${CMAKE_SHARED_LIBRARY_CREATE_OBJCXX_FLAGS}) 169endif() 170 171# repeat for modules 172if(NOT CMAKE_SHARED_MODULE_CREATE_OBJCXX_FLAGS) 173 set(CMAKE_SHARED_MODULE_CREATE_OBJCXX_FLAGS ${CMAKE_SHARED_MODULE_CREATE_OBJC_FLAGS}) 174endif() 175 176if(NOT CMAKE_SHARED_MODULE_OBJCXX_FLAGS) 177 set(CMAKE_SHARED_MODULE_OBJCXX_FLAGS ${CMAKE_SHARED_MODULE_OBJC_FLAGS}) 178endif() 179 180# Initialize OBJCXX link type selection flags from OBJC versions. 181foreach(type SHARED_LIBRARY SHARED_MODULE EXE) 182 if(NOT CMAKE_${type}_LINK_STATIC_OBJCXX_FLAGS) 183 set(CMAKE_${type}_LINK_STATIC_OBJCXX_FLAGS 184 ${CMAKE_${type}_LINK_STATIC_OBJC_FLAGS}) 185 endif() 186 if(NOT CMAKE_${type}_LINK_DYNAMIC_OBJCXX_FLAGS) 187 set(CMAKE_${type}_LINK_DYNAMIC_OBJCXX_FLAGS 188 ${CMAKE_${type}_LINK_DYNAMIC_OBJC_FLAGS}) 189 endif() 190endforeach() 191 192if(CMAKE_EXECUTABLE_FORMAT STREQUAL "ELF") 193 if(NOT DEFINED CMAKE_OBJCXX_LINK_WHAT_YOU_USE_FLAG) 194 set(CMAKE_OBJCXX_LINK_WHAT_YOU_USE_FLAG "LINKER:--no-as-needed") 195 endif() 196 if(NOT DEFINED CMAKE_LINK_WHAT_YOU_USE_CHECK) 197 set(CMAKE_LINK_WHAT_YOU_USE_CHECK ldd -u -r) 198 endif() 199endif() 200 201# add the flags to the cache based 202# on the initial values computed in the platform/*.cmake files 203# use _INIT variables so that this only happens the first time 204# and you can set these flags in the cmake cache 205set(CMAKE_OBJCXX_FLAGS_INIT "$ENV{OBJCXXFLAGS} ${CMAKE_OBJCXX_FLAGS_INIT}") 206 207cmake_initialize_per_config_variable(CMAKE_OBJCXX_FLAGS "Flags used by the Objective-C++ compiler") 208 209if(CMAKE_OBJCXX_STANDARD_LIBRARIES_INIT) 210 set(CMAKE_OBJCXX_STANDARD_LIBRARIES "${CMAKE_OBJCXX_STANDARD_LIBRARIES_INIT}" 211 CACHE STRING "Libraries linked by default with all Objective-C++ applications.") 212 mark_as_advanced(CMAKE_OBJCXX_STANDARD_LIBRARIES) 213endif() 214 215if(NOT CMAKE_OBJCXX_COMPILER_LAUNCHER AND DEFINED ENV{CMAKE_OBJCXX_COMPILER_LAUNCHER}) 216 set(CMAKE_OBJCXX_COMPILER_LAUNCHER "$ENV{CMAKE_OBJCXX_COMPILER_LAUNCHER}" 217 CACHE STRING "Compiler launcher for OBJCXX.") 218endif() 219 220if(NOT CMAKE_OBJCXX_LINKER_LAUNCHER AND DEFINED ENV{CMAKE_OBJCXX_LINKER_LAUNCHER}) 221 set(CMAKE_OBJCXX_LINKER_LAUNCHER "$ENV{CMAKE_OBJCXX_LINKER_LAUNCHER}" 222 CACHE STRING "Linker launcher for OBJCXX.") 223endif() 224 225include(CMakeCommonLanguageInclude) 226 227# now define the following rules: 228# CMAKE_OBJCXX_CREATE_SHARED_LIBRARY 229# CMAKE_OBJCXX_CREATE_SHARED_MODULE 230# CMAKE_OBJCXX_COMPILE_OBJECT 231# CMAKE_OBJCXX_LINK_EXECUTABLE 232 233# variables supplied by the generator at use time 234# <TARGET> 235# <TARGET_BASE> the target without the suffix 236# <OBJECTS> 237# <OBJECT> 238# <LINK_LIBRARIES> 239# <FLAGS> 240# <LINK_FLAGS> 241 242# Objective-C++ compiler information 243# <CMAKE_OBJCXX_COMPILER> 244# <CMAKE_SHARED_LIBRARY_CREATE_OBJCXX_FLAGS> 245# <CMAKE_OBJCXX_SHARED_MODULE_CREATE_FLAGS> 246# <CMAKE_OBJCXX_LINK_FLAGS> 247 248# Static library tools 249# <CMAKE_AR> 250# <CMAKE_RANLIB> 251 252 253# create a shared Objective-C++ library 254if(NOT CMAKE_OBJCXX_CREATE_SHARED_LIBRARY) 255 set(CMAKE_OBJCXX_CREATE_SHARED_LIBRARY 256 "<CMAKE_OBJCXX_COMPILER> <CMAKE_SHARED_LIBRARY_OBJCXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_OBJCXX_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") 257endif() 258 259# create an Objective-C++ shared module copy the shared library rule by default 260if(NOT CMAKE_OBJCXX_CREATE_SHARED_MODULE) 261 set(CMAKE_OBJCXX_CREATE_SHARED_MODULE ${CMAKE_OBJCXX_CREATE_SHARED_LIBRARY}) 262endif() 263 264 265# Create a static archive incrementally for large object file counts. 266# If CMAKE_OBJCXX_CREATE_STATIC_LIBRARY is set it will override these. 267if(NOT DEFINED CMAKE_OBJCXX_ARCHIVE_CREATE) 268 set(CMAKE_OBJCXX_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>") 269endif() 270if(NOT DEFINED CMAKE_OBJCXX_ARCHIVE_APPEND) 271 set(CMAKE_OBJCXX_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>") 272endif() 273if(NOT DEFINED CMAKE_OBJCXX_ARCHIVE_FINISH) 274 set(CMAKE_OBJCXX_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>") 275endif() 276 277# compile an Objective-C++ file into an object file 278if(NOT CMAKE_OBJCXX_COMPILE_OBJECT) 279 set(CMAKE_OBJCXX_COMPILE_OBJECT 280 "<CMAKE_OBJCXX_COMPILER> <DEFINES> <INCLUDES> -x objective-c++ <FLAGS> -o <OBJECT> -c <SOURCE>") 281endif() 282 283if(NOT CMAKE_OBJCXX_LINK_EXECUTABLE) 284 set(CMAKE_OBJCXX_LINK_EXECUTABLE 285 "<CMAKE_OBJCXX_COMPILER> <FLAGS> <CMAKE_OBJCXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>") 286endif() 287 288mark_as_advanced( 289CMAKE_VERBOSE_MAKEFILE 290) 291 292set(CMAKE_OBJCXX_INFORMATION_LOADED 1) 293