CMakeLists.txt 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. cmake_minimum_required (VERSION 3.8)
  2. cmake_policy(SET CMP0048 NEW)
  3. if(${CMAKE_VERSION} VERSION_LESS 3.15)
  4. cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
  5. else()
  6. cmake_policy(VERSION 3.15)
  7. endif()
  8. set(ZEROTIER_VERSION_MAJOR 1 CACHE INTERNAL "")
  9. set(ZEROTIER_VERSION_MINOR 9 CACHE INTERNAL "")
  10. set(ZEROTIER_VERSION_REVISION 0 CACHE INTERNAL "")
  11. set(ZEROTIER_VERSION_BUILD 0 CACHE INTERNAL "")
  12. project(zerotier
  13. VERSION ${ZEROTIER_VERSION_MAJOR}.${ZEROTIER_VERSION_MINOR}.${ZEROTIER_VERSION_REVISION}.${ZEROTIER_VERSION_BUILD}
  14. DESCRIPTION "ZeroTier Network Hypervisor"
  15. LANGUAGES CXX C)
  16. if(NOT PACKAGE_STATIC)
  17. find_program(
  18. GO go
  19. HINTS "/usr/local/go/bin" "/usr/bin" "/usr/local/bin" "C:/go/bin"
  20. )
  21. if(NOT GO)
  22. message(FATAL_ERROR "Golang not found")
  23. else(NOT GO)
  24. message(STATUS "Found Golang at ${GO}")
  25. endif(NOT GO)
  26. set(default_build_type "Release")
  27. if(WIN32)
  28. set(CMAKE_CXX_STANDARD 17)
  29. set(CMAKE_SYSTEM_VERSION "7" CACHE STRING INTERNAL FORCE)
  30. else(WIN32)
  31. if(APPLE)
  32. set(CMAKE_CXX_STANDARD 17)
  33. else(APPLE)
  34. set(CMAKE_CXX_STANDARD 11)
  35. endif(APPLE)
  36. endif(WIN32)
  37. if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  38. message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
  39. set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING "Choose the type of build." FORCE)
  40. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
  41. endif()
  42. option(BUILD_CENTRAL_CONTROLLER "Build ZeroTier Central Controller" OFF)
  43. if(BUILD_CENTRAL_CONTROLLER)
  44. find_package(PkgConfig REQUIRED)
  45. if(APPLE)
  46. set(CMAKE_PREFIX_PATH
  47. ${CMAKE_PREFIX_PATH}
  48. /usr/local/opt/libpq
  49. /usr/local/lib
  50. )
  51. endif(APPLE)
  52. find_package(PostgreSQL REQUIRED)
  53. pkg_check_modules(hiredis REQUIRED IMPORTED_TARGET hiredis)
  54. add_subdirectory(controller/thirdparty/redis-plus-plus-1.1.1)
  55. set(redispp_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/controller/thirdparty/redis-plus-plus-1.1.1/src/sw)
  56. set(redispp_STATIC_LIB redispp_static)
  57. endif(BUILD_CENTRAL_CONTROLLER)
  58. if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  59. add_definitions(-DZT_DEBUG)
  60. endif(CMAKE_BUILD_TYPE STREQUAL "Debug")
  61. if(WIN32)
  62. message("++ Setting Windows Compiler Flags ${CMAKE_BUILD_TYPE}")
  63. add_definitions(-DNOMINMAX)
  64. add_compile_options(
  65. -Wall
  66. -Wno-deprecated
  67. -Wno-unused-function
  68. -Wno-format
  69. $<$<CONFIG:DEBUG>:-g>
  70. $<$<CONFIG:DEBUG>:-O0>
  71. $<$<CONFIG:RELEASE>:-O3>
  72. $<$<CONFIG:RELEASE>:-ffast-math>
  73. $<$<CONFIG:RELWITHDEBINFO>:-O3>
  74. $<$<CONFIG:RELWITHDEBINFO>:-g>
  75. )
  76. set(GOFLAGS
  77. -a
  78. -trimpath
  79. )
  80. if(BUILD_32BIT)
  81. set(CMAKE_SYSTEM_PROCESSOR "x86" CACHE STRING "system processor")
  82. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32" CACHE STRING "c++ flags")
  83. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32" CACHE STRING "c flags")
  84. set(GOARCH "GOARCH=386" CACHE STRING "go architecture")
  85. add_compile_options(
  86. -m32
  87. )
  88. add_link_options(
  89. -m32
  90. )
  91. endif(BUILD_32BIT)
  92. else(WIN32)
  93. set(GOFLAGS
  94. -trimpath
  95. -buildmode=pie
  96. )
  97. if(APPLE)
  98. message("++ Setting MacOS Compiler Flags ${CMAKE_BUILD_TYPE}")
  99. set(MACOS_VERSION_MIN "10.12")
  100. add_compile_options(
  101. -Wall
  102. -Wno-deprecated
  103. -Wno-unused-function
  104. -mmacosx-version-min=${MACOS_VERSION_MIN}
  105. $<$<CONFIG:DEBUG>:-g>
  106. $<$<CONFIG:DEBUG>:-O0>
  107. $<$<CONFIG:RELEASE>:-Ofast>
  108. $<$<CONFIG:RELEASE>:-ffast-math>
  109. $<$<CONFIG:RELEASE>:-fPIE>
  110. $<$<CONFIG:RELEASE>:-flto>
  111. $<$<CONFIG:RELWITHDEBINFO>:-O1>
  112. $<$<CONFIG:RELWITHDEBINFO>:-fPIE>
  113. $<$<CONFIG:RELWITHDEBINFO>:-g>
  114. )
  115. add_link_options(
  116. -mmacosx-version-min=${MACOS_VERSION_MIN}
  117. $<$<CONFIG:RELEASE>:-flto>
  118. )
  119. set(GOFLAGS
  120. ${GOFLAGS}
  121. -a
  122. -ldflags '-w -extldflags \"-Wl,-undefined -Wl,dynamic_lookup\"'
  123. )
  124. else(APPLE)
  125. message("++ Setting Linux/BSD/Posix Compiler Flags (${CMAKE_BUILD_TYPE})")
  126. add_compile_options(
  127. -Wall
  128. -Wno-deprecated
  129. -Wno-unused-function
  130. -Wno-format
  131. $<$<CONFIG:DEBUG>:-g>
  132. $<$<CONFIG:DEBUG>:-O0>
  133. $<$<CONFIG:RELEASE>:-O3>
  134. $<$<CONFIG:RELEASE>:-ffast-math>
  135. $<$<CONFIG:RELEASE>:-fPIE>
  136. $<$<CONFIG:RELWITHDEBINFO>:-O3>
  137. $<$<CONFIG:RELWITHDEBINFO>:-fPIE>
  138. $<$<CONFIG:RELWITHDEBINFO>:-g>
  139. )
  140. option(BUILD_32BIT "Force building as 32-bit binary" OFF)
  141. option(BUILD_STATIC "Build statically linked executable" OFF)
  142. option(BUILD_ARM_V5 "Build ARMv5" OFF)
  143. option(BUILD_ARM_V6 "Build ARMv6" OFF)
  144. if(BUILD_ARM_V5 AND BUILD_ARM_V6)
  145. message(FATAL_ERROR "BUILD_ARM_V5 and BUILD_ARM_V6 are mutually exclusive!")
  146. endif(BUILD_ARM_V5 AND BUILD_ARM_V6)
  147. if(BUILD_32BIT)
  148. set(CMAKE_SYSTEM_PROCESSOR "x86" CACHE STRING "system processor")
  149. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32" CACHE STRING "c++ flags")
  150. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32" CACHE STRING "c flags")
  151. set(GOARCH "GOARCH=386" CACHE STRING "go architecture")
  152. add_compile_options(
  153. -m32
  154. )
  155. endif(BUILD_32BIT)
  156. if(BUILD_STATIC)
  157. add_link_options(
  158. -static
  159. )
  160. set(CMAKE_EXE_LINKER_FLAGS "-static ${CMAKE_EXE_LINKER_FLAGS}")
  161. set(GOFLAGS
  162. ${GOFLAGS}
  163. -a
  164. -tags osusergo,netgo
  165. -ldflags '-w -extldflags \"-static -Wl,-unresolved-symbols=ignore-all\"'
  166. )
  167. else(BUILD_STATIC)
  168. set(GOFLAGS
  169. ${GOFLAGS}
  170. -a
  171. -ldflags '-w -extldflags \"-Wl,-unresolved-symbols=ignore-all\"'
  172. )
  173. endif(BUILD_STATIC)
  174. if(BUILD_ARM_V5)
  175. set(GOARM "GOARM=5")
  176. endif(BUILD_ARM_V5)
  177. if(BUILD_ARM_V6)
  178. set(GOARM "GOARM=6")
  179. endif(BUILD_ARM_V6)
  180. endif(APPLE)
  181. endif(WIN32)
  182. if (
  183. CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR
  184. CMAKE_SYSTEM_PROCESSOR MATCHES "amd64" OR
  185. CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64"
  186. )
  187. message("++ Adding flags for processor ${CMAKE_SYSTEM_PROCESSOR}")
  188. add_compile_options(-maes -mrdrnd -mpclmul -msse -msse2 -mssse3)
  189. endif()
  190. set(GO_BUILD_TAGS)
  191. if(BUILD_CENTRAL_CONTROLLER)
  192. add_definitions(-DZT_CONTROLLER_USE_LIBPQ=1)
  193. set(GO_BUILD_TAGS -tags central)
  194. endif(BUILD_CENTRAL_CONTROLLER)
  195. add_subdirectory(core)
  196. add_subdirectory(controller)
  197. add_subdirectory(osdep)
  198. add_subdirectory(serviceiocore)
  199. file(GLOB go_src
  200. ${CMAKE_SOURCE_DIR}/cmd/*.go
  201. ${CMAKE_SOURCE_DIR}/cmd/cmd/*.go
  202. ${CMAKE_SOURCE_DIR}/pkg/zerotier/*.go
  203. )
  204. if(WIN32)
  205. set(GO_EXE_NAME "zerotier.exe")
  206. set(GO_EXTRA_LIBRARIES "-lstdc++ -lwsock32 -lws2_32 -liphlpapi -lole32 -loleaut32 -lrpcrt4 -luuid")
  207. else(WIN32)
  208. set(GO_EXE_NAME "zerotier")
  209. if(CMAKE_SYSTEM_NAME MATCHES "Linux")
  210. set(GO_EXTRA_LIBRARIES "-lstdc++")
  211. if(BUILD_ARM_V5)
  212. set(GO_EXTRA_LIBRARIES
  213. ${GO_EXTRA_LIBRARIES}
  214. "-latomic"
  215. )
  216. endif(BUILD_ARM_V5)
  217. else()
  218. set(GO_EXTRA_LIBRARIES "-lc++")
  219. endif()
  220. endif(WIN32)
  221. add_custom_target(
  222. zerotier ALL
  223. BYPRODUCTS ${CMAKE_BINARY_DIR}/zerotier
  224. SOURCES ${go_src}
  225. COMMAND ${CMAKE_COMMAND} -E env ${GOARCH} ${GOARM} CGO_ENABLED=1 CGO_CFLAGS=\"-O3\" CGO_LDFLAGS=\"$<TARGET_FILE:zt_core> $<TARGET_FILE:zt_controller> $<TARGET_FILE:zt_service_io_core> $<TARGET_FILE:zt_osdep> ${GO_EXTRA_LIBRARIES}\" ${GO} build -mod=vendor ${GOFLAGS} -o ${CMAKE_BINARY_DIR}/${GO_EXE_NAME} ${CMAKE_SOURCE_DIR}/cmd/zerotier/zerotier.go
  226. COMMENT "Compiling Go Code..."
  227. )
  228. add_dependencies(zerotier zt_osdep zt_core zt_controller zt_service_io_core)
  229. install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/zerotier DESTINATION bin)
  230. else(NOT PACKAGE_STATIC)
  231. if(BUILD_32BIT)
  232. set(CMAKE_SYSTEM_PROCESSOR "x86" CACHE STRING "system processor")
  233. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32" CACHE STRING "c++ flags")
  234. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32" CACHE STRING "c flags")
  235. add_compile_options(
  236. -m32
  237. )
  238. endif(BUILD_32BIT)
  239. set(STATIC_BINARY ${CMAKE_BINARY_DIR}/zerotier)
  240. set(IMPORTED_LOCATION ${CMAKE_BINARY_DIR})
  241. add_executable(zerotier IMPORTED GLOBAL)
  242. install(PROGRAMS ${STATIC_BINARY} DESTINATION bin)
  243. endif(NOT PACKAGE_STATIC)
  244. # Linux packaging
  245. if("${CMAKE_SYSTEM_NAME}" EQUAL "Linux")
  246. if(IS_DIRECTORY /lib/systemd/system)
  247. install(
  248. FILES ${CMAKE_CURRENT_SOURCE_DIR}/packaging/debian/zerotier.service
  249. DESTINATION /lib/systemd/system
  250. )
  251. elseif(IS_DIRECTORY /usr/lib/systemd/system)
  252. install(
  253. FILES ${CMAKE_CURRENT_SOURCE_DIR}/packaging/debian/zerotier.service
  254. DESTINATION /usr/lib/systemd/system
  255. )
  256. else()
  257. install(
  258. FILES ${CMAKE_CURRENT_SOURCE_DIR}/packaging/debian/zerotier.init
  259. DESTINATION /etc/init.d
  260. )
  261. endif()
  262. endif()
  263. if("${ZT_PACKAGE_FORMAT}" MATCHES "DEB")
  264. include(packaging/debian.cmake)
  265. elseif("${ZT_PACKAGE_FORMAT}" MATCHES "RPM")
  266. include(packaging/rpm.cmake)
  267. else()
  268. endif()