cmake_minimum_required(VERSION 3.14) project(HyperLPR3-Source) set(CMAKE_CXX_STANDARD 11) set(LIBRARY_NAME hyperlpr3) option( LINUX_FETCH_MNN "Fetch and build MNN from git" ON ) option( LINUX_USE_3RDPARTY_OPENCV "Linux platform using pre-compiled OpenCV library from 3rdparty_hyper_inspire_op" OFF) option( BUILD_SHARE "Build shared libs" ON ) option( BUILD_SAMPLES "Build samples demo" OFF ) option( BUILD_TEST "Build unit-test exec" OFF ) set(PATH_3RDPARTY ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty_hyper_inspire_op) # find all cpp file file(GLOB_RECURSE SRC_BUFFER_MODULE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/cpp/src/buffer_module/*.cpp) file(GLOB_RECURSE SRC_CONTEXT_MODULE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/cpp/src/context_module/*.cpp) file(GLOB_RECURSE SRC_NN_MODULE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/cpp/src/nn_module/*.cpp) file(GLOB_RECURSE SRC_NN_IMPL_MODULE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/cpp/src/nn_implementation_module/*.cpp) file(GLOB SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/cpp/src/*.cpp) # local files set(SRC_INFERENCE_HELPER_LOCAL_FILES ${CMAKE_CURRENT_SOURCE_DIR}/cpp/src/inference_helper_module/inference_helper.cpp cpp/src/inference_helper_module/inference_helper_mnn.cpp) # include src header include_directories(${CMAKE_CURRENT_SOURCE_DIR}/cpp/src) set(SRC_C_CPP_FILES ${SRC_BUFFER_MODULE_FILES} ${SRC_CONTEXT_MODULE_FILES} ${SRC_LOADER_MODULE_FILES} ${SRC_NN_MODULE_FILES} ${SRC_NN_IMPL_MODULE_FILES} ${SRC_SLOG_MODULE_FILES} ${SRC_FILES} ${SRC_INFERENCE_HELPER_LOCAL_FILES}) # find all c file for c_api file(GLOB_RECURSE CAPI_CC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/cpp/c_api/*.cc) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/cpp/c_api) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/cpp/platform) # must use mnn add_definitions("-DINFERENCE_HELPER_ENABLE_MNN") set(LINK_THIRD_LIBS pthread MNN m) if (ANDROID) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ") set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") file(GLOB_RECURSE NATIVE_CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/cpp/platform/jni/android/*.cpp) find_package(OpenCV REQUIRED) include_directories(${MNN_INCLUDE_DIRS}) link_directories(${MNN_LIBS}) add_library(${LIBRARY_NAME} SHARED ${NATIVE_CPP_FILES} ${SRC_C_CPP_FILES} ${CAPI_CC_FILES}) target_link_libraries(${LIBRARY_NAME} ${OpenCV_LIBS} jnigraphics log -Wl,--whole-archive MNN -Wl,--no-whole-archive) elseif(IOS) # TODO: Not implement else () # Build Linux or MacOS if (BUILD_CUDA) # TODO: Not implement elseif (BUILD_LINUX_ARM7) message("[BUILD]Linux Armv7") add_definitions("-DLINUX_ARM7") set(PLAT linux-arm32) # MNN Third party dependence set(MNN_INCLUDE_DIRS ${PATH_3RDPARTY}/MNN-2.2.0/${PLAT}-static/include) set(MNN_LIBS ${PATH_3RDPARTY}/MNN-2.2.0/${PLAT}-static/lib) # OpenCV Third party dependence set(OpenCV_DIR ${PATH_3RDPARTY}/opencv/opencv-linux-armhf/share/OpenCV) set(OpenCV_STATIC_INCLUDE_DIR ${PATH_3RDPARTY}/opencv/opencv-linux-armhf/include/) find_package(OpenCV REQUIRED) elseif (BUILD_LINUX_ARM64) # TODO: Not implement else() # Local Build message("[BUILD]Local") if (APPLE) set(PLAT darwin) else() set(PLAT linux) endif () # Fetch MNN from git if the option is enabled if (LINUX_FETCH_MNN) # Include FetchContent module include(FetchContent) # Fetch MNN message("Downloading MNN from https://github.com/alibaba/MNN.git, this may take a while.") FetchContent_Declare( mnn GIT_REPOSITORY https://github.com/alibaba/MNN.git GIT_TAG 2.2.0 ) set(MNN_BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) set(MNN_BUILD_TOOLS OFF CACHE BOOL "" FORCE) FetchContent_MakeAvailable(mnn) set(MNN_INCLUDE_DIRS ${mnn_SOURCE_DIR}/include) set(MNN_LIBS ${mnn_BINARY_DIR}) else() # MNN Third party dependence set(MNN_INCLUDE_DIRS ${PATH_3RDPARTY}/MNN-2.2.0/${PLAT}/include) set(MNN_LIBS ${PATH_3RDPARTY}/MNN-2.2.0/${PLAT}/lib) endif() if(LINUX_USE_3RDPARTY_OPENCV) # OpenCV Third party dependence (static) set(OpenCV_DIR ${PATH_3RDPARTY}/opencv-4.5.1/${PLAT}/lib/cmake/opencv4) set(OpenCV_STATIC_INCLUDE_DIR ${PATH_3RDPARTY}/opencv-4.5.1/${PLAT}/include/opencv4) endif() find_package(OpenCV REQUIRED) endif() endif() if (NOT ANDROID) # mnn message(MNN_INCLUDE_DIRS=${MNN_INCLUDE_DIRS}) message(MNN_LIBS=${MNN_LIBS}) include_directories(${MNN_INCLUDE_DIRS}) link_directories(${MNN_LIBS}) # opencv message(OpenCV_Version: ${OpenCV_VERSION}) message(libraries: ${OpenCV_LIBS}) message(libraries path: ${OpenCV_DIR}) message(OpenCV_INCLUDE_DIRS=${OpenCV_STATIC_INCLUDE_DIR}) include_directories(${OpenCV_STATIC_INCLUDE_DIR}) if (BUILD_SAMPLES) # built samples exec add_executable(ContextSample ${CMAKE_CURRENT_SOURCE_DIR}/cpp/samples/sample_context.cpp ${SRC_C_CPP_FILES}) target_link_libraries(ContextSample ${OpenCV_LIBS} ${LINK_THIRD_LIBS} ) add_executable(SplitDetSample ${CMAKE_CURRENT_SOURCE_DIR}/cpp/samples/sample_split_model.cpp ${SRC_C_CPP_FILES}) target_link_libraries(SplitDetSample ${OpenCV_LIBS} ${LINK_THIRD_LIBS} ) add_executable(CAPISample ${CMAKE_CURRENT_SOURCE_DIR}/cpp/samples/sample_capi.cpp ${SRC_C_CPP_FILES} ${CAPI_CC_FILES}) target_link_libraries(CAPISample ${OpenCV_LIBS} ${LINK_THIRD_LIBS} ) endif() if (BUILD_TEST) if (ENABLE_BENCHMARK_TEST) message([Test]Open Benchmark Test) add_definitions(-DENABLE_BENCHMARK_TEST) endif () file(GLOB_RECURSE TEST_C_CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/cpp/test/*.cpp) add_executable(UnitTest ${TEST_C_CPP_FILES} ${SRC_C_CPP_FILES} ${CAPI_CC_FILES}) target_link_libraries(UnitTest ${OpenCV_LIBS} ${LINK_THIRD_LIBS}) endif() if (BUILD_SHARE) # build dynamic library add_library(${LIBRARY_NAME} SHARED ${SRC_C_CPP_FILES} ${CAPI_CC_FILES}) target_link_libraries(${LIBRARY_NAME} ${OpenCV_LIBS} ${LINK_THIRD_LIBS} ) set(SRC_RKNN_RELATED ${CMAKE_CURRENT_SOURCE_DIR}/cpp/src/inference_helper_rknn.cpp) set(SRC_C_CPP_FILES ${SRC_C_CPP_FILES} ) endif() endif() set(CMAKE_INSTALL_PREFIX ${PROJECT_BINARY_DIR}/install/hyperlpr3) message(CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}) # Add HyperLPR3-related files and directories to the installation list install(TARGETS ${LIBRARY_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cpp/c_api/hyper_lpr_sdk.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include) # Install resource file install(DIRECTORY resource DESTINATION ${CMAKE_INSTALL_PREFIX}) # Install Resource files You can also install sample programs if they are available if (BUILD_SAMPLES) install(TARGETS ContextSample DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) install(TARGETS CAPISample DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) install(TARGETS SplitDetSample DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) endif()