git-subtree-dir: darknet_vendor git-subtree-mainline: a6a4482dd123151500d3e4fbd0a4f36738d23fa3 git-subtree-split: 4d609295280bf9b50cde69bb9a483a8db839ba0b
358 lines
9.7 KiB
CMake
358 lines
9.7 KiB
CMake
cmake_minimum_required(VERSION 3.10)
|
|
project(darknet_vendor VERSION 0.1.0)
|
|
|
|
####################
|
|
# Build options
|
|
####################
|
|
|
|
option(DARKNET_CUDA "Build darknet with CUDA support" ON)
|
|
option(DARKNET_OPENCV "Build darknet with OpenCV support" ON)
|
|
|
|
####################
|
|
# Download Darknet
|
|
####################
|
|
|
|
if(CMAKE_VERSION VERSION_LESS "3.11")
|
|
include("cmake/FetchContent.cmake")
|
|
else()
|
|
include(FetchContent)
|
|
endif()
|
|
|
|
# Same version as Debian Buster
|
|
set(darknet_git_tag "61c9d02ec461e30d55762ec7669d6a1d3c356fb2")
|
|
|
|
FetchContent_Declare(darknet-download
|
|
GIT_REPOSITORY
|
|
"https://github.com/pjreddie/darknet.git"
|
|
GIT_TAG
|
|
${darknet_git_tag}
|
|
)
|
|
|
|
FetchContent_GetProperties(darknet-download)
|
|
if(NOT darknet-download_POPULATED)
|
|
FetchContent_Populate(darknet-download)
|
|
endif()
|
|
|
|
set(darknet_src_dir "${darknet-download_SOURCE_DIR}")
|
|
|
|
####################
|
|
# Classify files
|
|
####################
|
|
set(darknet_public_headers
|
|
"${CMAKE_CURRENT_BINARY_DIR}/darknet-src/include/darknet.h"
|
|
)
|
|
|
|
set(darknet_cuda_sources
|
|
"${darknet_src_dir}/src/activation_kernels.cu"
|
|
"${darknet_src_dir}/src/avgpool_layer_kernels.cu"
|
|
"${darknet_src_dir}/src/blas_kernels.cu"
|
|
"${darknet_src_dir}/src/col2im_kernels.cu"
|
|
"${darknet_src_dir}/src/convolutional_kernels.cu"
|
|
"${darknet_src_dir}/src/crop_layer_kernels.cu"
|
|
"${darknet_src_dir}/src/deconvolutional_kernels.cu"
|
|
"${darknet_src_dir}/src/dropout_layer_kernels.cu"
|
|
"${darknet_src_dir}/src/im2col_kernels.cu"
|
|
"${darknet_src_dir}/src/maxpool_layer_kernels.cu"
|
|
)
|
|
|
|
set(darknet_exec_c_sources
|
|
"${darknet_src_dir}/examples/art.c"
|
|
"${darknet_src_dir}/examples/captcha.c"
|
|
"${darknet_src_dir}/examples/cifar.c"
|
|
"${darknet_src_dir}/examples/classifier.c"
|
|
"${darknet_src_dir}/examples/coco.c"
|
|
"${darknet_src_dir}/examples/darknet.c"
|
|
"${darknet_src_dir}/examples/detector.c"
|
|
"${darknet_src_dir}/examples/go.c"
|
|
"${darknet_src_dir}/examples/instance-segmenter.c"
|
|
"${darknet_src_dir}/examples/lsd.c"
|
|
"${darknet_src_dir}/examples/nightmare.c"
|
|
"${darknet_src_dir}/examples/super.c"
|
|
"${darknet_src_dir}/examples/rnn.c"
|
|
"${darknet_src_dir}/examples/regressor.c"
|
|
"${darknet_src_dir}/examples/segmenter.c"
|
|
"${darknet_src_dir}/examples/tag.c"
|
|
"${darknet_src_dir}/examples/yolo.c"
|
|
)
|
|
|
|
set(darknet_lib_cpp_sources
|
|
"${darknet_src_dir}/src/image_opencv.cpp"
|
|
)
|
|
|
|
set(darknet_lib_c_sources
|
|
"${darknet_src_dir}/src/activation_layer.c"
|
|
"${darknet_src_dir}/src/activations.c"
|
|
"${darknet_src_dir}/src/avgpool_layer.c"
|
|
"${darknet_src_dir}/src/batchnorm_layer.c"
|
|
"${darknet_src_dir}/src/blas.c"
|
|
"${darknet_src_dir}/src/box.c"
|
|
"${darknet_src_dir}/src/col2im.c"
|
|
# "${darknet_src_dir}/src/compare.c"
|
|
"${darknet_src_dir}/src/connected_layer.c"
|
|
"${darknet_src_dir}/src/convolutional_layer.c"
|
|
"${darknet_src_dir}/src/cost_layer.c"
|
|
"${darknet_src_dir}/src/crnn_layer.c"
|
|
"${darknet_src_dir}/src/crop_layer.c"
|
|
"${darknet_src_dir}/src/cuda.c"
|
|
"${darknet_src_dir}/src/data.c"
|
|
"${darknet_src_dir}/src/deconvolutional_layer.c"
|
|
"${darknet_src_dir}/src/demo.c"
|
|
"${darknet_src_dir}/src/detection_layer.c"
|
|
"${darknet_src_dir}/src/dropout_layer.c"
|
|
"${darknet_src_dir}/src/gemm.c"
|
|
"${darknet_src_dir}/src/gru_layer.c"
|
|
"${darknet_src_dir}/src/im2col.c"
|
|
"${darknet_src_dir}/src/image.c"
|
|
"${darknet_src_dir}/src/iseg_layer.c"
|
|
"${darknet_src_dir}/src/l2norm_layer.c"
|
|
"${darknet_src_dir}/src/layer.c"
|
|
"${darknet_src_dir}/src/list.c"
|
|
"${darknet_src_dir}/src/local_layer.c"
|
|
"${darknet_src_dir}/src/logistic_layer.c"
|
|
"${darknet_src_dir}/src/lstm_layer.c"
|
|
"${darknet_src_dir}/src/matrix.c"
|
|
"${darknet_src_dir}/src/maxpool_layer.c"
|
|
"${darknet_src_dir}/src/network.c"
|
|
"${darknet_src_dir}/src/normalization_layer.c"
|
|
"${darknet_src_dir}/src/option_list.c"
|
|
"${darknet_src_dir}/src/parser.c"
|
|
"${darknet_src_dir}/src/region_layer.c"
|
|
"${darknet_src_dir}/src/reorg_layer.c"
|
|
"${darknet_src_dir}/src/rnn_layer.c"
|
|
"${darknet_src_dir}/src/route_layer.c"
|
|
"${darknet_src_dir}/src/shortcut_layer.c"
|
|
"${darknet_src_dir}/src/softmax_layer.c"
|
|
"${darknet_src_dir}/src/tree.c"
|
|
"${darknet_src_dir}/src/upsample_layer.c"
|
|
"${darknet_src_dir}/src/utils.c"
|
|
"${darknet_src_dir}/src/yolo_layer.c"
|
|
)
|
|
|
|
####################
|
|
# Darknet Library
|
|
####################
|
|
# set(THREADS_PREFER_PTHREAD_FLAG True)
|
|
find_package(Threads REQUIRED)
|
|
|
|
if(DARKNET_CUDA)
|
|
enable_language(CUDA)
|
|
find_package(CUDA REQUIRED)
|
|
|
|
# Flags taken from https://arnon.dk/matching-sm-architectures-arch-and-gencode-for-various-nvidia-cards/
|
|
if(NOT DEFINED DARKNET_VENDOR_CUDA_FLAGS)
|
|
if(CUDA_VERSION VERSION_GREATER 10)
|
|
set(DARKNET_VENDOR_CUDA_FLAGS
|
|
"-arch=sm_50"
|
|
"-gencode=arch=compute_50,code=sm_50"
|
|
"-gencode=arch=compute_52,code=sm_52"
|
|
"-gencode=arch=compute_60,code=sm_60"
|
|
"-gencode=arch=compute_61,code=sm_61"
|
|
"-gencode=arch=compute_70,code=sm_70"
|
|
"-gencode=arch=compute_75,code=sm_75"
|
|
"-gencode=arch=compute_75,code=compute_75"
|
|
)
|
|
elseif(CUDA_VERSION VERSION_GREATER 9)
|
|
set(DARKNET_VENDOR_CUDA_FLAGS
|
|
"-arch=sm_50"
|
|
"-gencode=arch=compute_50,code=sm_50"
|
|
"-gencode=arch=compute_52,code=sm_52"
|
|
"-gencode=arch=compute_60,code=sm_60"
|
|
"-gencode=arch=compute_61,code=sm_61"
|
|
"-gencode=arch=compute_70,code=sm_70"
|
|
"-gencode=arch=compute_70,code=compute_70"
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
add_library(darknet SHARED ${darknet_lib_c_sources} ${darknet_lib_cpp_sources} ${darknet_cuda_sources})
|
|
target_compile_options(darknet PRIVATE
|
|
$<$<COMPILE_LANGUAGE:CUDA>:${DARKNET_VENDOR_CUDA_FLAGS}>
|
|
)
|
|
target_compile_definitions(darknet PUBLIC GPU=1)
|
|
target_link_libraries(darknet PUBLIC
|
|
cuda cudart cublas curand
|
|
)
|
|
else() # not using CUDA
|
|
add_library(darknet SHARED ${darknet_lib_c_sources} ${darknet_lib_cpp_sources})
|
|
endif()
|
|
|
|
set_target_properties(darknet PROPERTIES LINKER_LANGUAGE C)
|
|
target_include_directories(darknet PUBLIC
|
|
$<BUILD_INTERFACE:${darknet_src_dir}/include>
|
|
$<BUILD_INTERFACE:${darknet_src_dir}/src>
|
|
$<INSTALL_INTERFACE:include>
|
|
)
|
|
|
|
if(DARKNET_OPENCV)
|
|
find_package(OpenCV REQUIRED)
|
|
target_include_directories(darknet PRIVATE ${OpenCV_INCLUDE_DIRS})
|
|
target_link_libraries(darknet PUBLIC ${OpenCV_LIBRARIES})
|
|
target_compile_definitions(darknet PUBLIC OPENCV=1)
|
|
endif()
|
|
|
|
# TODO(sloretz) pthread replacement on Windows?
|
|
target_link_libraries(darknet PUBLIC Threads::Threads)
|
|
if(UNIX)
|
|
# Need to link C math library on some platforms
|
|
target_link_libraries(darknet PUBLIC m)
|
|
endif()
|
|
|
|
####################
|
|
# Darknet_vendor target
|
|
####################
|
|
|
|
# Add interface library for darknet_vendor headers
|
|
add_library(darknet_vendor INTERFACE)
|
|
target_include_directories(darknet_vendor INTERFACE
|
|
$<BUILD_INTERFACE:include>
|
|
$<INSTALL_INTERFACE:include>
|
|
)
|
|
target_link_libraries(darknet_vendor INTERFACE darknet)
|
|
|
|
configure_file("include/darknet_vendor/version.h.in" "version.h" @ONLY)
|
|
|
|
####################
|
|
# Darknet Executable
|
|
####################
|
|
add_executable(darknet_exec ${darknet_exec_c_sources})
|
|
target_link_libraries(darknet_exec PUBLIC darknet)
|
|
set_target_properties(darknet_exec PROPERTIES OUTPUT_NAME "darknet")
|
|
|
|
####################
|
|
# ProjectConfig.cmake
|
|
####################
|
|
|
|
set(INCLUDE_INSTALL_DIR "include")
|
|
set(SHARE_CMAKE_INSTALL_DIR "share/darknet_vendor/cmake")
|
|
set(EXEC_INSTALL_DIR "bin")
|
|
include(CMakePackageConfigHelpers)
|
|
configure_package_config_file(
|
|
"cmake/darknet_vendor-config.cmake.in"
|
|
"darknet_vendor-config.cmake"
|
|
INSTALL_DESTINATION "${SHARE_CMAKE_INSTALL_DIR}"
|
|
PATH_VARS "INCLUDE_INSTALL_DIR" "SHARE_CMAKE_INSTALL_DIR" "EXEC_INSTALL_DIR"
|
|
)
|
|
|
|
write_basic_package_version_file(
|
|
"darknet_vendor-version.cmake"
|
|
COMPATIBILITY SameMajorVersion)
|
|
|
|
####################
|
|
# Installation
|
|
####################
|
|
|
|
# Install darknet public headers
|
|
install(
|
|
DIRECTORY
|
|
"${darknet_src_dir}/include/"
|
|
DESTINATION
|
|
"include"
|
|
)
|
|
|
|
# Install darknet_vendor public headers
|
|
install(
|
|
DIRECTORY
|
|
"include/"
|
|
DESTINATION
|
|
"include"
|
|
FILES_MATCHING PATTERN
|
|
"*.h"
|
|
)
|
|
install(
|
|
FILES
|
|
"${CMAKE_CURRENT_BINARY_DIR}/version.h"
|
|
DESTINATION
|
|
"include/darknet_vendor"
|
|
)
|
|
|
|
# Install darknet library
|
|
install(
|
|
TARGETS darknet
|
|
EXPORT "darknet_vendor-targets"
|
|
ARCHIVE DESTINATION "lib"
|
|
LIBRARY DESTINATION "lib"
|
|
RUNTIME DESTINATION "bin"
|
|
)
|
|
|
|
# Install darknet_vendor interface library
|
|
install(
|
|
TARGETS darknet_vendor
|
|
EXPORT "darknet_vendor-targets"
|
|
)
|
|
|
|
# Install darknet demo executable
|
|
install(TARGETS darknet_exec DESTINATION "${EXEC_INSTALL_DIR}")
|
|
|
|
# Install config files and helper scripts
|
|
install(
|
|
DIRECTORY
|
|
"${darknet_src_dir}/cfg"
|
|
DESTINATION
|
|
"share/darknet"
|
|
)
|
|
install(
|
|
DIRECTORY
|
|
"${darknet_src_dir}/data"
|
|
DESTINATION
|
|
"share/darknet"
|
|
)
|
|
install(
|
|
DIRECTORY
|
|
"${darknet_src_dir}/scripts"
|
|
DESTINATION
|
|
"share/darknet"
|
|
)
|
|
install(
|
|
DIRECTORY
|
|
"${darknet_src_dir}/python"
|
|
DESTINATION
|
|
"share/darknet"
|
|
)
|
|
|
|
# Add an entry to the ament index
|
|
install(
|
|
FILES
|
|
resource/darknet_vendor
|
|
DESTINATION
|
|
"share/ament_index/resource_index/packages/"
|
|
)
|
|
|
|
# Install license files
|
|
install(
|
|
FILES
|
|
"${darknet_src_dir}/LICENSE"
|
|
"${darknet_src_dir}/LICENSE.fuck"
|
|
"${darknet_src_dir}/LICENSE.gen"
|
|
"${darknet_src_dir}/LICENSE.gpl"
|
|
"${darknet_src_dir}/LICENSE.meta"
|
|
"${darknet_src_dir}/LICENSE.mit"
|
|
"${darknet_src_dir}/LICENSE.v1"
|
|
DESTINATION
|
|
"share/darknet"
|
|
)
|
|
|
|
# Install project-config.cmake and project-version.cmake
|
|
install(
|
|
FILES
|
|
"${CMAKE_CURRENT_BINARY_DIR}/darknet_vendor-config.cmake"
|
|
DESTINATION
|
|
share/darknet_vendor/cmake
|
|
)
|
|
install(
|
|
FILES
|
|
"${CMAKE_CURRENT_BINARY_DIR}/darknet_vendor-version.cmake"
|
|
DESTINATION
|
|
share/darknet_vendor/cmake
|
|
)
|
|
|
|
# install exported targets
|
|
install(
|
|
EXPORT
|
|
"darknet_vendor-targets"
|
|
NAMESPACE
|
|
"darknet_vendor::"
|
|
DESTINATION
|
|
"share/darknet_vendor/cmake"
|
|
)
|
|
|