Files
ai-box/CMakeLists.txt
2025-03-20 18:24:12 +08:00

142 lines
4.3 KiB
CMake

cmake_minimum_required(VERSION 3.10.0)
project(ai-box VERSION 0.1.0 LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)
if (POLICY CMP0091)
cmake_policy(SET CMP0091 NEW)
endif (POLICY CMP0091)
if(NOT DEFINED CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
set(NODE_COMMON_SOURCES)
set(NODE_ADDON_FOUND OFF)
include_directories(cxx)
# 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()
# ReleaseVersion
if(CMAKE_JS_RESULT EQUAL 0)
execute_process(
COMMAND node ${CMAKE_SOURCE_DIR}/thirdpart/cmake-js-util.js --release
RESULT_VARIABLE CMAKE_JS_RESULT
OUTPUT_VARIABLE RELEASE_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(CMAKE_JS_RESULT EQUAL 0)
message(STATUS "RELEASE_VERSION: ${RELEASE_VERSION}")
add_compile_definitions(RELEASE_VERSION="${RELEASE_VERSION}")
endif()
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}")
include_directories(${CMAKE_JS_INC} ${NODE_ADDON_API_DIR})
set(NODE_ADDON_FOUND ON)
endif()
endif()
if(NOT (CMAKE_JS_RESULT EQUAL 0))
message(FATAL_ERROR "cmake js config failed")
endif()
# 新增Nodejs目标
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_DIR})
link_directories(${MNN_LIB_DIR})
if(NODE_ADDON_FOUND)
add_node_targert(mnn cxx/mnn/node.cc)
target_link_libraries(mnn ${MNN_LIBS})
target_compile_definitions(mnn PUBLIC USE_MNN)
list(APPEND NODE_COMMON_SOURCES cxx/mnn/node.cc)
endif()
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}")
include_directories(${ONNXRuntime_INCLUDE_DIR})
link_directories(${ONNXRuntime_LIB_DIR})
if(NODE_ADDON_FOUND)
add_node_targert(ort cxx/ort/node.cc)
target_link_libraries(ort ${ONNXRuntime_LIBS})
target_compile_definitions(ort PUBLIC USE_ONNXRUNTIME)
list(APPEND NODE_COMMON_SOURCES cxx/ort/node.cc)
endif()
endif()
# 统一的NodeJS插件
if(NODE_ADDON_FOUND)
add_node_targert(addon cxx/node.cc)
target_sources(addon PRIVATE ${NODE_COMMON_SOURCES})
target_compile_definitions(addon PUBLIC BUILD_MAIN_WORD)
# MNN
if(EXISTS ${MNN_CMAKE_FILE})
target_link_libraries(addon ${MNN_LIBS})
target_compile_definitions(addon PUBLIC USE_MNN)
endif()
# OnnxRuntime
if(EXISTS ${ONNXRuntime_CMAKE_FILE})
target_link_libraries(addon ${ONNXRuntime_LIBS})
target_compile_definitions(addon PUBLIC USE_ONNXRUNTIME)
endif()
endif()
if(MSVC AND NODE_ADDON_FOUND)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
execute_process(COMMAND ${CMAKE_AR} /def:${CMAKE_JS_NODELIB_DEF} /out:${CMAKE_JS_NODELIB_TARGET} ${CMAKE_STATIC_LINKER_FLAGS})
endif()