CMakeLists.txt 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. cmake_minimum_required (VERSION 3.8)
  2. project(zerotier DESCRIPTION "ZeroTier Network Hypervisor" LANGUAGES CXX C)
  3. set(ZEROTIER_VERSION_MAJOR 1 CACHE INTERNAL "")
  4. set(ZEROTIER_VERSION_MINOR 9 CACHE INTERNAL "")
  5. set(ZEROTIER_VERSION_REVISION 0 CACHE INTERNAL "")
  6. set(ZEROTIER_VERSION_BUILD 0 CACHE INTERNAL "")
  7. if(${CMAKE_VERSION} VERSION_LESS 3.15)
  8. cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
  9. else()
  10. cmake_policy(VERSION 3.15)
  11. endif()
  12. find_program(
  13. GO go
  14. HINTS "/usr/local/go/bin" "C:/go/bin"
  15. )
  16. if(NOT GO)
  17. message(FATAL_ERROR "Golang not found")
  18. else(NOT GO)
  19. message(STATUS "Found Golang at ${GO}")
  20. endif(NOT GO)
  21. set(CMAKE_CXX_STANDARD 11)
  22. set(default_build_type "Release")
  23. if(WIN32)
  24. set(CMAKE_SYSTEM_VERSION "7" CACHE STRING INTERNAL FORCE)
  25. endif(WIN32)
  26. set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "Minimum OS X Deployment Version")
  27. if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  28. message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
  29. set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING "Choose the type of build." FORCE)
  30. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
  31. endif()
  32. option(BUILD_CENTRAL_CONTROLLER "Build ZeroTier Central Controller" OFF)
  33. if(BUILD_CENTRAL_CONTROLLER)
  34. find_package(PkgConfig REQUIRED)
  35. if(APPLE)
  36. set(CMAKE_PREFIX_PATH
  37. ${CMAKE_PREFIX_PATH}
  38. /usr/local/opt/libpq
  39. /usr/local/lib
  40. )
  41. endif(APPLE)
  42. find_package(PostgreSQL REQUIRED)
  43. pkg_check_modules(hiredis REQUIRED IMPORTED_TARGET hiredis)
  44. add_subdirectory(controller/thirdparty/redis-plus-plus-1.1.1)
  45. set(redispp_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/controller/thirdparty/redis-plus-plus-1.1.1/src/sw)
  46. set(redispp_STATIC_LIB redispp_static)
  47. endif(BUILD_CENTRAL_CONTROLLER)
  48. if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  49. add_definitions(-DZT_DEBUG)
  50. endif(CMAKE_BUILD_TYPE STREQUAL "Debug")
  51. if(WIN32)
  52. message("++ Setting Windows Compiler Flags ${CMAKE_BUILD_TYPE}")
  53. add_definitions(-DNOMINMAX)
  54. set(GOFLAGS
  55. -trimpath
  56. )
  57. else(WIN32)
  58. set(GOFLAGS
  59. -trimpath
  60. -buildmode=pie
  61. )
  62. if(APPLE)
  63. message("++ Setting MacOS Compiler Flags ${CMAKE_BUILD_TYPE}")
  64. add_compile_options(
  65. -Wall
  66. -Wno-deprecated
  67. -Wno-unused-function
  68. -mmacosx-version-min=10.12
  69. $<$<CONFIG:DEBUG>:-g>
  70. $<$<CONFIG:DEBUG>:-O0>
  71. $<$<CONFIG:RELEASE>:-Ofast>
  72. $<$<CONFIG:RELEASE>:-ffast-math>
  73. $<$<CONFIG:RELEASE>:-fPIE>
  74. $<$<CONFIG:RELEASE>:-flto>
  75. $<$<CONFIG:RELWITHDEBINFO>:-O1>
  76. $<$<CONFIG:RELWITHDEBINFO>:-fPIE>
  77. $<$<CONFIG:RELWITHDEBINFO>:-g>
  78. )
  79. add_link_options(
  80. -mmacosx-version-min=10.12
  81. $<$<CONFIG:RELEASE>:-flto>
  82. )
  83. set(GOFLAGS
  84. ${GOFLAGS}
  85. -a
  86. -ldflags '-w -extldflags \"-Wl,-undefined -Wl,dynamic_lookup\"'
  87. )
  88. else(APPLE)
  89. message("++ Setting Linux/BSD/Posix Compiler Flags (${CMAKE_BUILD_TYPE})")
  90. add_compile_options(
  91. -Wall
  92. -Wno-deprecated
  93. -Wno-unused-function
  94. -Wno-format
  95. $<$<CONFIG:DEBUG>:-g>
  96. $<$<CONFIG:DEBUG>:-O0>
  97. $<$<CONFIG:RELEASE>:-O3>
  98. $<$<CONFIG:RELEASE>:-ffast-math>
  99. $<$<CONFIG:RELEASE>:-fPIE>
  100. $<$<CONFIG:RELWITHDEBINFO>:-O3>
  101. $<$<CONFIG:RELWITHDEBINFO>:-fPIE>
  102. $<$<CONFIG:RELWITHDEBINFO>:-g>
  103. )
  104. option(BUILD_32BIT "Force building as 32-bit binary" OFF)
  105. option(BUILD_STATIC "Build statically linked executable" OFF)
  106. if(BUILD_32BIT)
  107. set(CMAKE_SYSTEM_PROCESSOR "x86" CACHE STRING "system processor")
  108. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32" CACHE STRING "c++ flags")
  109. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32" CACHE STRING "c flags")
  110. set(GOARCH "GOARCH=386" CACHE STRING "go architecture")
  111. add_compile_options(
  112. -m32
  113. )
  114. endif(BUILD_32BIT)
  115. if(BUILD_STATIC)
  116. add_link_options(
  117. -static
  118. )
  119. set(CMAKE_EXE_LINKER_FLAGS "-static ${CMAKE_EXE_LINKER_FLAGS}")
  120. set(GOFLAGS
  121. ${GOFLAGS}
  122. -a
  123. -tags netgo
  124. -ldflags '-w -extldflags \"-static -Wl,-unresolved-symbols=ignore-all\"'
  125. )
  126. else(BUILD_STATIC)
  127. set(GOFLAGS
  128. ${GOFLAGS}
  129. -a
  130. -tags netgo
  131. -ldflags '-w -extldflags \"-Wl,-unresolved-symbols=ignore-all\"'
  132. )
  133. endif(BUILD_STATIC)
  134. endif(APPLE)
  135. endif(WIN32)
  136. if (
  137. CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR
  138. CMAKE_SYSTEM_PROCESSOR MATCHES "amd64" OR
  139. CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64"
  140. )
  141. message("++ Adding flags for processor ${CMAKE_SYSTEM_PROCESSOR}")
  142. add_compile_options(-maes -mrdrnd -mpclmul -msse -msse2 -mssse3)
  143. endif()
  144. set(GO_BUILD_TAGS)
  145. if(BUILD_CENTRAL_CONTROLLER)
  146. add_definitions(-DZT_CONTROLLER_USE_LIBPQ=1)
  147. set(GO_BUILD_TAGS -tags central)
  148. endif(BUILD_CENTRAL_CONTROLLER)
  149. add_subdirectory(core)
  150. add_subdirectory(controller)
  151. add_subdirectory(osdep)
  152. add_subdirectory(serviceiocore)
  153. file(GLOB go_src
  154. ${CMAKE_SOURCE_DIR}/cmd/*.go
  155. ${CMAKE_SOURCE_DIR}/cmd/cmd/*.go
  156. ${CMAKE_SOURCE_DIR}/pkg/zerotier/*.go)
  157. if(WIN32)
  158. set(GO_EXE_NAME "zerotier.exe")
  159. set(GO_EXTRA_LIBRARIES "-lstdc++ -lwsock32 -lws2_32 -liphlpapi -lole32 -loleaut32 -lrpcrt4 -luuid")
  160. else(WIN32)
  161. set(GO_EXE_NAME "zerotier")
  162. if(CMAKE_SYSTEM_NAME MATCHES "Linux")
  163. set(GO_EXTRA_LIBRARIES "-lstdc++")
  164. else()
  165. set(GO_EXTRA_LIBRARIES "-lc++")
  166. endif()
  167. endif(WIN32)
  168. add_custom_target(
  169. zerotier ALL
  170. BYPRODUCTS ${CMAKE_BINARY_DIR}/zerotier
  171. SOURCES ${go_src}
  172. COMMAND ${CMAKE_COMMAND} -E env "${GOARCH} 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 ${GOFLAGS} -o ${CMAKE_BINARY_DIR}/${GO_EXE_NAME} ${CMAKE_SOURCE_DIR}/cmd/zerotier/zerotier.go
  173. COMMENT "Compiling Go Code..."
  174. )
  175. add_dependencies(zerotier zt_osdep zt_core zt_controller zt_service_io_core)