2
0

deps.cmake 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. include_guard(GLOBAL)
  2. set(PRINT_DEPS_INFO ON CACHE BOOL "Print deps info.") # 默认设定为 ON
  3. set(_print ${PRINT_DEPS_INFO})
  4. set(deps_install_dir ${INSTALL_RESOURCEDIR}/deps) # 依赖的安装位置
  5. set(dlfcn_cmake "share/dlfcn-win32") # dlfcn cmake 安装位置 (相对路径)
  6. set(pcre2_cmake "cmake")
  7. set(fflags_cmake "cmake") # FindFFlags.cmake 不是 fflags 的一部分, 但是会被安装到 cmake 目录下
  8. set(pthread_cmake "cmake")
  9. set(dlfcn-win32_MUST_BUILD TRUE CACHE BOOL "Must build dlfcn-win32")
  10. set(PCRE2_MUST_BUILD TRUE CACHE BOOL "Must build pcre2")
  11. set(FFlags_MUST_BUILD TRUE CACHE BOOL "Must build FFlags")
  12. set(PThreadWin32_MUST_BUILD TRUE CACHE BOOL "Must build pthreads-win32")
  13. if (WIN32 AND NOT CYGWIN) # cygwin 不依赖 dl
  14. if (_print)
  15. message(STATUS "Build dlfcn-win32...")
  16. endif()
  17. cfep_find_dir(dlfcn-win32
  18. REQUIRED
  19. SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dlfcn
  20. CMAKE_DIR ${dlfcn_cmake}
  21. EXTERNAL
  22. BUILD_CMAKE_CACHE_ARGS
  23. "\"-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}\""
  24. BUILD_DIR "dlfcn")
  25. set(dlfcn_lib dlfcn-win32::dl)
  26. get_target_property(dlfcn_include_dir dlfcn-win32::dl INTERFACE_INCLUDE_DIRECTORIES)
  27. get_target_property(_dlfcn_include dlfcn-win32::dl INTERFACE_INCLUDE_DIRECTORIES) # INTERFACE_INCLUDE_DIRECTORIES
  28. find_path(dlfcn_h_file NAMES dlfcn.h HINTS ${_dlfcn_include} DOC "The directory of dlfcn.h" REQUIRED NO_DEFAULT_PATH)
  29. wi_copy_import(TARGETS dlfcn-win32::dl)
  30. wi_build_import(TARGETS dlfcn-win32::dl)
  31. wi_install_import(TARGETS dlfcn-win32::dl)
  32. install(DIRECTORY "${dlfcn_h_file}/" DESTINATION ${INSTALL_INCLUDEDIR} FILES_MATCHING PATTERN "*.h") # 把目录下的内容安装到include
  33. cfep_install(dlfcn-win32 PREFIX ${deps_install_dir})
  34. else()
  35. set(DLFCN_ROOT "" CACHE STRING "The directory of dl.")
  36. set(dlfcn_root ${DLFCN_ROOT})
  37. if (dlfcn_root)
  38. find_library(dlfcn_path dl REQUIRED HINTS ${dlfcn_root})
  39. find_path(dlfcn_include_dir dl.h HINTS ${dlfcn_root})
  40. else()
  41. find_library(dlfcn_path dl REQUIRED)
  42. find_path(dlfcn_include_dir dlfcn.h)
  43. endif()
  44. if (NOT dlfcn_include_dir)
  45. set(dlfcn_include_dir "")
  46. endif()
  47. unset(dlfcn_root)
  48. set(dlfcn_lib ${dlfcn_path})
  49. endif()
  50. if (_print)
  51. message(STATUS "Build pcre2...")
  52. endif()
  53. set(PCRE2_USE_STATIC_LIBS TRUE)
  54. cfep_find_dir(PCRE2
  55. REQUIRED
  56. SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/pcre2
  57. CMAKE_DIR "cmake"
  58. PACKAGE
  59. COMPONENTS 8BIT
  60. EXTERNAL
  61. BUILD_CMAKE_CACHE_ARGS
  62. "\"-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}\""
  63. BUILD_DIR "pcre2")
  64. unset(PCRE2_USE_STATIC_LIBS)
  65. set(pcre2_lib PCRE2::8BIT)
  66. get_target_property(pcre2_include_dir PCRE2::8BIT INTERFACE_INCLUDE_DIRECTORIES)
  67. cfep_install(PCRE2 PREFIX ${deps_install_dir})
  68. if (_print)
  69. message(STATUS "Build fflags...")
  70. endif()
  71. cfep_find_dir(FFlags
  72. REQUIRED
  73. MODULE # 使用FindFFlags.cmake文件
  74. SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/fflags
  75. CMAKE_DIR "${CMAKE_CURRENT_LIST_DIR}/cmake" # FindFFlags.cmake 文件位置
  76. EXTERNAL
  77. BUILD_CMAKE_ARGS
  78. -DBUILD_SHARED_LIBS=OFF
  79. -DFFLAGS_BUILD_TEST=OFF
  80. BUILD_CMAKE_CACHE_ARGS
  81. "\"-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}\""
  82. BUILD_DIR "fflags")
  83. set(fflags_lib FFlags::fflags)
  84. get_target_property(fflags_include_dir FFlags::fflags INTERFACE_INCLUDE_DIRECTORIES)
  85. install(DIRECTORY "${fflags_INCLUDE_DIRS}/" DESTINATION ${INSTALL_INCLUDEDIR} FILES_MATCHING PATTERN "*.h") # 安装fflags.h
  86. install(FILES ${CMAKE_CURRENT_LIST_DIR}/cmake/FindFFlags.cmake DESTINATION ${deps_install_dir}/cmake) # 安装find程序
  87. cfep_install(FFlags PREFIX ${deps_install_dir})
  88. if (MSVC)
  89. if (_print)
  90. message(STATUS "Build pthreads-win32...")
  91. endif()
  92. cfep_find_dir(PThreadWin32
  93. REQUIRED
  94. MODULE # 使用FindFFlags.cmake文件
  95. SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/pthread-win32
  96. CMAKE_DIR "${CMAKE_CURRENT_LIST_DIR}/cmake" # FindPThreadWin32.cmake 文件位置
  97. EXTERNAL
  98. BUILD_CMAKE_CACHE_ARGS
  99. "\"-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}\""
  100. BUILD_DIR "pthread")
  101. set(pthread_lib PThreadWin32::pthread)
  102. get_target_property(pthread_include_dir PThreadWin32::pthread INTERFACE_INCLUDE_DIRECTORIES)
  103. install(DIRECTORY "${pthread_INCLUDE_DIRS}/" DESTINATION ${INSTALL_INCLUDEDIR} FILES_MATCHING PATTERN "*.h") # 安装fflags.h
  104. install(FILES ${CMAKE_CURRENT_LIST_DIR}/cmake/FindPThreadWin32.cmake DESTINATION ${deps_install_dir}/cmake) # 安装find程序
  105. cfep_install(PThreadWin32 PREFIX ${deps_install_dir})
  106. else()
  107. find_package(Threads REQUIRED)
  108. set(pthread_define ${CMAKE_USE_PTHREADS_INIT})
  109. if (NOT pthread_define)
  110. message(FATAL_ERROR "pthread not found")
  111. endif()
  112. set(pthread_lib Threads::Threads)
  113. get_target_property(pthread_include_dir Threads::Threads INTERFACE_INCLUDE_DIRECTORIES)
  114. if (NOT pthread_include_dir)
  115. set(pthread_include_dir "")
  116. endif()
  117. endif()
  118. set(base_include_dir ${dlfcn_include_dir} ${pcre2_include_dir} ${fflags_include_dir} ${pthread_include_dir})
  119. set(base_libraries ${dlfcn_lib} ${pcre2_lib} ${fflags_lib} ${pthread_lib})