xcode.cmake 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. # CMake macOS Xcode module
  2. include_guard(GLOBAL)
  3. set(CMAKE_XCODE_GENERATE_SCHEME TRUE)
  4. # Use a compiler wrapper to enable ccache in Xcode projects
  5. if(ENABLE_CCACHE AND CCACHE_PROGRAM)
  6. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/macos/resources/ccache-launcher-c.in" ccache-launcher-c)
  7. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/macos/resources/ccache-launcher-cxx.in" ccache-launcher-cxx)
  8. execute_process(
  9. COMMAND chmod a+rx "${CMAKE_CURRENT_BINARY_DIR}/ccache-launcher-c" "${CMAKE_CURRENT_BINARY_DIR}/ccache-launcher-cxx"
  10. )
  11. set(CMAKE_XCODE_ATTRIBUTE_CC "${CMAKE_CURRENT_BINARY_DIR}/ccache-launcher-c")
  12. set(CMAKE_XCODE_ATTRIBUTE_CXX "${CMAKE_CURRENT_BINARY_DIR}/ccache-launcher-cxx")
  13. set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_C_COMPILER}")
  14. set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_CXX_COMPILER}")
  15. endif()
  16. # Set project variables
  17. set(CMAKE_XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION ${PLUGIN_BUILD_NUMBER})
  18. set(CMAKE_XCODE_ATTRIBUTE_DYLIB_COMPATIBILITY_VERSION 1.0.0)
  19. set(CMAKE_XCODE_ATTRIBUTE_MARKETING_VERSION ${PLUGIN_VERSION})
  20. # Set deployment target
  21. set(CMAKE_XCODE_ATTRIBUTE_MACOSX_DEPLOYMENT_TARGET ${CMAKE_OSX_DEPLOYMENT_TARGET})
  22. if(NOT CODESIGN_TEAM)
  23. # Switch to manual codesigning if no codesigning team is provided
  24. set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual)
  25. set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${CODESIGN_IDENTITY}")
  26. else()
  27. if(CODESIGN_IDENTITY AND NOT CODESIGN_IDENTITY STREQUAL "-")
  28. # Switch to manual codesigning if a non-adhoc codesigning identity is provided
  29. set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual)
  30. set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${CODESIGN_IDENTITY}")
  31. else()
  32. # Switch to automatic codesigning via valid team ID
  33. set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic)
  34. set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Development")
  35. endif()
  36. set(CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "${CODESIGN_TEAM}")
  37. endif()
  38. # Only create a single Xcode project file
  39. set(CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY TRUE)
  40. # Add all libraries to project link phase (lets Xcode handle linking)
  41. set(CMAKE_XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION)
  42. # Enable codesigning with secure timestamp when not in Debug configuration (required for Notarization)
  43. set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS[variant=Release] "--timestamp")
  44. set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS[variant=RelWithDebInfo] "--timestamp")
  45. set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS[variant=MinSizeRel] "--timestamp")
  46. # Enable codesigning with hardened runtime option when not in Debug configuration (required for Notarization)
  47. set(CMAKE_XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME[variant=Release] YES)
  48. set(CMAKE_XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME[variant=RelWithDebInfo] YES)
  49. set(CMAKE_XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME[variant=MinSizeRel] YES)
  50. # Disable injection of Xcode's base entitlements used for debugging when not in Debug configuration (required for
  51. # Notarization)
  52. set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_INJECT_BASE_ENTITLEMENTS[variant=Release] NO)
  53. set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_INJECT_BASE_ENTITLEMENTS[variant=RelWithDebInfo] NO)
  54. set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_INJECT_BASE_ENTITLEMENTS[variant=MinSizeRel] NO)
  55. # Use Swift version 5.0 by default
  56. set(CMAKE_XCODE_ATTRIBUTE_SWIFT_VERSION 5.0)
  57. # Use DWARF with separate dSYM files when in Release or MinSizeRel configuration.
  58. #
  59. # * Currently overruled by CMake's Xcode generator, requires adding '-g' flag to raw compiler command line for desired
  60. # output configuration. Report to KitWare.
  61. #
  62. set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Debug] dwarf)
  63. set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=RelWithDebInfo] dwarf)
  64. set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Release] dwarf-with-dsym)
  65. set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=MinSizeRel] dwarf-with-dsym)
  66. # Make all symbols hidden by default (currently overriden by CMake's compiler flags)
  67. set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN YES)
  68. set(CMAKE_XCODE_ATTRIBUTE_GCC_INLINES_ARE_PRIVATE_EXTERN YES)
  69. # Strip unused code
  70. set(CMAKE_XCODE_ATTRIBUTE_DEAD_CODE_STRIPPING YES)
  71. # Build active architecture only in Debug configuration
  72. set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH[variant=Debug] YES)
  73. # Enable testability in Debug configuration
  74. set(CMAKE_XCODE_ATTRIBUTE_ENABLE_TESTABILITY[variant=Debug] YES)
  75. # Enable using ARC in ObjC by default
  76. set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES)
  77. # Enable weak references in manual retain release
  78. set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_WEAK YES)
  79. # Disable strict aliasing
  80. set(CMAKE_XCODE_ATTRIBUTE_GCC_STRICT_ALIASING NO)
  81. # Set C++ language default to c17
  82. #
  83. # * CMake explicitly sets the version via compiler flag when transitive dependencies require specific compiler feature
  84. # set, resulting in the flag being added twice. Report to KitWare as a feature request for Xcode generator
  85. # * See also: https://gitlab.kitware.com/cmake/cmake/-/issues/17183
  86. #
  87. # set(CMAKE_XCODE_ATTRIBUTE_GCC_C_LANGUAGE_STANDARD c17)
  88. #
  89. # Set C++ language default to c++17
  90. #
  91. # * See above. Report to KitWare as a feature request for Xcode generator
  92. #
  93. # set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD c++17)
  94. # Enable support for module imports in ObjC
  95. set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES YES)
  96. # Enable automatic linking of imported modules in ObjC
  97. set(CMAKE_XCODE_ATTRIBUTE_CLANG_MODULES_AUTOLINK YES)
  98. # Enable strict msg_send rules for ObjC
  99. set(CMAKE_XCODE_ATTRIBUTE_ENABLE_STRICT_OBJC_MSGSEND YES)
  100. # Set default warnings for ObjC and C++
  101. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING YES_ERROR)
  102. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_BOOL_CONVERSION YES)
  103. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS YES)
  104. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_COMMA YES)
  105. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_CONSTANT_CONVERSION YES)
  106. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_EMPTY_BODY YES)
  107. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_ENUM_CONVERSION YES)
  108. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_INFINITE_RECURSION YES)
  109. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_INT_CONVERSION YES)
  110. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_NON_LITERAL_NULL_CONVERSION YES)
  111. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF YES)
  112. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_OBJC_LITERAL_CONVERSION YES)
  113. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK YES)
  114. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER YES)
  115. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_RANGE_LOOP_ANALYSIS YES)
  116. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_STRICT_PROTOTYPES NO)
  117. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION NO)
  118. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_SUSPICIOUS_MOVE YES)
  119. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_UNREACHABLE_CODE YES)
  120. set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN__DUPLICATE_METHOD_MATCH YES)
  121. # Set default warnings for C and C++
  122. set(CMAKE_XCODE_ATTRIBUTE_GCC_NO_COMMON_BLOCKS YES)
  123. set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_64_TO_32_BIT_CONVERSION YES)
  124. set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS NO)
  125. set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_ABOUT_MISSING_NEWLINE YES)
  126. set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_ABOUT_RETURN_TYPE YES_ERROR)
  127. set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_CHECK_SWITCH_STATEMENTS YES)
  128. set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_FOUR_CHARACTER_CONSTANTS YES)
  129. set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_SHADOW NO)
  130. set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_SIGN_COMPARE YES)
  131. set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_TYPECHECK_CALLS_TO_PRINTF YES)
  132. set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNDECLARED_SELECTOR YES)
  133. set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNINITIALIZED_AUTOS YES)
  134. set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_FUNCTION NO)
  135. set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_PARAMETER YES)
  136. set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_VALUE YES)
  137. set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_VARIABLE YES)
  138. # Add additional warning compiler flags
  139. set(CMAKE_XCODE_ATTRIBUTE_WARNING_CFLAGS "-Wvla -Wformat-security")
  140. if(CMAKE_COMPILE_WARNING_AS_ERROR)
  141. set(CMAKE_XCODE_ATTRIBUTE_GCC_TREAT_WARNINGS_AS_ERRORS YES)
  142. endif()
  143. # Enable color diagnostics
  144. set(CMAKE_COLOR_DIAGNOSTICS TRUE)
  145. # Disable usage of RPATH in build or install configurations
  146. set(CMAKE_SKIP_RPATH TRUE)
  147. # Have Xcode set default RPATH entries
  148. set(CMAKE_XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../Frameworks")