mirror of
https://github.com/deepinsight/insightface.git
synced 2025-12-30 08:02:27 +00:00
380 lines
14 KiB
CMake
380 lines
14 KiB
CMake
cmake_minimum_required(VERSION 3.20)
|
|
project(InspireFace)
|
|
|
|
set(CMAKE_CXX_STANDARD 14)
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
|
|
|
|
set(INSPIRE_FACE_SERIES_NAME "Community Edition" CACHE STRING "Series name")
|
|
|
|
# Hide symbols
|
|
option(ISF_ENABLE_SYMBOL_HIDING "Enable symbol hiding." ON)
|
|
if(ISF_ENABLE_SYMBOL_HIDING)
|
|
if(NOT WIN32)
|
|
set(CMAKE_C_VISIBILITY_PRESET hidden)
|
|
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
|
|
set(CMAKE_VISIBILITY_INLINES_HIDDEN YES)
|
|
endif()
|
|
else()
|
|
set(CMAKE_C_VISIBILITY_PRESET default)
|
|
set(CMAKE_CXX_VISIBILITY_PRESET default)
|
|
set(CMAKE_VISIBILITY_INLINES_HIDDEN NO)
|
|
endif()
|
|
|
|
# Current version
|
|
set(INSPIRE_FACE_VERSION_MAJOR 1)
|
|
set(INSPIRE_FACE_VERSION_MINOR 2)
|
|
set(INSPIRE_FACE_VERSION_PATCH 3)
|
|
|
|
# Converts the version number to a string
|
|
string(CONCAT INSPIRE_FACE_VERSION_MAJOR_STR ${INSPIRE_FACE_VERSION_MAJOR})
|
|
string(CONCAT INSPIRE_FACE_VERSION_MINOR_STR ${INSPIRE_FACE_VERSION_MINOR})
|
|
string(CONCAT INSPIRE_FACE_VERSION_PATCH_STR ${INSPIRE_FACE_VERSION_PATCH})
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cpp/inspireface/version.txt.in ${CMAKE_CURRENT_SOURCE_DIR}/cpp/inspireface/version.txt)
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/python/version.txt.in ${CMAKE_CURRENT_SOURCE_DIR}/python/version.txt)
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cpp/inspireface/meta.cpp.in ${CMAKE_CURRENT_SOURCE_DIR}/cpp/inspireface/meta.cpp)
|
|
|
|
# Check that the 3rdparty folder exists
|
|
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty")
|
|
message(STATUS "3rdparty directory not found, cloning from github...")
|
|
|
|
# Execute git clone and directly specify it in the current directory
|
|
execute_process(
|
|
COMMAND git clone --recurse-submodules https://github.com/tunmx/inspireface-3rdparty.git "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty"
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
RESULT_VARIABLE GIT_RESULT
|
|
)
|
|
|
|
if(NOT GIT_RESULT EQUAL "0")
|
|
message(FATAL_ERROR "Failed to clone 3rdparty repository")
|
|
else()
|
|
message(STATUS "Successfully cloned 3rdparty repository")
|
|
endif()
|
|
else()
|
|
message(STATUS "3rdparty directory already exists")
|
|
endif()
|
|
|
|
# Install cpp api header file
|
|
option(ISF_INSTALL_CPP_HEADER "Install cpp api header file." ON)
|
|
|
|
# Set the ISF_THIRD_PARTY_DIR variable to allow it to be set externally from the command line, or use the default path if it is not set
|
|
set(ISF_THIRD_PARTY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty" CACHE PATH "Path to the third-party libraries directory")
|
|
|
|
# Check that the SANITIZE compile option is enabled
|
|
set(ISF_SANITIZE_ADDRESS OFF CACHE BOOL "Enable AddressSanitizer")
|
|
set(ISF_SANITIZE_LEAK OFF CACHE BOOL "Enable LeakSanitizer")
|
|
|
|
if (ISF_SANITIZE_ADDRESS AND ISF_SANITIZE_LEAK)
|
|
message(FATAL_ERROR "Cannot enable both AddressSanitizer and LeakSanitizer.")
|
|
endif()
|
|
|
|
# Enable AddressSanitizer
|
|
if(ISF_SANITIZE_ADDRESS)
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
|
|
endif()
|
|
|
|
# Enable LeakSanitizer
|
|
if(ISF_SANITIZE_LEAK)
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=leak")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=leak")
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=leak")
|
|
endif()
|
|
|
|
set(TARGET_PLATFORM "drawin-x86" CACHE STRING "Target platform")
|
|
|
|
# TensorRT dependency configuration
|
|
set(ISF_ENABLE_TENSORRT OFF CACHE BOOL "Enable TensorRT Inference")
|
|
set(TENSORRT_ROOT "/usr/local/TensorRT" CACHE PATH "Path to TensorRT installation")
|
|
if(ISF_ENABLE_TENSORRT)
|
|
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/toolchain)
|
|
include(FindTensorRT)
|
|
add_definitions("-DISF_ENABLE_TENSORRT")
|
|
add_definitions("-DINFERENCE_WRAPPER_ENABLE_TENSORRT")
|
|
endif()
|
|
|
|
# RKNN dependency configuration
|
|
option(ISF_ENABLE_RKNN "Use RKNPU." OFF)
|
|
set(ISF_RK_DEVICE_TYPE "RV1109RV1126" CACHE STRING "Type of the device")
|
|
set(ISF_RK_COMPILER_TYPE "armhf" CACHE STRING "Type of the compiler")
|
|
if (ISF_ENABLE_RKNN)
|
|
add_definitions("-DISF_ENABLE_RKNN")
|
|
# Device list
|
|
set(RKNPU1_DEVICES "RV1109RV1126")
|
|
set(RKNPU2_DEVICES "RK356X" "RK3588" "RV1106")
|
|
set(ISF_RKNPU_MAJOR "")
|
|
list(FIND RKNPU1_DEVICES "${ISF_RK_DEVICE_TYPE}" INDEX_RKNPU1)
|
|
list(FIND RKNPU2_DEVICES "${ISF_RK_DEVICE_TYPE}" INDEX_RKNPU2)
|
|
if(INDEX_RKNPU1 GREATER_EQUAL 0)
|
|
# match rknn1
|
|
set(ISF_RKNPU_MAJOR "rknpu1")
|
|
elseif(INDEX_RKNPU2 GREATER_EQUAL 0)
|
|
# match rknn2
|
|
set(ISF_RKNPU_MAJOR "rknpu2")
|
|
endif()
|
|
# Result
|
|
message(STATUS "Use ${ISF_RKNPU_MAJOR}")
|
|
|
|
if(ISF_RK_DEVICE_TYPE STREQUAL "RV1106")
|
|
set(ISF_RKNPU_RV1106 ON)
|
|
add_definitions("-DISF_RKNPU_RV1106")
|
|
endif()
|
|
|
|
endif ()
|
|
|
|
# Enable Rockchip RGA
|
|
option(ISF_ENABLE_RGA "Use Rockchip RGA." OFF)
|
|
if(ISF_ENABLE_RGA)
|
|
if(NOT ISF_ENABLE_RKNN)
|
|
message(FATAL_ERROR "RGA requires RKNN to be enabled. Please enable ISF_ENABLE_RKNN first.")
|
|
endif()
|
|
if(NOT ISF_RKNPU_MAJOR STREQUAL "rknpu2")
|
|
message(FATAL_ERROR "RGA requires RKNPU2. Please use a device that supports RKNPU2.")
|
|
endif()
|
|
|
|
add_definitions("-DISF_ENABLE_RGA")
|
|
if(ANDROID)
|
|
set(PLAT Android)
|
|
else()
|
|
set(PLAT Linux)
|
|
endif()
|
|
set(RGA_LIBS ${ISF_THIRD_PARTY_DIR}/inspireface-precompile-lite/librga/${PLAT}/${ISF_RK_COMPILER_TYPE}/librga.a)
|
|
set(RGA_INCLUDE_DIRS ${ISF_THIRD_PARTY_DIR}/inspireface-precompile-lite/librga/include)
|
|
endif()
|
|
|
|
option(ISF_ENABLE_COST_TIME "Enable cost time." OFF)
|
|
if(ISF_ENABLE_COST_TIME)
|
|
add_definitions("-DISF_ENABLE_COST_TIME")
|
|
endif()
|
|
|
|
# Apple device dedicated expansion services, support for some models coreml reasoning and so on
|
|
set(ISF_ENABLE_APPLE_EXTENSION OFF CACHE BOOL "Enable Apple device extension services, such as coreml, etc.")
|
|
if(ISF_ENABLE_APPLE_EXTENSION)
|
|
add_definitions("-DISF_ENABLE_APPLE_EXTENSION")
|
|
add_definitions("-DINFERENCE_WRAPPER_ENABLE_COREML")
|
|
endif()
|
|
|
|
# Platform configuration
|
|
option(ISF_BUILD_LINUX_ARM7 "Platform Armv7." OFF)
|
|
option(ISF_BUILD_LINUX_AARCH64 "Platform Armv8." OFF)
|
|
option(ISF_GLOBAL_INFERENCE_BACKEND_USE_MNN_CUDA "The global inference backend uses MNN CUDA." OFF)
|
|
|
|
|
|
if (ISF_BUILD_LINUX_ARM7)
|
|
set(CPU_ARCH "armhf")
|
|
endif()
|
|
if (ISF_BUILD_LINUX_AARCH64)
|
|
set(CPU_ARCH "aarch64")
|
|
endif()
|
|
|
|
# If you want to build the unit-test, you need to set this to ON
|
|
option(ISF_BUILD_WITH_TEST "Open Build Unit-Test." ON)
|
|
|
|
# If you want to build the sample, you need to set this to ON
|
|
option(ISF_BUILD_WITH_SAMPLE "Open Build Sample Exec." ON)
|
|
|
|
set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cpp/)
|
|
|
|
option(ISF_NEVER_USE_OPENCV "Never use opencv." ON)
|
|
if(ISF_NEVER_USE_OPENCV)
|
|
set(INSPIRECV_BACKEND_OPENCV OFF)
|
|
set(INSPIRECV_BACKEND_OKCV_USE_OPENCV OFF)
|
|
set(INSPIRECV_BACKEND_OKCV_USE_OPENCV_IO OFF)
|
|
set(INSPIRECV_BACKEND_OKCV_USE_OPENCV_GUI OFF)
|
|
endif()
|
|
|
|
|
|
option(ISF_ENABLE_OPENCV "Depends on opencv." OFF)
|
|
if(INSPIRECV_BACKEND_OPENCV OR INSPIRECV_BACKEND_OKCV_USE_OPENCV OR INSPIRECV_BACKEND_OKCV_USE_OPENCV_IO OR INSPIRECV_BACKEND_OKCV_USE_OPENCV_GUI)
|
|
set(ISF_ENABLE_OPENCV ON)
|
|
add_definitions("-DISF_ENABLE_OPENCV")
|
|
endif()
|
|
|
|
|
|
include_directories(${ISF_THIRD_PARTY_DIR}/InspireCV/3rdparty/Eigen-3.4.0-Headers)
|
|
|
|
if(APPLE)
|
|
if(IOS)
|
|
add_definitions(-DTARGET_OS_IOS)
|
|
message(IOS_3RDPARTY=${IOS_3RDPARTY})
|
|
set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH NO)
|
|
set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE NO)
|
|
add_definitions(-DTARGET_OS_IOS)
|
|
message(IOS_3RDPARTY=${IOS_3RDPARTY})
|
|
set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH NO)
|
|
set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE NO)
|
|
|
|
set(MNN_FRAMEWORK_PATH "${IOS_3RDPARTY}/MNN.framework")
|
|
include_directories("${MNN_FRAMEWORK_PATH}/")
|
|
link_directories(${IOS_3RDPARTY})
|
|
else()
|
|
message("Use apple device")
|
|
set(PLAT darwin)
|
|
endif()
|
|
else()
|
|
message("Use linux device")
|
|
set(PLAT linux)
|
|
endif()
|
|
|
|
# OpenCV dependency configuration
|
|
if(ISF_ENABLE_OPENCV)
|
|
if (APPLE)
|
|
if (IOS)
|
|
link_directories(${IOS_3RDPARTY})
|
|
include_directories(${IOS_3RDPARTY}/opencv2.framework)
|
|
set(OpenCV_DIR "${IOS_3RDPARTY}/opencv2.framework")
|
|
else()
|
|
message("Use apple device")
|
|
set(PLAT darwin)
|
|
find_package(OpenCV REQUIRED)
|
|
endif ()
|
|
else()
|
|
if (ISF_BUILD_LINUX_ARM7 OR ISF_BUILD_LINUX_AARCH64)
|
|
set(DISABLE_GUI ON)
|
|
add_definitions("-DDISABLE_GUI")
|
|
if (ISF_RK_DEVICE_TYPE STREQUAL "RV1109RV1126" AND ISF_ENABLE_RKNN)
|
|
# In special cases, specialize for that version
|
|
message("The OpenCV that builds the RV1109RV1126 version depends on is specialized!")
|
|
set(OpenCV_DIR ${OPENCV_PRECOMPILED_DIR}/opencv/3.4.5/opencv-linux-armhf/share/OpenCV)
|
|
set(OpenCV_STATIC_INCLUDE_DIR ${OPENCV_PRECOMPILED_DIR}/opencv/3.4.5/opencv-linux-armhf/include/)
|
|
set(PLAT linux-arm7)
|
|
else()
|
|
if (VERSION_MAJOR STREQUAL "3")
|
|
set(CV_CMAKE_FOLDER share/OpenCV)
|
|
elseif(VERSION_MAJOR STREQUAL "4")
|
|
set(CV_CMAKE_FOLDER lib/cmake/opencv4)
|
|
endif ()
|
|
if(ISF_BUILD_LINUX_ARM7)
|
|
set(PLAT linux-arm7)
|
|
message("The OpenCV that builds the gnueabihf version depends on is specialized!")
|
|
set(OpenCV_DIR ${OPENCV_PRECOMPILED_DIR}/opencv/3.4.5/opencv-linux-armhf/share/OpenCV)
|
|
set(OpenCV_STATIC_INCLUDE_DIR ${OPENCV_PRECOMPILED_DIR}/opencv/3.4.5/opencv-linux-armhf/include/)
|
|
elseif(ISF_BUILD_LINUX_AARCH64)
|
|
set(PLAT linux-aarch64)
|
|
message("The OpenCV that builds the aarch64 version depends on is specialized!")
|
|
set(OpenCV_DIR ${OPENCV_PRECOMPILED_DIR}/opencv/3.4.5/opencv-linux-aarch64/share/OpenCV)
|
|
set(OpenCV_STATIC_INCLUDE_DIR ${OPENCV_PRECOMPILED_DIR}/opencv/3.4.5/opencv-linux-aarch64/include/)
|
|
endif()
|
|
endif()
|
|
else ()
|
|
set(PLAT linux)
|
|
endif ()
|
|
find_package(OpenCV REQUIRED)
|
|
endif ()
|
|
endif ()
|
|
|
|
# InspireCV dependency configuration
|
|
set(INSPIRECV_BUILD_OBJECT_LIBS OFF CACHE BOOL "Build InspireCV as object library")
|
|
add_subdirectory(${ISF_THIRD_PARTY_DIR}/InspireCV EXCLUDE_FROM_ALL)
|
|
set(INSPIRECV_INCLUDE_PATH "${ISF_THIRD_PARTY_DIR}/InspireCV/include")
|
|
set(INSPIRECV_LIBS InspireCV)
|
|
|
|
# If you need using CUDA-enabled MNN, you need to manually configure the pre-compiled CUDA-enabled MNN library path
|
|
set(ISF_LINUX_MNN_CUDA "" CACHE STRING "Path to CUDA directory")
|
|
|
|
if (ISF_GLOBAL_INFERENCE_BACKEND_USE_MNN_CUDA)
|
|
message("Global MNN CUDA device inference")
|
|
add_definitions("-DISF_GLOBAL_INFERENCE_BACKEND_USE_MNN_CUDA")
|
|
# Use MNN Cuda
|
|
if (NOT DEFINED ISF_LINUX_MNN_CUDA)
|
|
# MNN Options
|
|
set(MNN_CUDA ON)
|
|
add_subdirectory(${ISF_THIRD_PARTY_DIR}/MNN EXCLUDE_FROM_ALL)
|
|
set(MNN_INCLUDE_DIRS "${ISF_THIRD_PARTY_DIR}/MNN/include")
|
|
set(MNN_LIBS MNN)
|
|
else()
|
|
message(ISF_LINUX_MNN_CUDA=${ISF_LINUX_MNN_CUDA})
|
|
set(MNN_INCLUDE_DIRS ${ISF_LINUX_MNN_CUDA}/include)
|
|
link_directories(${ISF_LINUX_MNN_CUDA}/)
|
|
set(MNN_LIBS MNN)
|
|
endif()
|
|
|
|
elseif(DEFINED MNN_STATIC_PATH)
|
|
message("Using static MNN from specified path: ${MNN_STATIC_PATH}")
|
|
set(MNN_INCLUDE_DIRS "${MNN_STATIC_PATH}/include")
|
|
set(MNN_LIBS "${MNN_STATIC_PATH}/lib/libMNN.a")
|
|
elseif(IOS)
|
|
message(Build iOS)
|
|
|
|
elseif(DEFINED ISF_MNN_CUSTOM_SOURCE)
|
|
message("Using custom external MNN source path: ${ISF_MNN_CUSTOM_SOURCE}")
|
|
# In particular, rknpu2 uses a lower version of mnn
|
|
set(MNN_BUILD_SHARED_LIBS OFF CACHE BOOL "Build MNN as a shared library")
|
|
add_subdirectory(${ISF_MNN_CUSTOM_SOURCE} ${CMAKE_BINARY_DIR}/MNN EXCLUDE_FROM_ALL)
|
|
set(MNN_INCLUDE_DIRS "${ISF_MNN_CUSTOM_SOURCE}/include")
|
|
set(MNN_LIBS MNN)
|
|
|
|
else ()
|
|
# Default or fallback case for MNN setup
|
|
message("Default or fallback case for MNN setup")
|
|
# MNN Options
|
|
set(MNN_BUILD_SHARED_LIBS OFF CACHE BOOL "Build MNN as a shared library")
|
|
|
|
# Set MNN build output directory to CMAKE_BINARY_DIR/MNN
|
|
add_subdirectory(${ISF_THIRD_PARTY_DIR}/MNN ${CMAKE_BINARY_DIR}/MNN EXCLUDE_FROM_ALL)
|
|
set(MNN_INCLUDE_DIRS "${ISF_THIRD_PARTY_DIR}/MNN/include")
|
|
set(MNN_LIBS MNN)
|
|
|
|
endif ()
|
|
|
|
|
|
# Set the installation directory to the build directory
|
|
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install")
|
|
|
|
# Add a child project: InspireFace Source
|
|
add_subdirectory(cpp/inspireface)
|
|
get_property(InspireFace TARGET InspireFace PROPERTY InspireFace)
|
|
|
|
# Add a child project: Samples
|
|
if (ISF_BUILD_WITH_SAMPLE)
|
|
add_subdirectory(cpp/sample) # Add a child project: Samples
|
|
endif ()
|
|
|
|
# Add a child project: Unit-Test
|
|
if (ISF_BUILD_WITH_TEST)
|
|
add_subdirectory(cpp/test) # Add a child project: Unit-Test
|
|
endif ()
|
|
|
|
# Print Message
|
|
message(STATUS ">>>>>>>>>>>>>")
|
|
message(STATUS "InspireFace Project Global:")
|
|
message(STATUS "\t CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
|
|
message(STATUS "\t CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
|
|
message(STATUS "\t ISF_THIRD_PARTY_DIR: ${ISF_THIRD_PARTY_DIR}")
|
|
message(STATUS "\t ISF_SANITIZE_ADDRESS: ${ISF_SANITIZE_ADDRESS}")
|
|
message(STATUS "\t ISF_SANITIZE_LEAK: ${ISF_SANITIZE_LEAK}")
|
|
message(STATUS "\t ISF_ENABLE_RKNN: ${ISF_ENABLE_RKNN}")
|
|
if (ISF_ENABLE_RKNN)
|
|
message(STATUS "\t ISF_RKNPU_MAJOR: ${ISF_RKNPU_MAJOR}")
|
|
message(STATUS "\t ISF_RK_DEVICE_TYPE: ${ISF_RK_DEVICE_TYPE}")
|
|
message(STATUS "\t ISF_RK_COMPILER_TYPE: ${ISF_RK_COMPILER_TYPE}")
|
|
if(ISF_RKNPU_RV1106)
|
|
message(STATUS "\t ISF_RKNPU_RV1106: ${ISF_RKNPU_RV1106}")
|
|
endif()
|
|
endif ()
|
|
message(STATUS "\t ISF_BUILD_LINUX_ARM7: ${ISF_BUILD_LINUX_ARM7}")
|
|
message(STATUS "\t ISF_BUILD_LINUX_AARCH64: ${ISF_BUILD_LINUX_AARCH64}")
|
|
message(STATUS "\t ISF_BUILD_WITH_TEST: ${ISF_BUILD_WITH_TEST}")
|
|
message(STATUS "\t ISF_BUILD_WITH_SAMPLE: ${ISF_BUILD_WITH_SAMPLE}")
|
|
message(STATUS "\t OpenCV_DIR: ${OpenCV_DIR}")
|
|
if(ISF_ENABLE_OPENCV)
|
|
message(STATUS "\t OpenCV: Enabled")
|
|
else()
|
|
message(STATUS "\t OpenCV: Disabled")
|
|
endif()
|
|
|
|
if(ISF_ENABLE_APPLE_EXTENSION)
|
|
message(STATUS "\t ISF_ENABLE_APPLE_EXTENSION: ${ISF_ENABLE_APPLE_EXTENSION}")
|
|
endif()
|
|
|
|
# Install cpp api header file
|
|
if(ISF_INSTALL_CPP_HEADER)
|
|
message(STATUS "\t ISF_INSTALL_CPP_HEADER: ${ISF_INSTALL_CPP_HEADER}")
|
|
endif()
|
|
|
|
|
|
message(STATUS "\t CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
|