CMakeLists.txt 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. cmake_minimum_required(VERSION 3.8)
  2. set(Darknet_MAJOR_VERSION 0)
  3. set(Darknet_MINOR_VERSION 2)
  4. set(Darknet_PATCH_VERSION 5)
  5. set(Darknet_TWEAK_VERSION 1)
  6. set(Darknet_VERSION ${Darknet_MAJOR_VERSION}.${Darknet_MINOR_VERSION}.${Darknet_PATCH_VERSION}.${Darknet_TWEAK_VERSION})
  7. option(CMAKE_VERBOSE_MAKEFILE "Create verbose makefile" OFF)
  8. option(CUDA_VERBOSE_BUILD "Create verbose CUDA build" OFF)
  9. option(BUILD_SHARED_LIBS "Create dark as a shared library" ON)
  10. option(BUILD_AS_CPP "Build Darknet using C++ compiler also for C files" OFF)
  11. option(BUILD_USELIB_TRACK "Build uselib_track" ON)
  12. option(MANUALLY_EXPORT_TRACK_OPTFLOW "Manually export the TRACK_OPTFLOW=1 define" OFF)
  13. option(ENABLE_OPENCV "Enable OpenCV integration" ON)
  14. option(ENABLE_CUDA "Enable CUDA support" ON)
  15. option(ENABLE_CUDNN "Enable CUDNN" ON)
  16. option(ENABLE_CUDNN_HALF "Enable CUDNN Half precision" ON)
  17. option(ENABLE_ZED_CAMERA "Enable ZED Camera support" ON)
  18. option(ENABLE_VCPKG_INTEGRATION "Enable VCPKG integration" ON)
  19. if(ENABLE_VCPKG_INTEGRATION AND DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
  20. set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "")
  21. message(STATUS "VCPKG found: $ENV{VCPKG_ROOT}")
  22. message(STATUS "Using VCPKG integration")
  23. endif()
  24. project(Darknet VERSION ${Darknet_VERSION})
  25. if(WIN32 AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
  26. set(USE_INTEGRATED_LIBS "TRUE" CACHE BOOL "Use libs distributed with this repo")
  27. else()
  28. set(USE_INTEGRATED_LIBS "FALSE" CACHE BOOL "Use libs distributed with this repo")
  29. endif()
  30. enable_language(C)
  31. enable_language(CXX)
  32. set(CMAKE_CXX_STANDARD 11)
  33. set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/Modules/" ${CMAKE_MODULE_PATH})
  34. if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
  35. set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "Install prefix" FORCE)
  36. endif()
  37. set(INSTALL_BIN_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "Path where exe and dll will be installed")
  38. set(INSTALL_LIB_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "Path where lib will be installed")
  39. set(INSTALL_INCLUDE_DIR "include/darknet" CACHE PATH "Path where headers will be installed")
  40. set(INSTALL_CMAKE_DIR "share/darknet" CACHE PATH "Path where cmake configs will be installed")
  41. if(${CMAKE_VERSION} VERSION_LESS "3.9.0")
  42. message(WARNING "To build with CUDA support you need CMake 3.9.0+")
  43. set(ENABLE_CUDA "FALSE" CACHE BOOL "Enable CUDA support" FORCE)
  44. else()
  45. include(CheckLanguage)
  46. check_language(CUDA)
  47. if(CMAKE_CUDA_COMPILER AND ENABLE_CUDA)
  48. set(CUDA_ARCHITECTURES "Auto" CACHE STRING "\"Auto\" detects local machine GPU compute arch at runtime, \"Common\" and \"All\" cover common and entire subsets of architectures, \"Names\" is a list of architectures to enable by name, \"Numbers\" is a list of compute capabilities (version number) to enable")
  49. set_property(CACHE CUDA_ARCHITECTURES PROPERTY STRINGS "Auto" "Common" "All" "Kepler Maxwell Kepler+Tegra Maxwell+Tegra Pascal" "3.0 7.5")
  50. enable_language(CUDA)
  51. find_package(CUDA REQUIRED)
  52. if(CUDA_VERSION VERSION_LESS "9.0")
  53. message(STATUS "Unsupported CUDA version, please upgrade to CUDA 9+. Disabling CUDA support")
  54. set(ENABLE_CUDA "FALSE" CACHE BOOL "Enable CUDA support" FORCE)
  55. else()
  56. cuda_select_nvcc_arch_flags(CUDA_ARCH_FLAGS ${CUDA_ARCHITECTURES})
  57. message(STATUS "Building with CUDA flags: " "${CUDA_ARCH_FLAGS}")
  58. if (NOT "arch=compute_75,code=sm_75" IN_LIST CUDA_ARCH_FLAGS)
  59. set(ENABLE_CUDNN_HALF "FALSE" CACHE BOOL "Enable CUDNN Half precision" FORCE)
  60. message(STATUS "Your setup does not supports half precision (it requires CC >= 7.5)")
  61. endif()
  62. endif()
  63. else()
  64. set(ENABLE_CUDA "FALSE" CACHE BOOL "Enable CUDA support" FORCE)
  65. endif()
  66. endif()
  67. if (WIN32 AND ENABLE_CUDA AND CMAKE_MAKE_PROGRAM MATCHES "ninja")
  68. option(SELECT_OPENCV_MODULES "Use only few selected OpenCV modules to circumvent 8192 char limit when using Ninja on Windows" ON)
  69. else()
  70. option(SELECT_OPENCV_MODULES "Use only few selected OpenCV modules to circumvent 8192 char limit when using Ninja on Windows" OFF)
  71. endif()
  72. if(USE_INTEGRATED_LIBS)
  73. set(PThreads_windows_DIR ${CMAKE_CURRENT_LIST_DIR}/3rdparty/pthreads CACHE PATH "Path where pthreads for windows can be located")
  74. endif()
  75. set(Stb_DIR ${CMAKE_CURRENT_LIST_DIR}/3rdparty/stb CACHE PATH "Path where Stb image library can be located")
  76. set(CMAKE_DEBUG_POSTFIX d)
  77. set(CMAKE_THREAD_PREFER_PTHREAD ON)
  78. find_package(Threads REQUIRED)
  79. if(MSVC)
  80. find_package(PThreads_windows REQUIRED)
  81. endif()
  82. if(ENABLE_OPENCV)
  83. find_package(OpenCV)
  84. if(OpenCV_FOUND)
  85. if(SELECT_OPENCV_MODULES)
  86. if(TARGET opencv_world)
  87. list(APPEND OpenCV_LINKED_COMPONENTS "opencv_world")
  88. else()
  89. if(TARGET opencv_core)
  90. list(APPEND OpenCV_LINKED_COMPONENTS "opencv_core")
  91. endif()
  92. if(TARGET opencv_highgui)
  93. list(APPEND OpenCV_LINKED_COMPONENTS "opencv_highgui")
  94. endif()
  95. if(TARGET opencv_imgproc)
  96. list(APPEND OpenCV_LINKED_COMPONENTS "opencv_imgproc")
  97. endif()
  98. if(TARGET opencv_video)
  99. list(APPEND OpenCV_LINKED_COMPONENTS "opencv_video")
  100. endif()
  101. if(TARGET opencv_videoio)
  102. list(APPEND OpenCV_LINKED_COMPONENTS "opencv_videoio")
  103. endif()
  104. if(TARGET opencv_imgcodecs)
  105. list(APPEND OpenCV_LINKED_COMPONENTS "opencv_imgcodecs")
  106. endif()
  107. if(TARGET opencv_text)
  108. list(APPEND OpenCV_LINKED_COMPONENTS "opencv_text")
  109. endif()
  110. endif()
  111. else()
  112. list(APPEND OpenCV_LINKED_COMPONENTS ${OpenCV_LIBS})
  113. endif()
  114. endif()
  115. endif()
  116. find_package(Stb REQUIRED)
  117. if(${CMAKE_VERSION} VERSION_LESS "3.11.0")
  118. message(WARNING "To build with OpenMP support you need CMake 3.11.0+")
  119. else()
  120. find_package(OpenMP)
  121. endif()
  122. set(ADDITIONAL_CXX_FLAGS "-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -Wno-deprecated-declarations -Wno-write-strings")
  123. set(ADDITIONAL_C_FLAGS "-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -Wno-deprecated-declarations -Wno-write-strings")
  124. if(MSVC)
  125. set(ADDITIONAL_CXX_FLAGS "/wd4013 /wd4018 /wd4028 /wd4047 /wd4068 /wd4090 /wd4101 /wd4113 /wd4133 /wd4190 /wd4244 /wd4267 /wd4305 /wd4477 /wd4996 /wd4819 /fp:fast")
  126. set(ADDITIONAL_C_FLAGS "/wd4013 /wd4018 /wd4028 /wd4047 /wd4068 /wd4090 /wd4101 /wd4113 /wd4133 /wd4190 /wd4244 /wd4267 /wd4305 /wd4477 /wd4996 /wd4819 /fp:fast")
  127. set(CMAKE_CXX_FLAGS "${ADDITIONAL_CXX_FLAGS} ${CMAKE_CXX_FLAGS}")
  128. set(CMAKE_C_FLAGS "${ADDITIONAL_C_FLAGS} ${CMAKE_C_FLAGS}")
  129. string(REGEX REPLACE "/O2" "/Ox" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
  130. string(REGEX REPLACE "/O2" "/Ox" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
  131. endif()
  132. if(CMAKE_COMPILER_IS_GNUCC OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
  133. if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
  134. if (UNIX AND NOT APPLE)
  135. set(CMAKE_CXX_FLAGS "-pthread ${CMAKE_CXX_FLAGS}") #force pthread to avoid bugs in some cmake setups
  136. set(CMAKE_C_FLAGS "-pthread ${CMAKE_C_FLAGS}")
  137. endif()
  138. endif()
  139. set(CMAKE_CXX_FLAGS "${ADDITIONAL_CXX_FLAGS} ${CMAKE_CXX_FLAGS}")
  140. set(CMAKE_C_FLAGS "${ADDITIONAL_C_FLAGS} ${CMAKE_C_FLAGS}")
  141. string(REGEX REPLACE "-O0" "-Og" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
  142. string(REGEX REPLACE "-O3" "-Ofast" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
  143. string(REGEX REPLACE "-O0" "-Og" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
  144. string(REGEX REPLACE "-O3" "-Ofast" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
  145. set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -ffp-contract=fast -mavx -mavx2 -msse3 -msse4.1 -msse4.2 -msse4a")
  146. set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -ffp-contract=fast -mavx -mavx2 -msse3 -msse4.1 -msse4.2 -msse4a")
  147. endif()
  148. if(OpenCV_FOUND)
  149. if(ENABLE_CUDA AND NOT OpenCV_CUDA_VERSION)
  150. set(BUILD_USELIB_TRACK "FALSE" CACHE BOOL "Build uselib_track" FORCE)
  151. message(STATUS " -> darknet is fine for now, but uselib_track has been disabled!")
  152. message(STATUS " -> Please rebuild OpenCV from sources with CUDA support to enable it")
  153. elseif(ENABLE_CUDA AND OpenCV_CUDA_VERSION)
  154. if(TARGET opencv_cudaoptflow)
  155. list(APPEND OpenCV_LINKED_COMPONENTS "opencv_cudaoptflow")
  156. endif()
  157. if(TARGET opencv_cudaimgproc)
  158. list(APPEND OpenCV_LINKED_COMPONENTS "opencv_cudaimgproc")
  159. endif()
  160. endif()
  161. endif()
  162. if(ENABLE_CUDA)
  163. find_package(CUDNN)
  164. if(NOT CUDNN_FOUND)
  165. set(ENABLE_CUDNN "FALSE" CACHE BOOL "Enable CUDNN" FORCE)
  166. endif()
  167. endif()
  168. if(ENABLE_CUDA)
  169. if (MSVC)
  170. set(ADDITIONAL_CXX_FLAGS "${ADDITIONAL_CXX_FLAGS} /DGPU")
  171. if(CUDNN_FOUND)
  172. set(ADDITIONAL_CXX_FLAGS "${ADDITIONAL_CXX_FLAGS} /DCUDNN")
  173. endif()
  174. if(OpenCV_FOUND)
  175. set(ADDITIONAL_CXX_FLAGS "${ADDITIONAL_CXX_FLAGS} /DOPENCV")
  176. endif()
  177. string(REPLACE " " "," ADDITIONAL_CXX_FLAGS_COMMA_SEPARATED "${ADDITIONAL_CXX_FLAGS}")
  178. set(CUDA_HOST_COMPILER_FLAGS "-Wno-deprecated-declarations -Xcompiler=\"${ADDITIONAL_CXX_FLAGS_COMMA_SEPARATED}\"")
  179. else()
  180. set(ADDITIONAL_CXX_FLAGS "${ADDITIONAL_CXX_FLAGS} -DGPU")
  181. if(CUDNN_FOUND)
  182. set(ADDITIONAL_CXX_FLAGS "${ADDITIONAL_CXX_FLAGS} -DCUDNN")
  183. endif()
  184. if(OpenCV_FOUND)
  185. set(ADDITIONAL_CXX_FLAGS "${ADDITIONAL_CXX_FLAGS} -DOPENCV")
  186. endif()
  187. set(CUDA_HOST_COMPILER_FLAGS "--compiler-options \" ${ADDITIONAL_CXX_FLAGS} -fPIC -fopenmp -Ofast \"")
  188. endif()
  189. string (REPLACE ";" " " CUDA_ARCH_FLAGS_SPACE_SEPARATED "${CUDA_ARCH_FLAGS}")
  190. set(CMAKE_CUDA_FLAGS "${CUDA_ARCH_FLAGS_SPACE_SEPARATED} ${CUDA_HOST_COMPILER_FLAGS} ${CMAKE_CUDA_FLAGS}")
  191. message(STATUS "CMAKE_CUDA_FLAGS: ${CMAKE_CUDA_FLAGS}")
  192. endif()
  193. if(ENABLE_CUDA)
  194. if(ENABLE_ZED_CAMERA)
  195. find_package(ZED 2 QUIET)
  196. if(ZED_FOUND)
  197. include_directories(${ZED_INCLUDE_DIRS})
  198. link_directories(${ZED_LIBRARY_DIR})
  199. message(STATUS "ZED SDK enabled")
  200. else()
  201. message(STATUS "ZED SDK not found")
  202. set(ENABLE_ZED_CAMERA "FALSE" CACHE BOOL "Enable ZED Camera support" FORCE)
  203. endif()
  204. endif()
  205. else()
  206. message(STATUS "ZED SDK not enabled, since it requires CUDA")
  207. set(ENABLE_ZED_CAMERA "FALSE" CACHE BOOL "Enable ZED Camera support" FORCE)
  208. endif()
  209. set(DARKNET_INSTALL_INCLUDE_DIR ${INSTALL_INCLUDE_DIR})
  210. # Make relative paths absolute (needed later on)
  211. foreach(p LIB BIN INCLUDE CMAKE)
  212. set(var INSTALL_${p}_DIR)
  213. if(NOT IS_ABSOLUTE "${${var}}")
  214. set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}")
  215. endif()
  216. endforeach()
  217. configure_file(
  218. "${CMAKE_CURRENT_LIST_DIR}/src/version.h.in"
  219. "${CMAKE_CURRENT_LIST_DIR}/src/version.h"
  220. )
  221. #look for all *.h files in src folder
  222. file(GLOB headers "${CMAKE_CURRENT_LIST_DIR}/src/*.h")
  223. #add also files in the include folder
  224. list(APPEND headers
  225. ${CMAKE_CURRENT_LIST_DIR}/include/darknet.h
  226. )
  227. #remove windows only files
  228. if(NOT WIN32)
  229. list(REMOVE_ITEM headers
  230. ${CMAKE_CURRENT_LIST_DIR}/src/gettimeofday.h
  231. ${CMAKE_CURRENT_LIST_DIR}/src/getopt.h
  232. )
  233. endif()
  234. #set(exported_headers ${headers})
  235. #look for all *.c files in src folder
  236. file(GLOB sources "${CMAKE_CURRENT_LIST_DIR}/src/*.c")
  237. #add also .cpp files
  238. list(APPEND sources
  239. ${CMAKE_CURRENT_LIST_DIR}/src/http_stream.cpp
  240. ${CMAKE_CURRENT_LIST_DIR}/src/image_opencv.cpp
  241. )
  242. #remove darknet.c file which is necessary only for the executable, not for the lib
  243. list(REMOVE_ITEM sources
  244. ${CMAKE_CURRENT_LIST_DIR}/src/darknet.c
  245. )
  246. #remove windows only files
  247. if(NOT WIN32)
  248. list(REMOVE_ITEM sources
  249. ${CMAKE_CURRENT_LIST_DIR}/src/gettimeofday.c
  250. ${CMAKE_CURRENT_LIST_DIR}/src/getopt.c
  251. )
  252. endif()
  253. if(ENABLE_CUDA)
  254. file(GLOB cuda_sources "${CMAKE_CURRENT_LIST_DIR}/src/*.cu")
  255. endif()
  256. if(BUILD_AS_CPP)
  257. set_source_files_properties(${sources} PROPERTIES LANGUAGE CXX)
  258. endif()
  259. add_library(dark ${CMAKE_CURRENT_LIST_DIR}/include/yolo_v2_class.hpp ${CMAKE_CURRENT_LIST_DIR}/src/yolo_v2_class.cpp ${sources} ${headers} ${cuda_sources})
  260. set_target_properties(dark PROPERTIES POSITION_INDEPENDENT_CODE ON)
  261. if(ENABLE_CUDA)
  262. set_target_properties(dark PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
  263. endif()
  264. if(BUILD_SHARED_LIBS)
  265. target_compile_definitions(dark PRIVATE LIB_EXPORTS=1)
  266. endif()
  267. if(BUILD_AS_CPP)
  268. set_target_properties(dark PROPERTIES LINKER_LANGUAGE CXX)
  269. endif()
  270. if(OpenCV_FOUND AND OpenCV_VERSION VERSION_GREATER "3.0" AND BUILD_USELIB_TRACK)
  271. add_executable(uselib_track ${CMAKE_CURRENT_LIST_DIR}/src/yolo_console_dll.cpp)
  272. endif()
  273. add_executable(uselib ${CMAKE_CURRENT_LIST_DIR}/src/yolo_console_dll.cpp)
  274. if(BUILD_AS_CPP)
  275. set_target_properties(uselib PROPERTIES LINKER_LANGUAGE CXX)
  276. endif()
  277. add_executable(darknet ${CMAKE_CURRENT_LIST_DIR}/src/darknet.c ${sources} ${headers} ${cuda_sources})
  278. if(BUILD_AS_CPP)
  279. set_source_files_properties(${CMAKE_CURRENT_LIST_DIR}/src/darknet.c PROPERTIES LANGUAGE CXX)
  280. set_target_properties(darknet PROPERTIES LINKER_LANGUAGE CXX)
  281. endif()
  282. target_include_directories(darknet PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/src> $<INSTALL_INTERFACE:${DARKNET_INSTALL_INCLUDE_DIR}> $<BUILD_INTERFACE:${Stb_INCLUDE_DIR}>)
  283. target_include_directories(dark PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/src> $<INSTALL_INTERFACE:${DARKNET_INSTALL_INCLUDE_DIR}> $<BUILD_INTERFACE:${Stb_INCLUDE_DIR}>)
  284. target_include_directories(uselib PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/src> $<INSTALL_INTERFACE:${DARKNET_INSTALL_INCLUDE_DIR}> $<BUILD_INTERFACE:${Stb_INCLUDE_DIR}>)
  285. target_compile_definitions(darknet PRIVATE -DUSE_CMAKE_LIBS)
  286. target_compile_definitions(dark PRIVATE -DUSE_CMAKE_LIBS)
  287. target_compile_definitions(uselib PRIVATE -DUSE_CMAKE_LIBS)
  288. if(OpenCV_FOUND AND OpenCV_VERSION VERSION_GREATER "3.0" AND BUILD_USELIB_TRACK AND NOT MANUALLY_EXPORT_TRACK_OPTFLOW)
  289. target_compile_definitions(dark PUBLIC TRACK_OPTFLOW=1)
  290. endif()
  291. if(CUDNN_FOUND)
  292. target_link_libraries(darknet PRIVATE CuDNN::CuDNN)
  293. target_link_libraries(dark PRIVATE CuDNN::CuDNN)
  294. target_compile_definitions(darknet PRIVATE -DCUDNN)
  295. target_compile_definitions(dark PUBLIC -DCUDNN)
  296. if(ENABLE_CUDNN_HALF)
  297. target_compile_definitions(darknet PRIVATE -DCUDNN_HALF)
  298. target_compile_definitions(dark PUBLIC -DCUDNN_HALF)
  299. endif()
  300. endif()
  301. if(OpenCV_FOUND)
  302. target_link_libraries(darknet PRIVATE ${OpenCV_LINKED_COMPONENTS})
  303. target_link_libraries(uselib PRIVATE ${OpenCV_LINKED_COMPONENTS})
  304. target_link_libraries(dark PUBLIC ${OpenCV_LINKED_COMPONENTS})
  305. target_include_directories(dark PUBLIC ${OpenCV_INCLUDE_DIRS})
  306. target_compile_definitions(darknet PRIVATE -DOPENCV)
  307. target_compile_definitions(dark PUBLIC -DOPENCV)
  308. endif()
  309. if(OPENMP_FOUND)
  310. target_link_libraries(darknet PRIVATE OpenMP::OpenMP_CXX)
  311. target_link_libraries(darknet PRIVATE OpenMP::OpenMP_C)
  312. target_link_libraries(dark PUBLIC OpenMP::OpenMP_CXX)
  313. target_link_libraries(dark PUBLIC OpenMP::OpenMP_C)
  314. endif()
  315. if(CMAKE_COMPILER_IS_GNUCC)
  316. target_link_libraries(darknet PRIVATE m)
  317. target_link_libraries(dark PUBLIC m)
  318. endif()
  319. if(MSVC)
  320. target_link_libraries(darknet PRIVATE PThreads_windows::PThreads_windows)
  321. target_link_libraries(darknet PRIVATE wsock32 ws2_32)
  322. target_link_libraries(dark PUBLIC PThreads_windows::PThreads_windows)
  323. target_link_libraries(dark PUBLIC wsock32 ws2_32)
  324. target_link_libraries(uselib PRIVATE PThreads_windows::PThreads_windows)
  325. target_compile_definitions(darknet PRIVATE -D_CRT_RAND_S -DNOMINMAX -D_USE_MATH_DEFINES)
  326. target_compile_definitions(dark PRIVATE -D_CRT_RAND_S -DNOMINMAX -D_USE_MATH_DEFINES)
  327. target_compile_definitions(dark PUBLIC -D_CRT_SECURE_NO_WARNINGS)
  328. target_compile_definitions(uselib PRIVATE -D_CRT_RAND_S -DNOMINMAX -D_USE_MATH_DEFINES)
  329. endif()
  330. target_link_libraries(darknet PRIVATE Threads::Threads)
  331. target_link_libraries(dark PUBLIC Threads::Threads)
  332. target_link_libraries(uselib PRIVATE Threads::Threads)
  333. if(ENABLE_ZED_CAMERA)
  334. target_link_libraries(darknet PRIVATE ${ZED_LIBRARIES})
  335. target_link_libraries(dark PUBLIC ${ZED_LIBRARIES})
  336. target_link_libraries(uselib PRIVATE ${ZED_LIBRARIES})
  337. target_compile_definitions(darknet PRIVATE -DZED_STEREO)
  338. target_compile_definitions(uselib PRIVATE -DZED_STEREO)
  339. target_compile_definitions(dark PUBLIC -DZED_STEREO)
  340. endif()
  341. if(ENABLE_CUDA)
  342. target_include_directories(darknet PRIVATE ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
  343. target_include_directories(dark PUBLIC ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
  344. target_link_libraries(darknet PRIVATE curand cublas cuda)
  345. target_link_libraries(dark PRIVATE curand cublas cuda)
  346. set_target_properties(dark PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON)
  347. target_compile_definitions(darknet PRIVATE -DGPU)
  348. target_compile_definitions(dark PUBLIC -DGPU)
  349. endif()
  350. if(USE_INTEGRATED_LIBS)
  351. target_compile_definitions(darknet PRIVATE -D_TIMESPEC_DEFINED)
  352. target_compile_definitions(dark PRIVATE -D_TIMESPEC_DEFINED)
  353. endif()
  354. target_link_libraries(uselib PRIVATE dark)
  355. if(OpenCV_FOUND AND OpenCV_VERSION VERSION_GREATER "3.0" AND BUILD_USELIB_TRACK)
  356. target_link_libraries(uselib_track PRIVATE dark)
  357. target_compile_definitions(uselib_track PRIVATE TRACK_OPTFLOW=1)
  358. target_compile_definitions(uselib_track PRIVATE -DUSE_CMAKE_LIBS)
  359. if(BUILD_AS_CPP)
  360. set_target_properties(uselib_track PROPERTIES LINKER_LANGUAGE CXX)
  361. endif()
  362. target_include_directories(uselib_track PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include)
  363. target_link_libraries(uselib_track PRIVATE ${OpenCV_LINKED_COMPONENTS})
  364. if(ENABLE_ZED_CAMERA)
  365. target_link_libraries(uselib_track PRIVATE ${ZED_LIBRARIES})
  366. target_compile_definitions(uselib_track PRIVATE -DZED_STEREO)
  367. endif()
  368. if(MSVC)
  369. target_link_libraries(uselib_track PRIVATE PThreads_windows::PThreads_windows)
  370. target_compile_definitions(uselib_track PRIVATE -D_CRT_RAND_S -DNOMINMAX -D_USE_MATH_DEFINES)
  371. endif()
  372. target_link_libraries(uselib_track PRIVATE Threads::Threads)
  373. endif()
  374. #set_target_properties(dark PROPERTIES PUBLIC_HEADER "${exported_headers};${CMAKE_CURRENT_LIST_DIR}/include/yolo_v2_class.hpp")
  375. set_target_properties(dark PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_LIST_DIR}/include/darknet.h;${CMAKE_CURRENT_LIST_DIR}/include/yolo_v2_class.hpp")
  376. set_target_properties(dark PROPERTIES CXX_VISIBILITY_PRESET hidden)
  377. install(TARGETS dark EXPORT DarknetTargets
  378. RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
  379. LIBRARY DESTINATION "${INSTALL_LIB_DIR}"
  380. ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
  381. PUBLIC_HEADER DESTINATION "${INSTALL_INCLUDE_DIR}"
  382. COMPONENT dev
  383. )
  384. install(TARGETS uselib darknet
  385. DESTINATION "${INSTALL_BIN_DIR}"
  386. )
  387. if(OpenCV_FOUND AND OpenCV_VERSION VERSION_GREATER "3.0" AND BUILD_USELIB_TRACK)
  388. install(TARGETS uselib_track
  389. DESTINATION "${INSTALL_BIN_DIR}"
  390. )
  391. endif()
  392. install(EXPORT DarknetTargets
  393. FILE DarknetTargets.cmake
  394. NAMESPACE Darknet::
  395. DESTINATION "${INSTALL_CMAKE_DIR}"
  396. )
  397. # Export the package for use from the build-tree (this registers the build-tree with a global CMake-registry)
  398. export(PACKAGE Darknet)
  399. # Create the DarknetConfig.cmake
  400. # First of all we compute the relative path between the cmake config file and the include path
  401. file(RELATIVE_PATH REL_INCLUDE_DIR "${INSTALL_CMAKE_DIR}" "${INSTALL_INCLUDE_DIR}")
  402. set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}")
  403. configure_file(DarknetConfig.cmake.in "${PROJECT_BINARY_DIR}/DarknetConfig.cmake" @ONLY)
  404. set(CONF_INCLUDE_DIRS "\${Darknet_CMAKE_DIR}/${REL_INCLUDE_DIR}")
  405. configure_file(DarknetConfig.cmake.in "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/DarknetConfig.cmake" @ONLY)
  406. # Create the DarknetConfigVersion.cmake
  407. include(CMakePackageConfigHelpers)
  408. write_basic_package_version_file("${PROJECT_BINARY_DIR}/DarknetConfigVersion.cmake"
  409. COMPATIBILITY SameMajorVersion
  410. )
  411. install(FILES
  412. "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/DarknetConfig.cmake"
  413. "${PROJECT_BINARY_DIR}/DarknetConfigVersion.cmake"
  414. DESTINATION "${INSTALL_CMAKE_DIR}"
  415. )