2
0

tools.cmake 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. # Copyright The OpenTelemetry Authors
  2. # SPDX-License-Identifier: Apache-2.0
  3. macro(check_append_cxx_compiler_flag OUTPUT_VAR)
  4. foreach(CHECK_FLAG ${ARGN})
  5. check_cxx_compiler_flag(${CHECK_FLAG}
  6. "check_cxx_compiler_flag_${CHECK_FLAG}")
  7. if(check_cxx_compiler_flag_${CHECK_FLAG})
  8. list(APPEND ${OUTPUT_VAR} ${CHECK_FLAG})
  9. endif()
  10. endforeach()
  11. endmacro()
  12. if(NOT PATCH_PROTOBUF_SOURCES_OPTIONS_SET)
  13. if(MSVC)
  14. unset(PATCH_PROTOBUF_SOURCES_OPTIONS CACHE)
  15. set(PATCH_PROTOBUF_SOURCES_OPTIONS
  16. /wd4244
  17. /wd4251
  18. /wd4267
  19. /wd4309
  20. /wd4668
  21. /wd4946
  22. /wd6001
  23. /wd6244
  24. /wd6246)
  25. if(MSVC_VERSION GREATER_EQUAL 1922)
  26. # see
  27. # https://docs.microsoft.com/en-us/cpp/overview/cpp-conformance-improvements?view=vs-2019#improvements_162
  28. # for detail
  29. list(APPEND PATCH_PROTOBUF_SOURCES_OPTIONS /wd5054)
  30. endif()
  31. if(MSVC_VERSION GREATER_EQUAL 1925)
  32. list(APPEND PATCH_PROTOBUF_SOURCES_OPTIONS /wd4996)
  33. endif()
  34. if(MSVC_VERSION LESS 1910)
  35. list(APPEND PATCH_PROTOBUF_SOURCES_OPTIONS /wd4800)
  36. endif()
  37. else()
  38. unset(PATCH_PROTOBUF_SOURCES_OPTIONS CACHE)
  39. include(CheckCXXCompilerFlag)
  40. check_append_cxx_compiler_flag(
  41. PATCH_PROTOBUF_SOURCES_OPTIONS -Wno-type-limits
  42. -Wno-deprecated-declarations -Wno-unused-parameter)
  43. endif()
  44. set(PATCH_PROTOBUF_SOURCES_OPTIONS_SET TRUE)
  45. if(PATCH_PROTOBUF_SOURCES_OPTIONS)
  46. set(PATCH_PROTOBUF_SOURCES_OPTIONS
  47. ${PATCH_PROTOBUF_SOURCES_OPTIONS}
  48. CACHE INTERNAL
  49. "Options to disable warning of generated protobuf sources" FORCE)
  50. endif()
  51. endif()
  52. function(patch_protobuf_sources)
  53. if(PATCH_PROTOBUF_SOURCES_OPTIONS)
  54. foreach(PROTO_SRC ${ARGN})
  55. unset(PROTO_SRC_OPTIONS)
  56. get_source_file_property(PROTO_SRC_OPTIONS ${PROTO_SRC} COMPILE_OPTIONS)
  57. if(PROTO_SRC_OPTIONS)
  58. list(APPEND PROTO_SRC_OPTIONS ${PATCH_PROTOBUF_SOURCES_OPTIONS})
  59. else()
  60. set(PROTO_SRC_OPTIONS ${PATCH_PROTOBUF_SOURCES_OPTIONS})
  61. endif()
  62. set_source_files_properties(
  63. ${PROTO_SRC} PROPERTIES COMPILE_OPTIONS "${PROTO_SRC_OPTIONS}")
  64. endforeach()
  65. unset(PROTO_SRC)
  66. unset(PROTO_SRC_OPTIONS)
  67. endif()
  68. endfunction()
  69. function(patch_protobuf_targets)
  70. if(PATCH_PROTOBUF_SOURCES_OPTIONS)
  71. foreach(PROTO_TARGET ${ARGN})
  72. unset(PROTO_TARGET_OPTIONS)
  73. get_target_property(PROTO_TARGET_OPTIONS ${PROTO_TARGET} COMPILE_OPTIONS)
  74. if(PROTO_TARGET_OPTIONS)
  75. list(APPEND PROTO_TARGET_OPTIONS ${PATCH_PROTOBUF_SOURCES_OPTIONS})
  76. else()
  77. set(PROTO_TARGET_OPTIONS ${PATCH_PROTOBUF_SOURCES_OPTIONS})
  78. endif()
  79. set_target_properties(
  80. ${PROTO_TARGET} PROPERTIES COMPILE_OPTIONS "${PROTO_TARGET_OPTIONS}")
  81. endforeach()
  82. unset(PROTO_TARGET)
  83. unset(PROTO_TARGET_OPTIONS)
  84. endif()
  85. endfunction()
  86. function(project_build_tools_get_imported_location OUTPUT_VAR_NAME TARGET_NAME)
  87. # The following if statement was added to support cmake versions < 3.19
  88. get_target_property(TARGET_TYPE ${TARGET_NAME} TYPE)
  89. if(TARGET_TYPE STREQUAL "INTERFACE_LIBRARY")
  90. # For interface libraries, do not attempt to retrieve imported location.
  91. set(${OUTPUT_VAR_NAME} "" PARENT_SCOPE)
  92. return()
  93. endif()
  94. if(CMAKE_BUILD_TYPE)
  95. string(TOUPPER "IMPORTED_LOCATION_${CMAKE_BUILD_TYPE}"
  96. TRY_SPECIFY_IMPORTED_LOCATION)
  97. get_target_property(${OUTPUT_VAR_NAME} ${TARGET_NAME}
  98. ${TRY_SPECIFY_IMPORTED_LOCATION})
  99. endif()
  100. if(NOT ${OUTPUT_VAR_NAME})
  101. get_target_property(${OUTPUT_VAR_NAME} ${TARGET_NAME} IMPORTED_LOCATION)
  102. endif()
  103. if(NOT ${OUTPUT_VAR_NAME})
  104. get_target_property(
  105. project_build_tools_get_imported_location_IMPORTED_CONFIGURATIONS
  106. ${TARGET_NAME} IMPORTED_CONFIGURATIONS)
  107. foreach(
  108. project_build_tools_get_imported_location_IMPORTED_CONFIGURATION IN
  109. LISTS project_build_tools_get_imported_location_IMPORTED_CONFIGURATIONS)
  110. get_target_property(
  111. ${OUTPUT_VAR_NAME}
  112. ${TARGET_NAME}
  113. "IMPORTED_LOCATION_${project_build_tools_get_imported_location_IMPORTED_CONFIGURATION}"
  114. )
  115. if(${OUTPUT_VAR_NAME})
  116. break()
  117. endif()
  118. endforeach()
  119. endif()
  120. if(${OUTPUT_VAR_NAME})
  121. set(${OUTPUT_VAR_NAME}
  122. ${${OUTPUT_VAR_NAME}}
  123. PARENT_SCOPE)
  124. endif()
  125. endfunction()
  126. #[[
  127. If we build third party packages with a different CONFIG setting from building
  128. otel-cpp, cmake may not find a suitable file in imported targets (#705, #1359)
  129. when linking. But on some platforms, different CONFIG settings can be used when
  130. these CONFIG settings have the same ABI. For example, on Linux, we can build
  131. gRPC and protobuf with -DCMAKE_BUILD_TYPE=Release, but build otel-cpp with
  132. -DCMAKE_BUILD_TYPE=Debug and link these libraries together.
  133. The properties of imported targets can be found here:
  134. https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html#properties-on-targets
  135. ]]
  136. function(project_build_tools_patch_default_imported_config)
  137. set(PATCH_VARS
  138. IMPORTED_IMPLIB
  139. IMPORTED_LIBNAME
  140. IMPORTED_LINK_DEPENDENT_LIBRARIES
  141. IMPORTED_LINK_INTERFACE_LANGUAGES
  142. IMPORTED_LINK_INTERFACE_LIBRARIES
  143. IMPORTED_LINK_INTERFACE_MULTIPLICITY
  144. IMPORTED_LOCATION
  145. IMPORTED_NO_SONAME
  146. IMPORTED_OBJECTS
  147. IMPORTED_SONAME)
  148. foreach(TARGET_NAME ${ARGN})
  149. if(TARGET ${TARGET_NAME})
  150. get_target_property(IS_IMPORTED_TARGET ${TARGET_NAME} IMPORTED)
  151. if(NOT IS_IMPORTED_TARGET)
  152. continue()
  153. endif()
  154. get_target_property(IS_ALIAS_TARGET ${TARGET_NAME} ALIASED_TARGET)
  155. if(IS_ALIAS_TARGET)
  156. continue()
  157. endif()
  158. if(CMAKE_VERSION VERSION_LESS "3.19.0")
  159. get_target_property(TARGET_TYPE_NAME ${TARGET_NAME} TYPE)
  160. if(TARGET_TYPE_NAME STREQUAL "INTERFACE_LIBRARY")
  161. continue()
  162. endif()
  163. endif()
  164. get_target_property(DO_NOT_OVERWRITE ${TARGET_NAME} IMPORTED_LOCATION)
  165. if(DO_NOT_OVERWRITE)
  166. continue()
  167. endif()
  168. # MSVC's STL and debug level must match the target, so we can only move
  169. # out IMPORTED_LOCATION_NOCONFIG
  170. if(MSVC)
  171. set(PATCH_IMPORTED_CONFIGURATION "NOCONFIG")
  172. else()
  173. get_target_property(PATCH_IMPORTED_CONFIGURATION ${TARGET_NAME}
  174. IMPORTED_CONFIGURATIONS)
  175. endif()
  176. if(NOT PATCH_IMPORTED_CONFIGURATION)
  177. continue()
  178. endif()
  179. get_target_property(PATCH_TARGET_LOCATION ${TARGET_NAME}
  180. "IMPORTED_LOCATION_${PATCH_IMPORTED_CONFIGURATION}")
  181. if(NOT PATCH_TARGET_LOCATION)
  182. continue()
  183. endif()
  184. foreach(PATCH_IMPORTED_KEY IN LISTS PATCH_VARS)
  185. get_target_property(
  186. PATCH_IMPORTED_VALUE ${TARGET_NAME}
  187. "${PATCH_IMPORTED_KEY}_${PATCH_IMPORTED_CONFIGURATION}")
  188. if(PATCH_IMPORTED_VALUE)
  189. set_target_properties(
  190. ${TARGET_NAME} PROPERTIES "${PATCH_IMPORTED_KEY}"
  191. "${PATCH_IMPORTED_VALUE}")
  192. if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  193. message(
  194. STATUS
  195. "Patch: ${TARGET_NAME} ${PATCH_IMPORTED_KEY} will use ${PATCH_IMPORTED_KEY}_${PATCH_IMPORTED_CONFIGURATION}(\"${PATCH_IMPORTED_VALUE}\") by default."
  196. )
  197. endif()
  198. endif()
  199. endforeach()
  200. endif()
  201. endforeach()
  202. endfunction()