CMakeLists.txt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. cmake_minimum_required (VERSION 3.19)
  2. project (syncspirit)
  3. set(CMAKE_CXX_STANDARD 20)
  4. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  5. set(CMAKE_CXX_VISIBILITY_PRESET hidden)
  6. set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
  7. cmake_policy(SET CMP0063 NEW)
  8. cmake_policy(SET CMP0077 NEW)
  9. cmake_policy(SET CMP0135 NEW)
  10. include(GenerateExportHeader)
  11. include (FetchContent)
  12. set(CMAKE_POSITION_INDEPENDENT_CODE True)
  13. #set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
  14. #set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
  15. find_package(
  16. Boost
  17. COMPONENTS
  18. nowide
  19. program_options
  20. system
  21. url
  22. REQUIRED
  23. )
  24. find_package(OpenSSL REQUIRED)
  25. find_package(Protobuf REQUIRED)
  26. find_package(ZLIB REQUIRED)
  27. find_package(rotor COMPONENTS asio thread REQUIRED)
  28. find_package(lz4 REQUIRED)
  29. find_package(fmt REQUIRED)
  30. find_package(spdlog REQUIRED)
  31. find_package(pugixml REQUIRED)
  32. find_package(tomlplusplus REQUIRED)
  33. find_package(nlohmann_json REQUIRED)
  34. #find_package(c-ares REQUIRED)
  35. set(SYNCSPIRIT_VERSION "v0.4.0")
  36. option(SYNCSPIRIT_BUILD_TESTS "Enable building tests [default: OFF]" OFF)
  37. set(dist_dir "${syncspirit_BINARY_DIR}/dist")
  38. add_custom_target("deploy")
  39. if (WIN32)
  40. add_custom_target("deploy_deps"
  41. COMMAND
  42. python ${syncspirit_SOURCE_DIR}/misc/post-install-win32.py
  43. --binaries ${dist_dir}/*
  44. --dirs
  45. `conan config home`
  46. ${CMAKE_BINARY_DIR}
  47. `dirname ${CMAKE_CXX_COMPILER}`/../../
  48. DEPENDS deploy
  49. )
  50. endif()
  51. function(install_executable target)
  52. install(TARGETS ${target} DESTINATION bin)
  53. add_custom_target("deploy_${target}")
  54. add_dependencies("deploy" "deploy_${target}")
  55. if (WIN32)
  56. add_custom_command(TARGET deploy_${target} POST_BUILD
  57. COMMAND ${CMAKE_COMMAND} -E
  58. copy
  59. $<TARGET_FILE:${target}>
  60. "${dist_dir}/$<TARGET_FILE_NAME:${target}>"
  61. # COMMAND ${CMAKE_COMMAND} -E copy -t ${dist_dir} $<TARGET_RUNTIME_DLLS:${target}>
  62. # COMMAND_EXPAND_LISTS
  63. )
  64. else()
  65. add_custom_command(TARGET deploy_${target} POST_BUILD
  66. COMMAND
  67. cd ${syncspirit_BINARY_DIR} && sh
  68. ${syncspirit_SOURCE_DIR}/misc/make-appimage.sh
  69. $<TARGET_FILE:${target}>
  70. )
  71. endif()
  72. endfunction()
  73. configure_file(misc/syncspirit-config.h.in include/syncspirit-config.h @ONLY)
  74. set(Protobuf_IMPORT_DIRS ${syncspirit_SOURCE_DIR}/src/protobuf)
  75. protobuf_generate_cpp(
  76. PROTO_SRCS PROTO_HDRS
  77. EXPORT_MACRO SYNCSPIRIT_API
  78. src/protobuf/bep.proto
  79. src/protobuf/structs.proto
  80. )
  81. add_library(syncspirit_core SHARED
  82. ${PROTO_SRCS}
  83. src/constants.cpp
  84. src/config/utils.cpp
  85. src/db/cursor.cpp
  86. src/db/error_code.cpp
  87. src/db/prefix.cpp
  88. src/db/transaction.cpp
  89. src/db/utils.cpp
  90. src/fs/chunk_iterator.cpp
  91. src/fs/file.cpp
  92. src/fs/file_actor.cpp
  93. src/fs/fs_supervisor.cpp
  94. src/fs/new_chunk_iterator.cpp
  95. src/fs/scan_actor.cpp
  96. src/fs/scan_scheduler.cpp
  97. src/fs/scan_task.cpp
  98. src/fs/utils.cpp
  99. src/hasher/hasher_actor.cpp
  100. src/hasher/hasher_proxy_actor.cpp
  101. src/hasher/hasher_supervisor.cpp
  102. src/model/diff/apply_controller.cpp
  103. src/model/diff/block_diff.cpp
  104. src/model/diff/cluster_diff.cpp
  105. src/model/diff/cluster_visitor.cpp
  106. src/model/diff/advance/advance.cpp
  107. src/model/diff/advance/local_update.cpp
  108. src/model/diff/advance/remote_copy.cpp
  109. src/model/diff/advance/remote_win.cpp
  110. src/model/diff/contact/connect_request.cpp
  111. src/model/diff/contact/dial_request.cpp
  112. src/model/diff/contact/ignored_connected.cpp
  113. src/model/diff/contact/relay_connect_request.cpp
  114. src/model/diff/contact/peer_state.cpp
  115. src/model/diff/contact/unknown_connected.cpp
  116. src/model/diff/contact/update_contact.cpp
  117. src/model/diff/load/blocks.cpp
  118. src/model/diff/load/devices.cpp
  119. src/model/diff/load/file_infos.cpp
  120. src/model/diff/load/folder_infos.cpp
  121. src/model/diff/load/folders.cpp
  122. src/model/diff/load/ignored_devices.cpp
  123. src/model/diff/load/ignored_folders.cpp
  124. src/model/diff/load/load_cluster.cpp
  125. src/model/diff/load/pending_devices.cpp
  126. src/model/diff/load/pending_folders.cpp
  127. src/model/diff/local/blocks_availability.cpp
  128. src/model/diff/local/custom.cpp
  129. src/model/diff/local/file_availability.cpp
  130. src/model/diff/local/io_failure.cpp
  131. src/model/diff/local/scan_finish.cpp
  132. src/model/diff/local/scan_request.cpp
  133. src/model/diff/local/scan_start.cpp
  134. src/model/diff/local/synchronization_finish.cpp
  135. src/model/diff/local/synchronization_start.cpp
  136. src/model/diff/modify/add_blocks.cpp
  137. src/model/diff/modify/add_remote_folder_infos.cpp
  138. src/model/diff/modify/add_ignored_device.cpp
  139. src/model/diff/modify/add_pending_device.cpp
  140. src/model/diff/modify/add_pending_folders.cpp
  141. src/model/diff/modify/append_block.cpp
  142. src/model/diff/modify/block_ack.cpp
  143. src/model/diff/modify/block_rej.cpp
  144. src/model/diff/modify/block_transaction.cpp
  145. src/model/diff/modify/clone_block.cpp
  146. src/model/diff/modify/finish_file.cpp
  147. src/model/diff/modify/generic_remove.cpp
  148. src/model/diff/modify/lock_file.cpp
  149. src/model/diff/modify/mark_reachable.cpp
  150. src/model/diff/modify/remove_blocks.cpp
  151. src/model/diff/modify/remove_files.cpp
  152. src/model/diff/modify/remove_folder.cpp
  153. src/model/diff/modify/remove_folder_infos.cpp
  154. src/model/diff/modify/remove_peer.cpp
  155. src/model/diff/modify/remove_ignored_device.cpp
  156. src/model/diff/modify/remove_pending_device.cpp
  157. src/model/diff/modify/remove_pending_folders.cpp
  158. src/model/diff/modify/reset_folder_infos.cpp
  159. src/model/diff/modify/share_folder.cpp
  160. src/model/diff/modify/suspend_folder.cpp
  161. src/model/diff/modify/unshare_folder.cpp
  162. src/model/diff/modify/update_peer.cpp
  163. src/model/diff/modify/upsert_folder.cpp
  164. src/model/diff/modify/upsert_folder_info.cpp
  165. src/model/diff/peer/cluster_update.cpp
  166. src/model/diff/peer/update_folder.cpp
  167. src/model/misc/block_iterator.cpp
  168. src/model/misc/error_code.cpp
  169. src/model/misc/file_block.cpp
  170. src/model/misc/file_iterator.cpp
  171. src/model/misc/orphaned_blocks.cpp
  172. src/model/misc/resolver.cpp
  173. src/model/misc/sequencer.cpp
  174. src/model/misc/updates_streamer.cpp
  175. src/model/misc/uuid.cpp
  176. src/model/block_info.cpp
  177. src/model/cluster.cpp
  178. src/model/device.cpp
  179. src/model/device_id.cpp
  180. src/model/file_info.cpp
  181. src/model/folder.cpp
  182. src/model/folder_data.cpp
  183. src/model/folder_info.cpp
  184. src/model/ignored_device.cpp
  185. src/model/ignored_folder.cpp
  186. src/model/pending_device.cpp
  187. src/model/pending_folder.cpp
  188. src/model/remote_folder_info.cpp
  189. src/model/some_device.cpp
  190. src/model/version.cpp
  191. src/net/acceptor_actor.cpp
  192. src/net/cluster_supervisor.cpp
  193. src/net/controller_actor.cpp
  194. src/net/db_actor.cpp
  195. src/net/dialer_actor.cpp
  196. src/net/global_discovery_actor.cpp
  197. src/net/http_actor.cpp
  198. src/net/initiator_actor.cpp
  199. src/net/local_discovery_actor.cpp
  200. src/net/messages.cpp
  201. src/net/net_supervisor.cpp
  202. src/net/peer_actor.cpp
  203. src/net/peer_supervisor.cpp
  204. src/net/relay_actor.cpp
  205. src/net/resolver_actor.cpp
  206. src/net/names.cpp
  207. src/net/sink_actor.cpp
  208. src/net/ssdp_actor.cpp
  209. src/net/upnp_actor.cpp
  210. src/proto/bep_support.cpp
  211. src/proto/discovery_support.cpp
  212. src/proto/luhn32.cpp
  213. src/proto/relay_support.cpp
  214. src/proto/upnp_support.cpp
  215. src/transport/stream.cpp
  216. src/transport/http.cpp
  217. src/utils/base32.cpp
  218. src/utils/beast_support.cpp
  219. src/utils/dns.cpp
  220. src/utils/error_code.cpp
  221. src/utils/location.cpp
  222. src/utils/log.cpp
  223. src/utils/log-setup.cpp
  224. src/utils/network_interface.cpp
  225. src/utils/platform.cpp
  226. src/utils/time.cpp
  227. src/utils/tls.cpp
  228. src/utils/uri.cpp
  229. )
  230. generate_export_header(syncspirit_core
  231. EXPORT_MACRO_NAME SYNCSPIRIT_API
  232. EXPORT_FILE_NAME include/syncspirit-export.h
  233. )
  234. target_compile_options(syncspirit_core PRIVATE
  235. -include ${CMAKE_CURRENT_BINARY_DIR}/include/syncspirit-export.h
  236. )
  237. # windows xp patch required:
  238. # - CancelIoEx(ior->overlapped_fd, &item->ov);
  239. # + CancelIo(ior->overlapped_fd);
  240. FetchContent_Declare(MBDX
  241. URL https://libmdbx.dqdkfa.ru/release/libmdbx-amalgamated-0.13.4.tar.xz
  242. URL_HASH SHA256=86df30ca2231c9b3ad71424bb829dca9041947f5539d4295030c653d4982c1be
  243. )
  244. set(BUILD_SHARED_LIBS true CACHE BOOL "BUILD_SHARED_LIBS")
  245. set(MDBX_BUILD_TOOLS false CACHE BOOL "MDBX_BUILD_TOOLS")
  246. set(MDBX_ENABLE_TESTS false CACHE BOOL "MDBX_ENABLE_TESTS")
  247. set(MDBX_BUILD_CXX false CACHE BOOL "MDBX_BUILD_CXX")
  248. set(MDBX_BUILD_SHARED_LIBRARY true CACHE BOOL "MDBX_BUILD_SHARED_LIBRARY")
  249. set(MDBX_ALLOY_BUILD_DEFAULT true CACHE BOOL "MDBX_ALLOY_BUILD_DEFAULT")
  250. set(MDBX_ALLOY_BUILD true CACHE BOOL "MDBX_ALLOY_BUILD")
  251. FetchContent_MakeAvailable(MBDX)
  252. # To support WinXP there is need of that commit. When cares will be released
  253. # and pushed to conan center, the ready receive capn be used
  254. FetchContent_Declare(C_ARES
  255. GIT_REPOSITORY https://github.com/c-ares/c-ares.git
  256. GIT_TAG 7978cf75a82f9860da241227169a4d7f1d1f549a
  257. # URL https://github.com/c-ares/c-ares/archive/refs/tags/v1.34.4.tar.gz
  258. # URL_HASH SHA256=a35f7c4cdbdfaf0a69a9a50029e95ffe403daf605fade05c649d18333592222d
  259. )
  260. set(CARES_STATIC true CACHE BOOL "CARES_STATIC")
  261. set(CARES_SHARED false CACHE BOOL "CARES_SHARED")
  262. set(CARES_STATIC_PIC true CACHE BOOL "CARES_STATIC_PIC")
  263. set(CARES_BUILD_TOOLS false CACHE BOOL "CARES_BUILD_TOOLS")
  264. set(CARES_THREADS false CACHE BOOL "CARES_THREADS")
  265. FetchContent_MakeAvailable(C_ARES)
  266. target_include_directories(syncspirit_core PUBLIC
  267. ${Protobuf_INCLUDE_DIRS}
  268. ${OPENSSL_INCLUDE_DIR}
  269. ${CMAKE_CURRENT_BINARY_DIR}
  270. ${CMAKE_CURRENT_BINARY_DIR}/include
  271. ${CMAKE_CURRENT_SOURCE_DIR}/src
  272. )
  273. target_link_libraries(syncspirit_core
  274. PUBLIC
  275. protobuf::libprotobuf
  276. rotor::asio
  277. rotor::thread
  278. pugixml::pugixml
  279. Boost::nowide
  280. Boost::program_options
  281. Boost::system
  282. Boost::url
  283. OpenSSL::SSL
  284. fmt::fmt
  285. spdlog::spdlog
  286. tomlplusplus::tomlplusplus
  287. nlohmann_json::nlohmann_json
  288. lz4::lz4
  289. $<IF:$<PLATFORM_ID:Windows>,mdbx,mdbx-static>
  290. $<$<PLATFORM_ID:Windows>:iphlpapi>
  291. $<$<PLATFORM_ID:Windows>:ws2_32>
  292. $<$<PLATFORM_ID:Windows>:wsock32>
  293. PRIVATE
  294. c-ares::cares
  295. )
  296. install_executable("syncspirit_core")
  297. if (SYNCSPIRIT_BUILD_TESTS)
  298. enable_testing()
  299. add_subdirectory("tests")
  300. endif()
  301. add_subdirectory("src/ui-daemon")
  302. add_subdirectory("src/ui-fltk")