CMakeLists.txt 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. cmake_minimum_required(VERSION 3.12)
  2. project(CCOS.Dev.Generator.CPI VERSION 1.0.0 LANGUAGES CXX)
  3. # 设置 C++ 标准
  4. set(CMAKE_CXX_STANDARD 17)
  5. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  6. set(CMAKE_CXX_EXTENSIONS OFF)
  7. # 配置输出目录
  8. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
  9. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
  10. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
  11. # 设置交付目录
  12. get_filename_component(DELIVER_DIR "${CMAKE_BINARY_DIR}/../../../Deliver" ABSOLUTE)
  13. get_filename_component(PhysicalDevice_DELIVER_DIR "${CMAKE_BINARY_DIR}/../../Deliver" ABSOLUTE)
  14. message(STATUS "交付目录: ${DELIVER_DIR}")
  15. # 定义交付库目录
  16. set(DELIVER_LIB_DIR "${DELIVER_DIR}/lib")
  17. message(STATUS "交付库目录: ${DELIVER_LIB_DIR}")
  18. # 确保交付库目录存在
  19. if(NOT EXISTS ${DELIVER_LIB_DIR})
  20. message(FATAL_ERROR "交付库目录不存在: ${DELIVER_LIB_DIR}")
  21. endif()
  22. # 添加链接目录
  23. link_directories(${DELIVER_LIB_DIR})
  24. message(STATUS "添加链接目录: ${DELIVER_LIB_DIR}")
  25. # 设置包含目录(包括交付头文件目录)
  26. set(DELIVER_INCLUDE_DIR "${DELIVER_DIR}/include")
  27. set(PhysicalDevice_DELIVER_INCLUDE_DIR "${PhysicalDevice_DELIVER_DIR}/Include")
  28. include_directories(
  29. ${DELIVER_INCLUDE_DIR}
  30. ${PhysicalDevice_DELIVER_INCLUDE_DIR}
  31. ${PhysicalDevice_DELIVER_INCLUDE_DIR}/fmt
  32. )
  33. message(STATUS "包含交付头文件目录: ${DELIVER_INCLUDE_DIR}")
  34. # 配置源文件
  35. set(SRC_FILES
  36. CCOS.Dev.Generator.CPI.cpp
  37. CCOS.Dev.Generator.CPI.h
  38. CCOS.Dev.CollimatorMoudle.cpp
  39. CCOS.Dev.CollimatorMoudle.hpp
  40. CCOS.Dev.MechanicalMoudle.cpp
  41. CCOS.Dev.MechanicalMoudle.hpp
  42. CCOS.Dev.DapMoudle.hpp
  43. CCOS.Dev.DapMoudle.cpp
  44. OEM.Dap.cpp
  45. OEM.Dap.h
  46. OEM.Collimator.h
  47. OEM.Collimator.cpp
  48. OEM.Mechanical.h
  49. OEM.Mechanical.cpp
  50. LogLocalHelper.cpp
  51. LogLocalHelper.h
  52. ${PhysicalDevice_DELIVER_INCLUDE_DIR}/CCOS.Dev.MSGMould.hpp
  53. ${PhysicalDevice_DELIVER_INCLUDE_DIR}/CCOS.Dev.MSGMould.cpp
  54. ${PhysicalDevice_DELIVER_INCLUDE_DIR}/Base64.h
  55. ${PhysicalDevice_DELIVER_INCLUDE_DIR}/Base64.cpp
  56. ${DELIVER_INCLUDE_DIR}/LogicDevice.h
  57. )
  58. # 创建库目标
  59. add_library(CCOS.Dev.Generator.CPI SHARED ${SRC_FILES})
  60. # 设置目标属性
  61. set_target_properties(CCOS.Dev.Generator.CPI PROPERTIES
  62. VERSION ${PROJECT_VERSION}
  63. SOVERSION 1
  64. OUTPUT_NAME "CCOS.Dev.Generator.CPI"
  65. )
  66. # Linux特定链接设置
  67. target_link_libraries(CCOS.Dev.Generator.CPI PRIVATE
  68. CCOS.Dev.IODevice
  69. SCF
  70. SCFWrapper
  71. SerialSCF
  72. TcpipSCF
  73. log4cpp_wrapper
  74. CCOS.Dev.Generator.Mould
  75. pthread # 添加POSIX线程库
  76. dl # 添加动态链接库
  77. )
  78. # 设置RPATH
  79. set_target_properties(CCOS.Dev.Generator.CPI PROPERTIES
  80. INSTALL_RPATH "$ORIGIN"
  81. BUILD_WITH_INSTALL_RPATH TRUE
  82. )
  83. # 确保交付目录结构存在
  84. file(MAKE_DIRECTORY
  85. "${DELIVER_DIR}/lib"
  86. "${DELIVER_DIR}/bin"
  87. "${DELIVER_DIR}/include"
  88. )
  89. add_custom_command(TARGET CCOS.Dev.Generator.CPI POST_BUILD
  90. COMMENT "===== 复制构建产物到交付目录 ====="
  91. # 复制动态库/导入库
  92. COMMAND ${CMAKE_COMMAND} -E echo "复制库文件..."
  93. COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/lib"
  94. COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/bin"
  95. # 复制核心库文件(唯一真实二进制文件,如 libCCOS.Dev.Generator.CPI.so.1.0.0)
  96. COMMAND ${CMAKE_COMMAND} -E echo "复制CCOS.Dev.Generator.CPI核心库文件..."
  97. COMMAND ${CMAKE_COMMAND} -E copy_if_different
  98. "$<TARGET_FILE:CCOS.Dev.Generator.CPI>"
  99. "${DELIVER_DIR}/lib"
  100. # 创建主版本符号链接(如 libCCOS.Dev.Generator.CPI.so.1 -> 完整版本库文件)
  101. COMMAND ${CMAKE_COMMAND} -E echo "创建CCOS.Dev.Generator.CPI主版本符号链接..."
  102. COMMAND ${CMAKE_COMMAND} -E create_symlink
  103. "$<TARGET_FILE_NAME:CCOS.Dev.Generator.CPI>" # 链接指向的目标(核心库文件名)
  104. "${DELIVER_DIR}/lib/$<TARGET_SONAME_FILE_NAME:CCOS.Dev.Generator.CPI>" # 链接文件本身(主版本名)
  105. # 创建通用符号链接(如 libCCOS.Dev.Generator.CPI.so -> 主版本链接)
  106. COMMAND ${CMAKE_COMMAND} -E echo "创建CCOS.Dev.Generator.CPI通用符号链接..."
  107. COMMAND ${CMAKE_COMMAND} -E create_symlink
  108. "$<TARGET_SONAME_FILE_NAME:CCOS.Dev.Generator.CPI>" # 链接指向的目标(主版本链接名)
  109. "${DELIVER_DIR}/lib/$<TARGET_LINKER_FILE_NAME:CCOS.Dev.Generator.CPI>" # 链接文件本身(通用名)
  110. # 复制头文件
  111. COMMAND ${CMAKE_COMMAND} -E echo "复制头文件..."
  112. COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/include"
  113. )
  114. # 单独处理头文件复制(支持多配置生成器)
  115. set(HEADER_TO_COPY)
  116. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CCOS.Dev.Generator.CPI.h")
  117. set(HEADER_TO_COPY "${CMAKE_CURRENT_SOURCE_DIR}/CCOS.Dev.Generator.CPI.h")
  118. elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CCOS.Dev.Generator.CPI.hpp")
  119. set(HEADER_TO_COPY "${CMAKE_CURRENT_SOURCE_DIR}/CCOS.Dev.Generator.CPI.hpp")
  120. endif()
  121. if(HEADER_TO_COPY)
  122. add_custom_command(TARGET CCOS.Dev.Generator.CPI POST_BUILD
  123. COMMAND ${CMAKE_COMMAND} -E copy_if_different
  124. "${HEADER_TO_COPY}"
  125. "${DELIVER_DIR}/include"
  126. COMMENT "复制头文件: ${HEADER_TO_COPY}"
  127. )
  128. else()
  129. message(WARNING "未找到与目标 CCOS.Dev.Generator.CPI 同名的头文件")
  130. endif()