Configurations.cmake 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #
  2. # Copyright (c) Contributors to the Open 3D Engine Project.
  3. # For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. #
  5. # SPDX-License-Identifier: Apache-2.0 OR MIT
  6. #
  7. #
  8. include_guard(GLOBAL)
  9. # LY_CONFIGURATION_TYPES defines all the configuration types that O3DE supports
  10. # We dont set CMAKE_CONFIGURATION_TYPES directly because we want to be able to configure which
  11. # configuration types are supported in an SDK installation. SDK installations will fill a
  12. # CMAKE_CONFIGURATION_TYPES based on the configurations that were generated during the install process.
  13. # ly_append_configurations_options depends on LY_CONFIGURATION_TYPES being
  14. # set in order to successfully parse the arguments. Even for non-multi-config
  15. # generators, it needs to be set.
  16. set(LY_CONFIGURATION_TYPES "debug;profile;release" CACHE STRING "" FORCE)
  17. include(cmake/ConfigurationTypes.cmake)
  18. #! ly_append_configurations_options: adds options to the different configurations (debug, profile, release, etc)
  19. #
  20. # \arg:DEFINES
  21. # \arg:DEFINES_${CONFIGURATION}
  22. # \arg:COMPILATION
  23. # \arg:COMPILATION_${CONFIGURATION}
  24. # \arg:LINK
  25. # \arg:LINK_${CONFIGURATION}
  26. # \arg:LINK_STATIC
  27. # \arg:LINK_STATIC_${CONFIGURATION}
  28. # \arg:LINK_NON_STATIC
  29. # \arg:LINK_NON_STATIC_${CONFIGURATION}
  30. # \arg:LINK_EXE
  31. # \arg:LINK_EXE_${CONFIGURATION}
  32. # \arg:LINK_MODULE
  33. # \arg:LINK_MODULE_${CONFIGURATION}
  34. # \arg:LINK_SHARED
  35. # \arg:LINK_SHARED_${CONFIGURATION}
  36. #
  37. function(ly_append_configurations_options)
  38. set(options)
  39. set(oneValueArgs)
  40. set(multiArgs
  41. DEFINES
  42. COMPILATION
  43. LINK
  44. LINK_STATIC
  45. LINK_NON_STATIC
  46. LINK_EXE
  47. LINK_MODULE
  48. LINK_SHARED
  49. )
  50. foreach(arg IN LISTS multiArgs)
  51. list(APPEND multiValueArgs ${arg})
  52. # we parse the parameters based on all configuration types so unknown configurations
  53. # are not passed as values to other parameters
  54. foreach(conf IN LISTS LY_CONFIGURATION_TYPES)
  55. string(TOUPPER ${conf} UCONF)
  56. list(APPEND multiValueArgs ${arg}_${UCONF})
  57. endforeach()
  58. endforeach()
  59. cmake_parse_arguments(ly_append_configurations_options "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  60. if(ly_append_configurations_options_DEFINES)
  61. add_compile_definitions(${ly_append_configurations_options_DEFINES})
  62. endif()
  63. if(ly_append_configurations_options_COMPILATION)
  64. string(REPLACE ";" " " COMPILATION_STR "${ly_append_configurations_options_COMPILATION}")
  65. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILATION_STR}" PARENT_SCOPE)
  66. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILATION_STR}" PARENT_SCOPE)
  67. endif()
  68. if(ly_append_configurations_options_LINK)
  69. string(REPLACE ";" " " LINK_STR "${ly_append_configurations_options_LINK}")
  70. set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} ${LINK_STR}" PARENT_SCOPE)
  71. set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LINK_STR}" PARENT_SCOPE)
  72. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LINK_STR}" PARENT_SCOPE)
  73. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LINK_OPTIONS}" PARENT_SCOPE)
  74. endif()
  75. if(ly_append_configurations_options_LINK_STATIC)
  76. string(REPLACE ";" " " LINK_STR "${ly_append_configurations_options_LINK_STATIC}")
  77. set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} ${LINK_STR}" PARENT_SCOPE)
  78. endif()
  79. if(ly_append_configurations_options_LINK_NON_STATIC)
  80. string(REPLACE ";" " " LINK_STR "${ly_append_configurations_options_LINK_NON_STATIC}")
  81. set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LINK_STR}" PARENT_SCOPE)
  82. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LINK_STR}" PARENT_SCOPE)
  83. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LINK_STR}" PARENT_SCOPE)
  84. endif()
  85. if(ly_append_configurations_options_LINK_EXE)
  86. string(REPLACE ";" " " LINK_STR "${ly_append_configurations_options_LINK_EXE}")
  87. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LINK_STR}" PARENT_SCOPE)
  88. endif()
  89. if(ly_append_configurations_options_LINK_MODULE)
  90. string(REPLACE ";" " " LINK_STR "${ly_append_configurations_options_LINK_MODULE}")
  91. set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LINK_STR}" PARENT_SCOPE)
  92. endif()
  93. if(ly_append_configurations_options_LINK_SHARED)
  94. string(REPLACE ";" " " LINK_STR "${ly_append_configurations_options_LINK_SHARED}")
  95. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LINK_STR}" PARENT_SCOPE)
  96. endif()
  97. # We only iterate for the actual configuration types
  98. foreach(conf IN LISTS CMAKE_CONFIGURATION_TYPES)
  99. string(TOUPPER ${conf} UCONF)
  100. if(ly_append_configurations_options_DEFINES_${UCONF})
  101. #Transform defines using generator expressions
  102. list(TRANSFORM ly_append_configurations_options_DEFINES_${UCONF} REPLACE "^.+$" "$<$<CONFIG:${conf}>:\\0>"
  103. OUTPUT_VARIABLE DEFINES_${UCONF}_GENEX)
  104. add_compile_definitions(${DEFINES_${UCONF}_GENEX})
  105. endif()
  106. if(ly_append_configurations_options_COMPILATION_${UCONF})
  107. string(REPLACE ";" " " COMPILATION_STR "${ly_append_configurations_options_COMPILATION_${UCONF}}")
  108. set(CMAKE_C_FLAGS_${UCONF} "${CMAKE_C_FLAGS_${UCONF}} ${COMPILATION_STR}" PARENT_SCOPE)
  109. set(CMAKE_CXX_FLAGS_${UCONF} "${CMAKE_CXX_FLAGS_${UCONF}} ${COMPILATION_STR}" PARENT_SCOPE)
  110. endif()
  111. if(ly_append_configurations_options_LINK_${UCONF})
  112. string(REPLACE ";" " " LINK_STR "${ly_append_configurations_options_LINK_${UCONF}}")
  113. set(CMAKE_STATIC_LINKER_FLAGS_${UCONF} "${CMAKE_STATIC_LINKER_FLAGS_${UCONF}} ${LINK_STR}" PARENT_SCOPE)
  114. set(CMAKE_MODULE_LINKER_FLAGS_${UCONF} "${CMAKE_MODULE_LINKER_FLAGS_${UCONF}} ${LINK_STR}" PARENT_SCOPE)
  115. set(CMAKE_SHARED_LINKER_FLAGS_${UCONF} "${CMAKE_SHARED_LINKER_FLAGS_${UCONF}} ${LINK_STR}" PARENT_SCOPE)
  116. set(CMAKE_EXE_LINKER_FLAGS_${UCONF} "${CMAKE_EXE_LINKER_FLAGS_${UCONF}} ${LINK_STR}" PARENT_SCOPE)
  117. endif()
  118. if(ly_append_configurations_options_LINK_STATIC_${UCONF})
  119. string(REPLACE ";" " " LINK_STR "${ly_append_configurations_options_LINK_STATIC_${UCONF}}")
  120. set(CMAKE_STATIC_LINKER_FLAGS_${UCONF} "${CMAKE_STATIC_LINKER_FLAGS_${UCONF}} ${LINK_STR}" PARENT_SCOPE)
  121. endif()
  122. if(ly_append_configurations_options_LINK_NON_STATIC_${UCONF})
  123. string(REPLACE ";" " " LINK_STR "${ly_append_configurations_options_LINK_NON_STATIC_${UCONF}}")
  124. set(CMAKE_MODULE_LINKER_FLAGS_${UCONF} "${CMAKE_MODULE_LINKER_FLAGS_${UCONF}} ${LINK_STR}" PARENT_SCOPE)
  125. set(CMAKE_SHARED_LINKER_FLAGS_${UCONF} "${CMAKE_SHARED_LINKER_FLAGS_${UCONF}} ${LINK_STR}" PARENT_SCOPE)
  126. set(CMAKE_EXE_LINKER_FLAGS_${UCONF} "${CMAKE_EXE_LINKER_FLAGS_${UCONF}} ${LINK_STR}" PARENT_SCOPE)
  127. endif()
  128. if(ly_append_configurations_options_LINK_EXE_${UCONF})
  129. string(REPLACE ";" " " LINK_STR "${ly_append_configurations_options_LINK_EXE_${UCONF}}")
  130. set(CMAKE_EXE_LINKER_FLAGS_${UCONF} "${CMAKE_EXE_LINKER_FLAGS_${UCONF}} ${LINK_STR}" PARENT_SCOPE)
  131. endif()
  132. if(ly_append_configurations_options_LINK_MODULE_${UCONF})
  133. string(REPLACE ";" " " LINK_STR "${ly_append_configurations_options_LINK_MODULE_${UCONF}}")
  134. set(CMAKE_MODULE_LINKER_FLAGS_${UCONF} "${CMAKE_MODULE_LINKER_FLAGS_${UCONF}} ${LINK_STR}" PARENT_SCOPE)
  135. endif()
  136. endforeach()
  137. endfunction()
  138. # Set the C++ standard that is being targeted to C++17
  139. set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ Standard to target")
  140. ly_set(CMAKE_CXX_STANDARD_REQUIRED ON)
  141. get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
  142. if(NOT _isMultiConfig)
  143. # No reason set CMAKE_BUILD_TYPE if it's a multiconfig generator.
  144. if(NOT CMAKE_BUILD_TYPE)
  145. message("No build type specified (CMAKE_BUILD_TYPE), defaulting to profile build")
  146. set(CMAKE_BUILD_TYPE profile CACHE STRING "" FORCE)
  147. endif()
  148. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY HELPSTRING "Type of build (debug|profile|release)")
  149. # set options for cmake-gui
  150. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "debug;profile;release")
  151. endif()
  152. unset(_isMultiConfig)
  153. # Now these CMake variables are cleared out in the cache here.
  154. # This must be done before including the Platform specific Configurations_<platform>.cmake files as non-standard configurations
  155. # such as profile doesn't already have a cache version of these variable.
  156. # For configurations such as debug and release, the CMake internal module files initialize variable such as
  157. # CMAKE_EXE_LINKER_FLAGS_DEBUG and CMAKE_EXE_LINKER_FLAGS_RELEASE, so the set call below for those CACHE variables do nothing.
  158. # But for profile this defines the cache variable for the first time, therefore allowing the ly_append_configurations_options() function
  159. # to append to the CMAKE_*_LINKER_FLAGS_PROFILE variables in the parent scope when it runs
  160. foreach(conf IN LISTS CMAKE_CONFIGURATION_TYPES)
  161. string(TOUPPER ${conf} UCONF)
  162. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${UCONF} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${conf} CACHE PATH "Installation directory for ${conf} ar")
  163. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${UCONF} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${conf} CACHE PATH "Installation directory for ${conf} libraries")
  164. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${UCONF} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${conf} CACHE PATH "Installation directory for ${conf} executables")
  165. set(CMAKE_STATIC_LINKER_FLAGS_${UCONF} CACHE STRING "Flags to pass to the archiver for ${conf}")
  166. set(CMAKE_MODULE_LINKER_FLAGS_${UCONF} CACHE STRING "Flags to pass to the linker when creating a module library for ${conf}")
  167. set(CMAKE_SHARED_LINKER_FLAGS_${UCONF} CACHE STRING "Flags to pass to the linker when creating a shared library for ${conf}")
  168. set(CMAKE_EXE_LINKER_FLAGS_${UCONF} CACHE STRING "Flags to pass to the linker when creating an executable for ${conf}")
  169. endforeach()
  170. # flags are defined per platform, follow platform files under Platform/<PlatformName>/Configurations_<platformname>.cmake
  171. ly_get_absolute_pal_filename(pal_dir ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Platform/${PAL_PLATFORM_NAME})
  172. include(${pal_dir}/Configurations_${PAL_PLATFORM_NAME_LOWERCASE}.cmake)