# 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("$<$:/utf-8>") add_compile_options("$<$:/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 "$<$:opencv_world410d>$<$>:opencv_world410>") elseif(${child} MATCHES "opencv4120") SET(${child}_target_link "$<$:opencv_world4120d>$<$>: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 "$<$:handleAId2256>$<$>:handleAI2256>") else() SET(${child}_target_link "$<$:handleAId>$<$>:handleAI>") endif() elseif(${child} MATCHES "spdLog") SET(${child}_target_link "$<$:spdlogd>$<$>: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 "$<$:client_d>$<$>:client>" "$<$:client_common_d>$<$>:client_common>" "$<$:util_d>$<$>:util>" "$<$:base_d>$<$>:base>" "$<$:compat_d>$<$>:compat>" "$<$:zlib_d>$<$>:zlib>" "$<$:net_d>$<$>:net>" "$<$:context_d>$<$>: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 "$<$:fmtd>$<$>:fmt>" "$<$:hwinfo_battery_d>$<$>:hwinfo_battery>" "$<$:hwinfo_cpu_d>$<$>:hwinfo_cpu>" "$<$:hwinfo_disk_d>$<$>:hwinfo_disk>" "$<$:hwinfo_gpu_d>$<$>:hwinfo_gpu>" "$<$:hwinfo_mainboard_d>$<$>:hwinfo_mainboard>" "$<$:hwinfo_network_d>$<$>:hwinfo_network>" "$<$:hwinfo_os_d>$<$>:hwinfo_os>" "$<$:hwinfo_ram_d>$<$>:hwinfo_ram>") elseif(${child} MATCHES "openSSL") SET(${child}_target_link "$<$:libcryptod>$<$>:libcrypto>" "$<$:libssld>$<$>:libssl>") elseif(${child} MATCHES "cotp") SET( ${child}_target_link "$<$:cotpd>$<$>: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 ; # 任何传递包含它的 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}")