基于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 5.9KB

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