cmake_minimum_required(VERSION 3.10.0) project(ai-box VERSION 0.1.0 LANGUAGES C CXX) set(CMAKE_CXX_STANDARD 17) if(NOT DEFINED CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif() set(TARGET_INCLUDE_DIRS cxx) set(TARGET_LINK_DIRS) set(TARGET_LINK_LIBS) set(COMMON_SOURCE_FILES) set(NODE_SOURCE_FILES) set(NODE_ADDON_FOUND OFF) # NodeJS execute_process( COMMAND node ${CMAKE_SOURCE_DIR}/thirdpart/cmake-js-util.js --include RESULT_VARIABLE CMAKE_JS_RESULT OUTPUT_VARIABLE CMAKE_JS_INC OUTPUT_STRIP_TRAILING_WHITESPACE ) if(CMAKE_JS_RESULT EQUAL 0) execute_process( COMMAND node ${CMAKE_SOURCE_DIR}/thirdpart/cmake-js-util.js --src RESULT_VARIABLE CMAKE_JS_RESULT OUTPUT_VARIABLE CMAKE_JS_SRC OUTPUT_STRIP_TRAILING_WHITESPACE ) if(CMAKE_JS_RESULT EQUAL 0) execute_process( COMMAND node ${CMAKE_SOURCE_DIR}/thirdpart/cmake-js-util.js --lib RESULT_VARIABLE CMAKE_JS_RESULT OUTPUT_VARIABLE CMAKE_JS_LIB OUTPUT_STRIP_TRAILING_WHITESPACE ) endif() # NAPI if(CMAKE_JS_RESULT EQUAL 0) execute_process( COMMAND node ${CMAKE_SOURCE_DIR}/thirdpart/cmake-js-util.js --napi RESULT_VARIABLE CMAKE_JS_RESULT OUTPUT_VARIABLE NODE_ADDON_API_DIR ) endif() if(CMAKE_JS_RESULT EQUAL 0) message(STATUS "CMAKE_JS_INC: ${CMAKE_JS_INC}") message(STATUS "CMAKE_JS_SRC: ${CMAKE_JS_SRC}") message(STATUS "CMAKE_JS_LIB: ${CMAKE_JS_LIB}") message(STATUS "NODE_ADDON_API_DIR: ${NODE_ADDON_API_DIR}") list(APPEND TARGET_INCLUDE_DIRS ${CMAKE_JS_INC} ${NODE_ADDON_API_DIR}) list(APPEND TARGET_LINK_LIBS ${CMAKE_JS_LIB}) list(APPEND COMMON_SOURCE_FILES ${CMAKE_JS_SRC}) set(NODE_ADDON_FOUND ON) endif() endif() if(NOT (CMAKE_JS_RESULT EQUAL 0)) message(FATAL_ERROR "cmake js config failed") endif() function(add_node_targert TARGET_NAME SOURCE_FILES) add_library(${TARGET_NAME} SHARED ${CMAKE_JS_SRC} ${SOURCE_FILES}) target_link_libraries(${TARGET_NAME} ${CMAKE_JS_LIB}) set_target_properties(${TARGET_NAME} PROPERTIES PREFIX "" SUFFIX ".node") endfunction() # MNN set(MNN_CMAKE_FILE ${CMAKE_SOURCE_DIR}/thirdpart/MNN/${CMAKE_BUILD_TYPE}/config.cmake) if(EXISTS ${MNN_CMAKE_FILE}) include(${MNN_CMAKE_FILE}) message(STATUS "MNN_LIB_DIR: ${MNN_LIB_DIR}") message(STATUS "MNN_INCLUDE_DIR: ${MNN_INCLUDE_DIR}") message(STATUS "MNN_LIBS: ${MNN_LIBS}") include_directories(${MNN_INCLUDE_DIRS}) list(APPEND TARGET_INCLUDE_DIRS ${MNN_INCLUDE_DIR}) list(APPEND TARGET_LINK_DIRS ${MNN_LIB_DIR}) list(APPEND TARGET_LINK_LIBS ${MNN_LIBS}) add_compile_definitions(USE_MNN) set(USE_MNN ON) else() message(WARNING "MNN not found") endif() # OpenCV set(OpenCV_CMAKE_FILE ${CMAKE_SOURCE_DIR}/thirdpart/OpenCV/${CMAKE_BUILD_TYPE}/config.cmake) if(EXISTS ${OpenCV_CMAKE_FILE}) include(${OpenCV_CMAKE_FILE}) message(STATUS "OpenCV_LIB_DIR: ${OpenCV_LIB_DIR}") message(STATUS "OpenCV_INCLUDE_DIR: ${OpenCV_INCLUDE_DIR}") message(STATUS "OpenCV_LIBS: ${OpenCV_LIBS}") include_directories(${OpenCV_INCLUDE_DIRS}) if(NODE_ADDON_FOUND) add_node_targert(cv cxx/cv/node.cc) target_link_libraries(cv ${OpenCV_LIBS}) target_link_directories(cv PUBLIC ${OpenCV_INCLUDE_DIR}) target_compile_definitions(cv PUBLIC USE_OPENCV) endif() list(APPEND TARGET_INCLUDE_DIRS ${OpenCV_INCLUDE_DIR}) list(APPEND TARGET_LINK_DIRS ${OpenCV_LIB_DIR}) list(APPEND TARGET_LINK_LIBS ${OpenCV_LIBS}) list(APPEND NODE_SOURCE_FILES cxx/cv/node.cc) endif() # OnnxRuntime set(ONNXRuntime_CMAKE_FILE ${CMAKE_SOURCE_DIR}/thirdpart/ONNXRuntime/config.cmake) if(EXISTS ${ONNXRuntime_CMAKE_FILE}) include(${ONNXRuntime_CMAKE_FILE}) message(STATUS "ONNXRuntime_LIB_DIR: ${ONNXRuntime_LIB_DIR}") message(STATUS "ONNXRuntime_INCLUDE_DIR: ${ONNXRuntime_INCLUDE_DIR}") message(STATUS "ONNXRuntime_LIBS: ${ONNXRuntime_LIBS}") list(APPEND TARGET_INCLUDE_DIRS ${ONNXRuntime_INCLUDE_DIR}) list(APPEND TARGET_LINK_DIRS ${ONNXRuntime_LIB_DIR}) list(APPEND TARGET_LINK_LIBS ${ONNXRuntime_LIBS}) if(NODE_ADDON_FOUND) add_node_targert(ort cxx/ort/node.cc) target_link_libraries(ort ${ONNXRuntime_LIBS}) target_link_directories(ort PUBLIC ${ONNXRuntime_LIB_DIR}) target_compile_definitions(ort PUBLIC USE_ONNXRUNTIME) endif() list(APPEND NODE_SOURCE_FILES cxx/ort/node.cc ) else() message(WARNING "ONNXRuntime not found") endif() include_directories(${TARGET_INCLUDE_DIRS}) link_directories(${TARGET_LINK_DIRS}) add_library(addon SHARED ${COMMON_SOURCE_FILES} ${NODE_SOURCE_FILES} cxx/node.cc) target_link_libraries(addon ${TARGET_LINK_LIBS}) set_target_properties(addon PROPERTIES PREFIX "" SUFFIX ".node") # add_executable(test ${COMMON_SOURCE_FILES} cxx/test.cc) # target_link_libraries(test ${TARGET_LINK_LIBS}) if(MSVC AND CMAKE_JS_NODELIB_DEF AND CMAKE_JS_NODELIB_TARGET) execute_process(COMMAND ${CMAKE_AR} /def:${CMAKE_JS_NODELIB_DEF} /out:${CMAKE_JS_NODELIB_TARGET} ${CMAKE_STATIC_LINKER_FLAGS}) endif()