From c88ae98289d026f65d63ede24d8121bd06a92c1b Mon Sep 17 00:00:00 2001 From: Stefano Sinigardi Date: Thu, 14 Feb 2019 17:37:12 +0100 Subject: [PATCH] add CMakeLists.txt and necessary modules --- CMakeLists.txt | 244 +++++++++++++++++++++++ cmake/Modules/FindCUDNN.cmake | 68 +++++++ cmake/Modules/FindPThreads_windows.cmake | 75 +++++++ 3 files changed, 387 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 cmake/Modules/FindCUDNN.cmake create mode 100644 cmake/Modules/FindPThreads_windows.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..5669a470 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,244 @@ +cmake_minimum_required(VERSION 3.8 FATAL_ERROR) + +#set(CMAKE_VERBOSE_MAKEFILE 1) + +if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) + set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "") +endif() + +project(darknet) + +enable_language(C) +enable_language(CXX) +if(ENABLE_CUDA) + enable_language(CUDA) # do not enable after searching for OpenCV package! +endif() + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/Modules/" ${CMAKE_MODULE_PATH}) +include_directories(${CMAKE_CURRENT_LIST_DIR}/include) +include_directories(${CMAKE_CURRENT_LIST_DIR}/src) + +if(NOT APPLE) + set(CMAKE_SKIP_BUILD_RPATH FALSE) + set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +endif() +set(CMAKE_INSTALL_RPATH "${CMAKE_SOURCE_DIR}") + +add_definitions(-DUSE_CMAKE_LIBS) + +if(MSVC) + set(CMAKE_C_FLAGS "/wd4013 /wd4018 /wd4028 /wd4047 /wd4068 /wd4090 /wd4101 /wd4113 /wd4133 /wd4190 /wd4244 /wd4267 /wd4305 /wd4477 /wd4996 /fp:fast ${CMAKE_C_FLAGS}") + set(CMAKE_CXX_FLAGS "/wd4013 /wd4018 /wd4028 /wd4047 /wd4068 /wd4090 /wd4101 /wd4113 /wd4133 /wd4190 /wd4244 /wd4267 /wd4305 /wd4477 /wd4996 /fp:fast ${CMAKE_CXX_FLAGS}") + string(REGEX REPLACE "/O2" "/Ox" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE}) + string(REGEX REPLACE "/O2" "/Ox" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) + add_definitions(-D_CRT_RAND_S) + add_definitions(-DNOMINMAX) + add_definitions(-D_USE_MATH_DEFINES) +endif() + +if(CMAKE_COMPILER_IS_GNUCC) + set(CMAKE_C_FLAGS "-Wno-unused-result -Wno-discarded-qualifiers -Wno-incompatible-pointer-types ${CMAKE_C_FLAGS}") + set(CMAKE_CXX_FLAGS "-Wno-unused-result -Wno-write-strings ${CMAKE_CXX_FLAGS}") + string(REGEX REPLACE "-O0" "-Og" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG}) + string(REGEX REPLACE "-O0" "-Og" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) + string(REGEX REPLACE "-O3" "-Ofast" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE}) + string(REGEX REPLACE "-O3" "-Ofast" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -ffp-contract=fast -mavx -mavx2 -msse3 -msse4.1 -msse4.2 -msse4a") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -ffp-contract=fast -mavx -mavx2 -msse3 -msse4.1 -msse4.2 -msse4a") +endif() + +if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + set(CMAKE_CXX_FLAGS "-Wno-deprecated -Wno-writable-strings ${CMAKE_CXX_FLAGS}") + string(REGEX REPLACE "-O0" "-Og" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG}) + string(REGEX REPLACE "-O0" "-Og" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) + string(REGEX REPLACE "-O3" "-Ofast" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE}) + string(REGEX REPLACE "-O3" "-Ofast" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) +endif() + +if(APPLE) + find_package(OpenCV PATHS "/usr/local/Cellar/opencv@3/3.4.5" NO_DEFAULT_PATH) +else() + find_package(OpenCV) +endif() + +if(OpenCV_FOUND) + add_definitions(-DOPENCV) + include_directories(${OpenCV_INCLUDE_DIRS}) +endif() + +if(ENABLE_CUDA) + add_definitions(-DGPU) + #set(COMPUTE_MODEL "75") #Tesla T4, RTX 2080 + #set(COMPUTE_MODEL "72") #Jetson Xavier + #set(COMPUTE_MODEL "70") #Tesla V100 + #set(COMPUTE_MODEL "62") #Jetson TX2 + #set(COMPUTE_MODEL "61") #Telsa P40 + #set(COMPUTE_MODEL "60") #Telsa P100 + #set(COMPUTE_MODEL "53") #Jetson TX1 + #set(COMPUTE_MODEL "52") #Tesla M40/M60 + #set(COMPUTE_MODEL "37") #Tesla K80 + #set(COMPUTE_MODEL "35") #Tesla K20/K40 + set(COMPUTE_MODEL "30") #Tesla K10, Quadro K4000 + if(COMPUTE_MODEL VERSION_GREATER_EQUAL 53) + add_definitions(-DCUDNN_HALF) + endif() + find_package(CUDNN) + if(CUDNN_FOUND) + add_definitions(-DCUDNN) + include_directories(${CUDNN_INCLUDE_DIR}) + endif() + if (MSVC) + if(CUDNN_FOUND) + if(OpenCV_FOUND) + set(CMAKE_CUDA_FLAGS "-gencode arch=compute_${COMPUTE_MODEL},code=[sm_${COMPUTE_MODEL},compute_${COMPUTE_MODEL}] -Wno-deprecated-declarations -Xcompiler=\"/wd4028,/wd4190,/wd4244,/wd4267,/wd4305,/wd4477,/wd4996,/DGPU,/DCUDNN,/DOPENCV\" ${CMAKE_CUDA_FLAGS}") + else() + set(CMAKE_CUDA_FLAGS "-gencode arch=compute_${COMPUTE_MODEL},code=[sm_${COMPUTE_MODEL},compute_${COMPUTE_MODEL}] -Wno-deprecated-declarations -Xcompiler=\"/wd4028,/wd4190,/wd4244,/wd4267,/wd4305,/wd4477,/wd4996,/DGPU,/DCUDNN\" ${CMAKE_CUDA_FLAGS}") + endif() + else() + if(OpenCV_FOUND) + set(CMAKE_CUDA_FLAGS "-gencode arch=compute_${COMPUTE_MODEL},code=[sm_${COMPUTE_MODEL},compute_${COMPUTE_MODEL}] -Wno-deprecated-declarations -Xcompiler=\"/wd4028,/wd4190,/wd4244,/wd4267,/wd4305,/wd4477,/wd4996,/DGPU,/DOPENCV\" ${CMAKE_CUDA_FLAGS}") + else() + set(CMAKE_CUDA_FLAGS "-gencode arch=compute_${COMPUTE_MODEL},code=[sm_${COMPUTE_MODEL},compute_${COMPUTE_MODEL}] -Wno-deprecated-declarations -Xcompiler=\"/wd4028,/wd4190,/wd4244,/wd4267,/wd4305,/wd4477,/wd4996,/DGPU\" ${CMAKE_CUDA_FLAGS}") + endif() + endif() + else() + if(CUDNN_FOUND) + if(OpenCV_FOUND) + set(CMAKE_CUDA_FLAGS "-gencode arch=compute_${COMPUTE_MODEL},code=[sm_${COMPUTE_MODEL},compute_${COMPUTE_MODEL}] --compiler-options \"-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -Wno-deprecated-declarations -fPIC -fopenmp -Ofast -DOPENCV -DGPU -DCUDNN \" ${CMAKE_CUDA_FLAGS}") + else() + set(CMAKE_CUDA_FLAGS "-gencode arch=compute_${COMPUTE_MODEL},code=[sm_${COMPUTE_MODEL},compute_${COMPUTE_MODEL}] --compiler-options \"-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -Wno-deprecated-declarations -fPIC -fopenmp -Ofast -DGPU -DCUDNN \" ${CMAKE_CUDA_FLAGS}") + endif() + else() + if(OpenCV_FOUND) + set(CMAKE_CUDA_FLAGS "-gencode arch=compute_${COMPUTE_MODEL},code=[sm_${COMPUTE_MODEL},compute_${COMPUTE_MODEL}] --compiler-options \"-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -Wno-deprecated-declarations -fPIC -fopenmp -Ofast -DOPENCV -DGPU \" ${CMAKE_CUDA_FLAGS}") + else() + set(CMAKE_CUDA_FLAGS "-gencode arch=compute_${COMPUTE_MODEL},code=[sm_${COMPUTE_MODEL},compute_${COMPUTE_MODEL}] --compiler-options \"-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -Wno-deprecated-declarations -fPIC -fopenmp -Ofast -DGPU \" ${CMAKE_CUDA_FLAGS}") + endif() + endif() + endif() +endif() + +set(CMAKE_THREAD_PREFER_PTHREAD ON) +find_package(Threads REQUIRED) +if(MSVC) + find_package(PThreads_windows REQUIRED) + include_directories(${PTHREADS_INCLUDE_DIR}) +endif() + +find_package(OpenMP) +if(OPENMP_FOUND) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") +endif() + +#look for all *.h files in src folder +file(GLOB headers "${CMAKE_CURRENT_LIST_DIR}/src/*.h") +#add also files in the include folder +list(APPEND sources + ${CMAKE_CURRENT_LIST_DIR}/include/darknet.h +) +#remove windows only files, will be re-added if necessary later +list(REMOVE_ITEM headers + ${CMAKE_CURRENT_LIST_DIR}/src/gettimeofday.h + ${CMAKE_CURRENT_LIST_DIR}/src/getopt.h +) + +#look for all *.c files in src folder +file(GLOB sources "${CMAKE_CURRENT_LIST_DIR}/src/*.c") +#add also .cpp files +list(APPEND sources + ${CMAKE_CURRENT_LIST_DIR}/src/http_stream.cpp +) +#remove darknet.c file which is necessary only for the executable, not for the lib +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_LIST_DIR}/src/darknet.c +) +#remove windows only files, will be re-added if necessary later +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_LIST_DIR}/src/gettimeofday.c + ${CMAKE_CURRENT_LIST_DIR}/src/getopt.c +) + +if(ENABLE_CUDA) + file(GLOB cuda_sources "${CMAKE_CURRENT_LIST_DIR}/src/*.cu") +endif() + +if(WIN32) + list(APPEND sources + ${CMAKE_CURRENT_LIST_DIR}/src/gettimeofday.c + ${CMAKE_CURRENT_LIST_DIR}/src/getopt.c + ) + + list(APPEND headers + ${CMAKE_CURRENT_LIST_DIR}/src/gettimeofday.h + ${CMAKE_CURRENT_LIST_DIR}/src/getopt.h + ) +endif() + +set_source_files_properties(${sources} PROPERTIES LANGUAGE CXX) + +add_library(darklib SHARED ${CMAKE_CURRENT_LIST_DIR}/include/yolo_v2_class.hpp ${CMAKE_CURRENT_LIST_DIR}/src/yolo_v2_class.cpp ${sources} ${headers} ${cuda_sources}) +set_target_properties(darklib PROPERTIES POSITION_INDEPENDENT_CODE ON) +if(ENABLE_CUDA) + set_target_properties(darklib PROPERTIES CUDA_SEPARABLE_COMPILATION ON) +endif() +target_compile_definitions(darklib PRIVATE LIB_EXPORTS=1) +set_target_properties(darklib PROPERTIES LINKER_LANGUAGE CXX) + +if(OpenCV_VERSION_MAJOR GREATER_EQUAL 3) + add_executable(uselib_track ${CMAKE_CURRENT_LIST_DIR}/src/yolo_console_dll.cpp) + target_compile_definitions(uselib_track PRIVATE TRACK_OPTFLOW=1) + set_target_properties(uselib_track PROPERTIES LINKER_LANGUAGE CXX) +endif() + +add_executable(uselib ${CMAKE_CURRENT_LIST_DIR}/src/yolo_console_dll.cpp) +set_target_properties(uselib PROPERTIES LINKER_LANGUAGE CXX) + +add_executable(darknet ${CMAKE_CURRENT_LIST_DIR}/src/darknet.c ${sources} ${headers} ${cuda_sources}) +set_source_files_properties(${CMAKE_CURRENT_LIST_DIR}/src/darknet.c PROPERTIES LANGUAGE CXX) +set_target_properties(darknet PROPERTIES LINKER_LANGUAGE CXX) + +if(CUDNN_FOUND) + target_link_libraries(darknet ${CUDNN_LIBRARY}) + target_link_libraries(darklib ${CUDNN_LIBRARY}) +endif() + +if(OpenCV_FOUND) + target_link_libraries(darknet ${OpenCV_LIBS}) + target_link_libraries(darklib ${OpenCV_LIBS}) +endif() + +if(OPENMP_FOUND) + target_link_libraries(darknet OpenMP::OpenMP_C) + target_link_libraries(darklib OpenMP::OpenMP_C) +endif() + +if(CMAKE_COMPILER_IS_GNUCC) + target_link_libraries(darknet m) + target_link_libraries(darklib m) +endif() + +if(MSVC) + target_link_libraries(darknet ${PTHREADS_LIBRARY}) + target_link_libraries(darknet wsock32 ws2_32) + target_link_libraries(darklib ${PTHREADS_LIBRARY}) + target_link_libraries(darklib wsock32 ws2_32) +endif() + +target_link_libraries(darknet Threads::Threads) +target_link_libraries(darklib Threads::Threads) + +if(ENABLE_CUDA) + target_link_libraries(darknet curand cublas) + target_link_libraries(darklib curand cublas) +endif() + +target_link_libraries(uselib darklib) +if(OpenCV_VERSION_MAJOR GREATER_EQUAL 3) + target_link_libraries(uselib_track darklib) + install(TARGETS uselib_track DESTINATION ${CMAKE_SOURCE_DIR}/) +endif() + +install(TARGETS darklib uselib darknet DESTINATION ${CMAKE_SOURCE_DIR}/) diff --git a/cmake/Modules/FindCUDNN.cmake b/cmake/Modules/FindCUDNN.cmake new file mode 100644 index 00000000..bc130ea4 --- /dev/null +++ b/cmake/Modules/FindCUDNN.cmake @@ -0,0 +1,68 @@ +# Distributed under the OSI-approved BSD 3-Clause License. +# Copyright Stefano Sinigardi + +#.rst: +# FindCUDNN +# -------- +# +# Result Variables +# ^^^^^^^^^^^^^^^^ +# +# This module will set the following variables in your project:: +# +# ``CUDNN_FOUND`` +# True if CUDNN found on the local system +# +# ``CUDNN_INCLUDE_DIRS`` +# Location of CUDNN header files. +# +# ``CUDNN_LIBRARIES`` +# The CUDNN libraries. +# +# Hints +# ^^^^^ +# +# ``CUDNN_ROOT_DIR`` +# Set this variable to a directory that contains a CUDNN installation. +# + +include(FindPackageHandleStandardArgs) + +#set(CUDNN_ROOT_DIR "" CACHE PATH "Folder contains NVIDIA cuDNN") + +find_path(CUDNN_INCLUDE_DIR cudnn.h + HINTS ${CUDNN_ROOT_DIR} ${CUDA_HOME} ${CUDA_TOOLKIT_ROOT_DIR} + PATH_SUFFIXES cuda/include include) + +find_library(CUDNN_LIBRARY cudnn + HINTS ${CUDNN_ROOT_DIR} ${CUDA_HOME} ${CUDA_TOOLKIT_ROOT_DIR} + PATH_SUFFIXES lib lib64 cuda/lib cuda/lib64 lib/x64) + +find_package_handle_standard_args( + CUDNN DEFAULT_MSG CUDNN_INCLUDE_DIR CUDNN_LIBRARY) + +if(CUDNN_FOUND) + file(READ ${CUDNN_INCLUDE_DIR}/cudnn.h CUDNN_HEADER_CONTENTS) + string(REGEX MATCH "define CUDNN_MAJOR * +([0-9]+)" + CUDNN_VERSION_MAJOR "${CUDNN_HEADER_CONTENTS}") + string(REGEX REPLACE "define CUDNN_MAJOR * +([0-9]+)" "\\1" + CUDNN_VERSION_MAJOR "${CUDNN_VERSION_MAJOR}") + string(REGEX MATCH "define CUDNN_MINOR * +([0-9]+)" + CUDNN_VERSION_MINOR "${CUDNN_HEADER_CONTENTS}") + string(REGEX REPLACE "define CUDNN_MINOR * +([0-9]+)" "\\1" + CUDNN_VERSION_MINOR "${CUDNN_VERSION_MINOR}") + string(REGEX MATCH "define CUDNN_PATCHLEVEL * +([0-9]+)" + CUDNN_VERSION_PATCH "${CUDNN_HEADER_CONTENTS}") + string(REGEX REPLACE "define CUDNN_PATCHLEVEL * +([0-9]+)" "\\1" + CUDNN_VERSION_PATCH "${CUDNN_VERSION_PATCH}") + if(NOT CUDNN_VERSION_MAJOR) + set(CUDNN_VERSION "?") + else() + set(CUDNN_VERSION "${CUDNN_VERSION_MAJOR}.${CUDNN_VERSION_MINOR}.${CUDNN_VERSION_PATCH}") + endif() + + set(CUDNN_INCLUDE_DIRS ${CUDNN_INCLUDE_DIR}) + set(CUDNN_LIBRARIES ${CUDNN_LIBRARY}) + message(STATUS "Found cuDNN: v${CUDNN_VERSION} (include: ${CUDNN_INCLUDE_DIR}, library: ${CUDNN_LIBRARY})") + mark_as_advanced(CUDNN_ROOT_DIR CUDNN_LIBRARY CUDNN_INCLUDE_DIR) +endif() diff --git a/cmake/Modules/FindPThreads_windows.cmake b/cmake/Modules/FindPThreads_windows.cmake new file mode 100644 index 00000000..4f6a9f24 --- /dev/null +++ b/cmake/Modules/FindPThreads_windows.cmake @@ -0,0 +1,75 @@ +# Distributed under the OSI-approved BSD 3-Clause License. +# Copyright Stefano Sinigardi + +#.rst: +# FindPThreads +# ------------ +# +# Find the PThreads includes and library. +# +# Result Variables +# ^^^^^^^^^^^^^^^^ +# +# This module defines the following variables: +# +# ``PTHREADS_FOUND`` +# True if PThreads library found +# +# ``PTHREADS_INCLUDE_DIR`` +# Location of PThreads headers +# +# ``PTHREADS_LIBRARY`` +# List of libraries to link with when using PThreads +# + +include(${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake) +include(${CMAKE_ROOT}/Modules/SelectLibraryConfigurations.cmake) + +find_path(PTHREADS_INCLUDE_DIR NAMES pthread.h) + +# Allow libraries to be set manually +if(NOT PTHREADS_LIBRARY) + find_library(PTHREADS_LIBRARY_RELEASE NAMES pthreadsVC2) + find_library(PTHREADS_LIBRARY_DEBUG NAMES pthreadsVC2d) + select_library_configurations(PTHREADS) +endif() + +find_package_handle_standard_args(PTHREADS DEFAULT_MSG PTHREADS_LIBRARY PTHREADS_INCLUDE_DIR) +mark_as_advanced(PTHREADS_INCLUDE_DIR PTHREADS_LIBRARY) + + +# Register imported libraries: +# 1. If we can find a Windows .dll file (or if we can find both Debug and +# Release libraries), we will set appropriate target properties for these. +# 2. However, for most systems, we will only register the import location and +# include directory. + +# Look for dlls, for Release and Debug libraries. +if(WIN32) + string( REPLACE ".lib" ".dll" PTHREADS_LIBRARY_RELEASE_DLL "${PTHREADS_LIBRARY_RELEASE}" ) + string( REPLACE ".lib" ".dll" PTHREADS_LIBRARY_DEBUG_DLL "${PTHREADS_LIBRARY_DEBUG}" ) +endif() + +if( PTHREADS_FOUND AND NOT TARGET PThreads::PThreads ) + if( EXISTS "${PTHREADS_LIBRARY_RELEASE_DLL}" ) + add_library( PThreads::PThreads SHARED IMPORTED ) + set_target_properties( PThreads::PThreads PROPERTIES + IMPORTED_LOCATION_RELEASE "${PTHREADS_LIBRARY_RELEASE_DLL}" + IMPORTED_IMPLIB "${PTHREADS_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PTHREADS_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PTHREADS_LIBRARY_DEBUG_DLL}" ) + set_property( TARGET PThreads::PThreads APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( FFTW::fftw3 PROPERTIES + IMPORTED_LOCATION_DEBUG "${PTHREADS_LIBRARY_DEBUG_DLL}" + IMPORTED_IMPLIB_DEBUG "${PTHREADS_LIBRARY_DEBUG}" ) + endif() + else() + add_library( PThreads::PThreads UNKNOWN IMPORTED ) + set_target_properties( PThreads::PThreads PROPERTIES + IMPORTED_LOCATION "${PTHREADS_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${PTHREADS_INCLUDE_DIR}" + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + endif() +endif()