基于C++ Coroutines提案 ‘Stackless Resumable Functions’编写的协程库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SelectDynamicLibrary.cmake 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. include(SelectLibraryConfigurations)
  2. if(NOT DEFINED CMAKE_PROCESSOR_ALIAS)
  3. MESSAGE(STATUS "operation system is ${CMAKE_CXX_PLATFORM_ID}")
  4. MESSAGE(STATUS "processor is ${CMAKE_HOST_SYSTEM_PROCESSOR}")
  5. if((${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "i386") OR (${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "AMD64") OR (${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64"))
  6. if(CMAKE_SIZEOF_VOID_P EQUAL 4)
  7. set(CMAKE_PROCESSOR_ALIAS "x86" CACHE STRING "Alias of processor")
  8. elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
  9. set(CMAKE_PROCESSOR_ALIAS "x64" CACHE STRING "Alias of processor")
  10. else()
  11. message(FATAL_ERROR "Unknown processor")
  12. endif()
  13. elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "aarch64")
  14. if(CMAKE_SIZEOF_VOID_P EQUAL 4)
  15. set(CMAKE_PROCESSOR_ALIAS "arm" CACHE STRING "Alias of processor")
  16. elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
  17. set(CMAKE_PROCESSOR_ALIAS "arm64" CACHE STRING "Alias of processor")
  18. else()
  19. message(FATAL_ERROR "Unknown processor")
  20. endif()
  21. else()
  22. message(FATAL_ERROR "Unknown processor")
  23. endif()
  24. message(STATUS "CMAKE_PROCESSOR_ALIAS=${CMAKE_PROCESSOR_ALIAS}")
  25. endif()
  26. macro(_acl_copy_dynamic_library_build_type basename build_type)
  27. if(${build_type} STREQUAL "Debug")
  28. set(_acl_build_type_dir "Debug")
  29. set(_acl_runtime_output_dir ${CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG})
  30. elseif(${build_type} STREQUAL "Release")
  31. set(_acl_build_type_dir "Release")
  32. set(_acl_runtime_output_dir ${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE})
  33. elseif(${build_type} STREQUAL "MinSizeRel")
  34. set(_acl_build_type_dir "Release")
  35. set(_acl_runtime_output_dir ${CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL})
  36. elseif(${build_type} STREQUAL "RelWithDebInfo")
  37. set(_acl_build_type_dir "Release")
  38. set(_acl_runtime_output_dir ${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO})
  39. endif()
  40. #message(STATUS "_acl_build_type_dir=${CMAKE_CURRENT_LIST_DIR}/../lib/${CMAKE_CXX_PLATFORM_ID}/${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}-${_acl_build_type_dir}")
  41. #message(STATUS "_acl_runtime_output_dir=${_acl_runtime_output_dir}")
  42. find_file(_acl_${basename}_dynamic_binary
  43. NAMES "Acl.${basename}.dll" "Acl.${basename}.so"
  44. PATHS
  45. ${CMAKE_CURRENT_LIST_DIR}/../bin/${CMAKE_CXX_PLATFORM_ID}/${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}-${_acl_build_type_dir}
  46. NO_DEFAULT_PATH
  47. )
  48. if(NOT _acl_${basename}_dynamic_binary)
  49. find_file(_acl_${basename}_dynamic_binary
  50. NAMES "${basename}.dll" "${basename}.so"
  51. PATHS
  52. ${CMAKE_CURRENT_LIST_DIR}/../bin/${CMAKE_CXX_PLATFORM_ID}/${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}-${_acl_build_type_dir}
  53. NO_DEFAULT_PATH
  54. )
  55. endif()
  56. #message(STATUS "_acl_runtime_dynamic_binary=${_acl_runtime_dynamic_binary}")
  57. if(_acl_${basename}_dynamic_binary)
  58. file(INSTALL ${_acl_${basename}_dynamic_binary} DESTINATION ${_acl_runtime_output_dir})
  59. endif()
  60. unset(_acl_build_type_dir)
  61. unset(_acl_runtime_output_dir)
  62. unset(_acl_${basename}_dynamic_binary CACHE)
  63. endmacro(_acl_copy_dynamic_library_build_type)
  64. macro(_acl_copy_dynamic_library basename)
  65. if(DEFINED CMAKE_CONFIGURATION_TYPES)
  66. foreach(build_type ${CMAKE_CONFIGURATION_TYPES})
  67. _acl_copy_dynamic_library_build_type(${basename} ${build_type})
  68. endforeach(build_type)
  69. elseif(DEFINED CMAKE_BUILD_TYPE)
  70. _acl_copy_dynamic_library_build_type(${basename} ${CMAKE_BUILD_TYPE})
  71. else()
  72. _acl_copy_dynamic_library_build_type(${basename} "Release")
  73. endif()
  74. endmacro(_acl_copy_dynamic_library)
  75. macro(select_dynamic_library basename header)
  76. #message(STATUS "basename=${basename}")
  77. #message(STATUS "header=${header}")
  78. # 如果已经找到了 basename 指定的模块,则只做拷贝运行时的动态库的工作
  79. #message(STATUS "${basename}_FOUND=${${basename}_FOUND}")
  80. if(${basename}_FOUND)
  81. _acl_copy_dynamic_library(${basename})
  82. return()
  83. endif()
  84. # 查找头文件所在的路径
  85. find_path(${basename}_INCLUDE_DIR ${header}
  86. ${CMAKE_CURRENT_LIST_DIR}/../include
  87. NO_DEFAULT_PATH
  88. )
  89. # 查找调试版本的库文件所在路径
  90. find_library("${basename}_LIBRARY_DEBUG"
  91. NAMES "Acl.${basename}"
  92. PATHS
  93. ${CMAKE_CURRENT_LIST_DIR}/../lib/${CMAKE_CXX_PLATFORM_ID}/${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}-Debug
  94. NO_DEFAULT_PATH
  95. )
  96. if(NOT ${basename}_LIBRARY_DEBUG)
  97. find_library("${basename}_LIBRARY_DEBUG"
  98. NAMES "${basename}"
  99. PATHS
  100. ${CMAKE_CURRENT_LIST_DIR}/../lib/${CMAKE_CXX_PLATFORM_ID}/${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}-Debug
  101. NO_DEFAULT_PATH
  102. )
  103. endif()
  104. # 查找发行版本的库文件所在路径
  105. find_library("${basename}_LIBRARY_RELEASE"
  106. NAMES "Acl.${basename}"
  107. PATHS
  108. ${CMAKE_CURRENT_LIST_DIR}/../lib/${CMAKE_CXX_PLATFORM_ID}/${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}-Release
  109. NO_DEFAULT_PATH
  110. )
  111. if(NOT ${basename}_LIBRARY_RELEASE)
  112. find_library("${basename}_LIBRARY_RELEASE"
  113. NAMES "${basename}"
  114. PATHS
  115. ${CMAKE_CURRENT_LIST_DIR}/../lib/${CMAKE_CXX_PLATFORM_ID}/${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}-Release
  116. NO_DEFAULT_PATH
  117. )
  118. endif()
  119. # 使用cmake内置的 select_library_configurations 函数生成 ${basename}_LIBRARY 字段
  120. select_library_configurations(${basename})
  121. set(${basename}_FOUND FALSE)
  122. if(${basename}_LIBRARY AND ${basename}_INCLUDE_DIR)
  123. set(${basename}_FOUND TRUE)
  124. if(NOT ${basename}_DIR)
  125. set(${basename}_DIR ${CMAKE_CURRENT_LIST_DIR})
  126. endif()
  127. # 做拷贝运行时的动态库到目标目录
  128. _acl_copy_dynamic_library(${basename})
  129. # 创建 basename 指定的导入接口模块
  130. if(NOT TARGET Acl::${basename})
  131. add_library(Acl::${basename} UNKNOWN IMPORTED)
  132. set_target_properties(Acl::${basename} PROPERTIES
  133. INTERFACE_INCLUDE_DIRECTORIES "${${basename}_INCLUDE_DIR}")
  134. set_property(TARGET Acl::${basename} APPEND PROPERTY
  135. IMPORTED_CONFIGURATIONS RELEASE)
  136. set_target_properties(Acl::${basename} PROPERTIES
  137. IMPORTED_LOCATION_RELEASE "${${basename}_LIBRARY_RELEASE}")
  138. set_property(TARGET Acl::${basename} APPEND PROPERTY
  139. IMPORTED_CONFIGURATIONS DEBUG)
  140. set_target_properties(Acl::${basename} PROPERTIES
  141. IMPORTED_LOCATION_DEBUG "${${basename}_LIBRARY_DEBUG}")
  142. endif()
  143. endif()
  144. mark_as_advanced(${basename}_DIR)
  145. mark_as_advanced(${basename}_LIBRARY)
  146. mark_as_advanced(${basename}_INCLUDE_DIR)
  147. #message(STATUS "${basename}_DIR=${${basename}_DIR}")
  148. #message(STATUS "${basename}_LIBRARY=${${basename}_LIBRARY}")
  149. #message(STATUS "${basename}_LIBRARY_DEBUG=${${basename}_LIBRARY_DEBUG}")
  150. #message(STATUS "${basename}_LIBRARY_RELEASE=${${basename}_LIBRARY_RELEASE}")
  151. #message(STATUS "${basename}_INCLUDE_DIR=${${basename}_INCLUDE_DIR}")
  152. endmacro(select_dynamic_library)