Files
eUi/CMakeLists.txt
RCiRoot e3f7733316 V20260829-2.6.1
完成框架目录和模块重构;新增核心、单例、工具、加密及框架 SDK;统一任务、相机和 RPC 接口,并增加离线检测、相机标定、备份恢复、版本管理、崩溃守护和心跳监控功能。
2026-09-20 16:01:09 +08:00

409 lines
16 KiB
CMake
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目。
#
message(STATUS "CMake version: ${CMAKE_VERSION}")
cmake_minimum_required(VERSION 3.14.0)
project(eui)
string(TIMESTAMP RUN_TIME)
message( " project start : " ${RUN_TIME})
add_compile_definitions(NOMINMAX)
include_directories("${CMAKE_BINARY_DIR}/generated")
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
get_directory_property(_has_parent PARENT_DIRECTORY)
if(_has_parent)
set(is_root_project OFF)
else()
set(is_root_project ON)
endif()
set(NE_DEVELOPER_DEFAULTS "${is_root_project}" CACHE BOOL "Turns on default settings for development of QTdemo")
option(BUILD_EXAMPLES "Build Examples" "${NE_DEVELOPER_DEFAULTS}")
option(BUILD_MODULES "Build Modules" "${NE_DEVELOPER_DEFAULTS}")
option(BUILD_UNIT_TESTS "Build unit tests" OFF)
set(EUI_UNIT_TEST_DIR "${CMAKE_SOURCE_DIR}/../Eui_UnitTest" CACHE PATH
"External unit test source directory")
option(EUI_BUILD_SUBMODULES "Build camera and acquisition modules" ON)
option(EUI_BUILD_RPCMODULES "Build RPC and PLC communication modules" ON)
option(EUI_BUILD_MISSIONS "Build mission task plugin modules" ON)
option(EUI_HANDLE_AI_2256 "Use the no-namespace handleAI 2256 ABI" OFF)
if(EUI_HANDLE_AI_2256)
add_compile_definitions(EUI_HANDLE_AI_2256)
endif()
if (MSVC_VERSION GREATER_EQUAL "1900")
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("/std:c++17" _cpp_latest_flag_supported)
if (_cpp_latest_flag_supported)
add_compile_options("/std:c++17")
else()
message(WARNING "Compiler does not support C++17 standard.")
endif()
else()
message(WARNING "MSVC version is not supported.")
endif()
# 默认生成参数设置
if(NE_DEVELOPER_DEFAULTS)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_EXTENSIONS OFF)
SET(CMAKE_CXX_STANDARD_REQUIRED TRUE)
# PROJECT_BINARY_DIR 指build生成所在文件夹
# PROJECT_SOURCE_DIR 指最外层CMakeLists.txt所在文件夹
# CMAKE_CURRENT_SOURCE_DIR 指正在处理的CMakeLists.txt所在文件夹
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/bin")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_SOURCE_DIR}/bin")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_SOURCE_DIR}/bin")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${PROJECT_SOURCE_DIR}/bin")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${PROJECT_SOURCE_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/lib")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/lib")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${PROJECT_SOURCE_DIR}/lib")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${PROJECT_SOURCE_DIR}/lib")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${PROJECT_SOURCE_DIR}/lib")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL "${PROJECT_SOURCE_DIR}/lib")
SET(PROJECT_ROOT_PATH ${PROJECT_SOURCE_DIR})
endif()
##################
# 获取默认库路径
# 记录 // include // lib // 子文件夹名
##
# SUBDIRENAMES 遍历子文件夹
# ISAbsolutePath ON 子文件夹路径名 OFF 读取文件名
macro(SUBDIRENAMES result curdir _temp ISAbsolutePath)
file(GLOB children RELATIVE ${curdir} ${curdir}/*${_temp})
set(dirlist "")
foreach(child ${children})
if("${child}" MATCHES "^\\.")
continue()
endif()
if(IS_DIRECTORY ${curdir}/${child} )
if(${child} MATCHES .*${_temp})
if(${ISAbsolutePath})
LIST(APPEND dirlist ${curdir}/${child})
else()
LIST(APPEND dirlist ${child})
endif()
endif()
endif()
endforeach()
set(${result} ${dirlist})
endmacro()
##########
####################### 自动查询路径下库文件 include lib 拷贝dll
#
macro(FINDDLLDIR result Includes Libs ISMoveDll)
SET(envs "")
list(APPEND ${Includes} ${result}/include)
SUBDIRENAMES(envs ${result}/include "" ON)
list(APPEND ${Includes} ${envs})
SUBDIRENAMES(envs ${result} "lib" ON)
list(APPEND ${Libs} ${envs})
endmacro()
######################### 去除重复项
#
macro(REMOVE_DUPLICATES result )
SET(DUP "")
message("[!] RESULT : " ${result})
foreach(var ${result})
list(FIND DUP ${var} _index)
if(${_index} GREATER -1)
message("[!] HAVE : " ${var} )
else()
message("[!] ADD : " ${var})
list(APPEND DUP ${var})
endif()
endforeach()
set(${result} ${DUP})
endmacro()
#########################
if (MSVC)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd /Zi")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD /Zi")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG")
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG")
add_compile_definitions(_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR=1)
add_compile_options(/FS)
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
endif()
if(MSVC)
# QT path qt5.14.2
get_filename_component(PARENT_DIR ${PROJECT_SOURCE_DIR} DIRECTORY)
SET(ENVPATH ${PARENT_DIR}/GlobalCppEnv) #设置遍历库路径
SUBDIRENAMES(envs ${ENVPATH} "" OFF) #自动遍历
list(REMOVE_ITEM envs myTools)
# 设置引用库名
foreach(child ${envs})
message("DLL NAME: " ${child})
FINDDLLDIR(${ENVPATH}/${child} ${child}_include ${child}_lib ON)
message(${child}_include: ${${child}_include} )
message(${child}_lib: ${${child}_lib})
if(${child} MATCHES "opencv")
SET(${child}_target_link
"$<$<CONFIG:Debug>:opencv_world410d>$<$<NOT:$<CONFIG:Debug>>:opencv_world410>")
elseif(${child} MATCHES "opencv4120")
SET(${child}_target_link
"$<$<CONFIG:Debug>:opencv_world4120d>$<$<NOT:$<CONFIG:Debug>>:opencv_world4120>")
elseif(${child} MATCHES "halcon")
SET( ${child}_target_link
"halcon"
"halconcpp"
"hdevenginecpp" )
elseif(${child} MATCHES "keyence3D")
SET( ${child}_target_link
"LJX8_IF" )
elseif(${child} MATCHES "python")
#set(PYTHON_EXECUTABLE "${PROJECT_ROOT_PATH}/env/python/Python37")
SET( ${child}_target_link
"_tkinter"
"python3"
"python312")
elseif(${child} MATCHES "csFins")
#set(PYTHON_EXECUTABLE "${PROJECT_ROOT_PATH}/env/python/Python37")
SET( ${child}_target_link
"cs_finsTcp"
"CsFins.Native")
elseif(${child} MATCHES "pyDirectFins")
#set(PYTHON_EXECUTABLE "${PROJECT_ROOT_PATH}/env/python/Python37")
SET( ${child}_target_link
"pyDirectFinsTcp"
"PyFinsHost"
"python3"
"python312")
elseif(${child} MATCHES "boost")
SET( ${child}_target_link
"libboost_python312-vc143-mt-sgd-x64-1_86"
"libboost_python312-vc143-mt-s-x64-1_86"
"libboost_thread-vc143-mt-gd-x64-1_86"
"libboost_chrono-vc143-mt-gd-x64-1_86")
elseif(${child} MATCHES "basler")
SET( ${child}_target_link
"PylonC.lib" )
elseif(${child} MATCHES "mvs")
SET( ${child}_target_link
"MvCameraControl" )
elseif(${child} MATCHES "Dalsa")
SET( ${child}_target_link
"corapi"
"SapClassBasic"
"SapClassGui")
elseif(${child} MATCHES "keyence2_5D")
SET( ${child}_target_link
"kglib" )
elseif(${child} MATCHES "3DAI")
SET(${child}_target_link "3DAlg")
elseif("${child}" STREQUAL "handdleAI")
if(EUI_HANDLE_AI_2256)
SET(${child}_target_link
"$<$<CONFIG:Debug>:handleAId2256>$<$<NOT:$<CONFIG:Debug>>:handleAI2256>")
else()
SET(${child}_target_link
"$<$<CONFIG:Debug>:handleAId>$<$<NOT:$<CONFIG:Debug>>:handleAI>")
endif()
elseif(${child} MATCHES "spdLog")
SET(${child}_target_link
"$<$<CONFIG:Debug>:spdlogd>$<$<NOT:$<CONFIG:Debug>>:spdlog>")
elseif(${child} MATCHES "crashpad")
# Crashpad 客户端静态库(供 launcher 链接)。
# 库集合与命名已通过独立 link test 验证(MSVC /std:c++17 /MD[d]):
# Release 用 xxx.lib,Debug 用 xxx_d.lib,均放在 GlobalCppEnv/crashpad/lib。
# crashpad_handler.exe 是独立可执行文件,随包部署,不在此链接。
SET(${child}_target_link
"$<$<CONFIG:Debug>:client_d>$<$<NOT:$<CONFIG:Debug>>:client>"
"$<$<CONFIG:Debug>:client_common_d>$<$<NOT:$<CONFIG:Debug>>:client_common>"
"$<$<CONFIG:Debug>:util_d>$<$<NOT:$<CONFIG:Debug>>:util>"
"$<$<CONFIG:Debug>:base_d>$<$<NOT:$<CONFIG:Debug>>:base>"
"$<$<CONFIG:Debug>:compat_d>$<$<NOT:$<CONFIG:Debug>>:compat>"
"$<$<CONFIG:Debug>:zlib_d>$<$<NOT:$<CONFIG:Debug>>:zlib>"
"$<$<CONFIG:Debug>:net_d>$<$<NOT:$<CONFIG:Debug>>:net>"
"$<$<CONFIG:Debug>:context_d>$<$<NOT:$<CONFIG:Debug>>:context>"
"Advapi32"
"Rpcrt4"
"Winhttp"
"version"
"User32"
"Psapi")
# crashpad_handler.exe 需部署到 launcher 同目录;这里记录其绝对路径,
# 由 launcher 的 POST_BUILD 拷贝到输出 bin 目录。
set(CRASHPAD_HANDLER_EXE "${ENVPATH}/${child}/bin/crashpad_handler.exe" CACHE FILEPATH "Crashpad handler executable" FORCE)
elseif(${child} MATCHES "hwinfo")
SET(${child}_target_link
"$<$<CONFIG:Debug>:fmtd>$<$<NOT:$<CONFIG:Debug>>:fmt>"
"$<$<CONFIG:Debug>:hwinfo_battery_d>$<$<NOT:$<CONFIG:Debug>>:hwinfo_battery>"
"$<$<CONFIG:Debug>:hwinfo_cpu_d>$<$<NOT:$<CONFIG:Debug>>:hwinfo_cpu>"
"$<$<CONFIG:Debug>:hwinfo_disk_d>$<$<NOT:$<CONFIG:Debug>>:hwinfo_disk>"
"$<$<CONFIG:Debug>:hwinfo_gpu_d>$<$<NOT:$<CONFIG:Debug>>:hwinfo_gpu>"
"$<$<CONFIG:Debug>:hwinfo_mainboard_d>$<$<NOT:$<CONFIG:Debug>>:hwinfo_mainboard>"
"$<$<CONFIG:Debug>:hwinfo_network_d>$<$<NOT:$<CONFIG:Debug>>:hwinfo_network>"
"$<$<CONFIG:Debug>:hwinfo_os_d>$<$<NOT:$<CONFIG:Debug>>:hwinfo_os>"
"$<$<CONFIG:Debug>:hwinfo_ram_d>$<$<NOT:$<CONFIG:Debug>>:hwinfo_ram>")
elseif(${child} MATCHES "openSSL")
SET(${child}_target_link
"$<$<CONFIG:Debug>:libcryptod>$<$<NOT:$<CONFIG:Debug>>:libcrypto>"
"$<$<CONFIG:Debug>:libssld>$<$<NOT:$<CONFIG:Debug>>:libssl>")
elseif(${child} MATCHES "cotp")
SET( ${child}_target_link
"$<$<CONFIG:Debug>:cotpd>$<$<NOT:$<CONFIG:Debug>>:cotp>" )
else()
SET( ${child}_target_link "" )
endif()
message(${child}_target_link: ${${child}_target_link})
endforeach()
set(Qt5_DIR ${ENVPATH}/qt5/lib/cmake/Qt5)
set(QT_DIR ${Qt5_DIR})
set(qtlist "Core" "Widgets" "Network" "Gui" "Charts" "PrintSupport" "Concurrent" "SerialPort" "Sql" )
message("QT_Version :" Qt${QT_VERSION_MAJOR})
add_definitions(-DQT_MESSAGELOGCONTEXT)#打开QT日志信息
endif()
##################
# 设置dll后缀
##
# 公共 include 目录以 target 的形式向各模块传播;BEFORE 路径用于兼容旧代码中的同名头文件优先级。
option(EUI_USE_PREBUILT_LIBS "Link prebuilt eui_tools, eui_crypto and eui_frameworkSdk libraries" ON)
if(EUI_HANDLE_AI_2256 AND EUI_USE_PREBUILT_LIBS)
message(FATAL_ERROR
"EUI_HANDLE_AI_2256 requires EUI_USE_PREBUILT_LIBS=OFF, or matching 2256-built eui_tools/eui_frameworkSdk libraries.")
endif()
if(EUI_USE_PREBUILT_LIBS)
find_package(Qt5 COMPONENTS Core Widgets Network SerialPort Sql REQUIRED)
foreach(prebuilt_target eui_tools eui_crypto eui_frameworkSdk)
if(NOT EXISTS "${CMAKE_SOURCE_DIR}/lib/${prebuilt_target}.lib"
OR NOT EXISTS "${CMAKE_SOURCE_DIR}/lib/${prebuilt_target}_d.lib")
message(FATAL_ERROR
"EUI_USE_PREBUILT_LIBS=ON requires ${prebuilt_target}.lib and ${prebuilt_target}_d.lib in ${CMAKE_SOURCE_DIR}/lib")
endif()
add_library(${prebuilt_target} STATIC IMPORTED GLOBAL)
set_target_properties(${prebuilt_target} PROPERTIES
IMPORTED_LOCATION_DEBUG "${CMAKE_SOURCE_DIR}/lib/${prebuilt_target}_d.lib"
IMPORTED_LOCATION_RELEASE "${CMAKE_SOURCE_DIR}/lib/${prebuilt_target}.lib"
IMPORTED_LOCATION_RELWITHDEBINFO "${CMAKE_SOURCE_DIR}/lib/${prebuilt_target}.lib"
IMPORTED_LOCATION_MINSIZEREL "${CMAKE_SOURCE_DIR}/lib/${prebuilt_target}.lib"
)
endforeach()
add_library(eui::tools ALIAS eui_tools)
target_include_directories(eui_tools INTERFACE
"${CMAKE_SOURCE_DIR}/include"
${openSSL_include}
${opencv_include}
${halcon_include}
${handdleAI_include}
)
target_link_directories(eui_tools INTERFACE
${openSSL_lib}
${opencv_lib}
${halcon_lib}
${handdleAI_lib}
)
target_link_libraries(eui_tools INTERFACE
Qt5::Core
Qt5::Widgets
Qt5::SerialPort
Qt5::Network
Qt5::Sql
setupapi
cfgmgr32
${openSSL_target_link}
${opencv_target_link}
${halcon_target_link}
${handdleAI_target_link}
)
target_link_directories(eui_crypto INTERFACE ${cotp_lib})
target_link_libraries(eui_crypto INTERFACE ${cotp_target_link})
target_link_libraries(eui_tools INTERFACE eui_crypto)
add_library(eui::eui_frameworkSdk ALIAS eui_frameworkSdk)
target_include_directories(eui_frameworkSdk INTERFACE
"${CMAKE_SOURCE_DIR}/include"
${opencv_include}
${halcon_include}
${openSSL_include}
${handdleAI_include}
${mvs_include}
)
target_link_directories(eui_frameworkSdk INTERFACE ${opencv_lib} ${halcon_lib})
target_link_libraries(eui_frameworkSdk INTERFACE
eui::tools
Qt5::Core
${opencv_target_link}
${halcon_target_link}
)
else()
if(EXISTS "${CMAKE_SOURCE_DIR}/src/eui_crypto/CMakeLists.txt")
add_subdirectory(src/eui_crypto)
else()
add_library(eui_crypto STATIC IMPORTED GLOBAL)
set_target_properties(eui_crypto PROPERTIES
IMPORTED_LOCATION_DEBUG "${CMAKE_SOURCE_DIR}/lib/eui_crypto_d.lib"
IMPORTED_LOCATION_RELEASE "${CMAKE_SOURCE_DIR}/lib/eui_crypto.lib"
IMPORTED_LOCATION_RELWITHDEBINFO "${CMAKE_SOURCE_DIR}/lib/eui_crypto.lib"
IMPORTED_LOCATION_MINSIZEREL "${CMAKE_SOURCE_DIR}/lib/eui_crypto.lib"
INTERFACE_LINK_DIRECTORIES "${cotp_lib}"
)
target_link_libraries(eui_crypto INTERFACE ${cotp_target_link})
endif()
add_subdirectory(src/eui_tools)
endif()
add_subdirectory(src/eui_singleton)
include_directories(BEFORE
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/include/eui_singleton
${CMAKE_SOURCE_DIR}/include/missionCommon
${CMAKE_SOURCE_DIR}/src/eui_core
${CMAKE_SOURCE_DIR}/src/eui_core/services
${CMAKE_SOURCE_DIR}/src/eui_core/detRuntime
)
# 公共头 include/eui_tools/json/euiJson.h 是全局可包含的,却直接 #include <openssl/evp.h>;
# 任何传递包含它的 target(含未在自身 DLL_NAMES 里列 openSSL 的旧 mission)都需要该路径,
# 故 openSSL include 也随全局公共头一并向所有 target 传播。
include_directories(BEFORE ${openSSL_include})
# 包含子项目。
##################
# Automated examples
##
add_subdirectory(src)
if(EUI_BUILD_SUBMODULES)
add_subdirectory(subModule)
endif()
if(EUI_BUILD_RPCMODULES)
add_subdirectory(rpcModule)
endif()
if(BUILD_UNIT_TESTS)
enable_testing()
if(NOT EXISTS "${EUI_UNIT_TEST_DIR}/CMakeLists.txt")
message(FATAL_ERROR "Unit test source directory not found: ${EUI_UNIT_TEST_DIR}")
endif()
set(EUI_SOURCE_DIR "${CMAKE_SOURCE_DIR}")
add_subdirectory("${EUI_UNIT_TEST_DIR}" "${CMAKE_BINARY_DIR}/unitTest")
endif()
# add_subdirectory(plugin)
##################
# Automated modules
##
string(TIMESTAMP RUN_TIME)
message(" project end : ${RUN_TIME} TYPE:${CMAKE_BUILD_TYPE}")