CMakeLists.txt 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. # =============================================================================
  2. # 项目名称: HyperLPR3-LinuxAPP
  3. # 功能: 车牌识别应用程序
  4. # 优化目标: 减小可执行文件体积、提升编译效率、增强可移植性
  5. # =============================================================================
  6. # -----------------------------------------------------------------------------
  7. # 1. CMake 最低版本要求
  8. # 说明: 3.10.2 是 Ubuntu 18.04 默认版本,如需使用新特性可提高到 3.16+
  9. # -----------------------------------------------------------------------------
  10. #cmake_minimum_required(VERSION 3.10.2)
  11. #cmake_minimum_required(VERSION 3.16.2)
  12. #cmake_minimum_required(VERSION 3.28)
  13. #当前CMake 3.25.1
  14. cmake_minimum_required(VERSION 3.25.1)
  15. # -----------------------------------------------------------------------------
  16. # 2. 项目定义
  17. # -----------------------------------------------------------------------------
  18. project(HyperLPR3-LinuxAPP
  19. VERSION 1.0.0
  20. DESCRIPTION "HyperLPR3 车牌识别 Linux 应用"
  21. LANGUAGES CXX C
  22. )
  23. # -----------------------------------------------------------------------------
  24. # 3. C++ 标准设置
  25. # 说明: 使用 C++17 标准,启用标准强制检查
  26. # -----------------------------------------------------------------------------
  27. set(CMAKE_CXX_STANDARD 17)
  28. set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制要求编译器支持 C++17,不支持则报错
  29. set(CMAKE_CXX_EXTENSIONS OFF) # 禁用编译器扩展(如 GNU++17),确保跨平台兼容
  30. # -----------------------------------------------------------------------------
  31. # 4. 构建类型设置
  32. # 说明:
  33. # - Release: 发布模式,启用优化,去除调试信息,体积最小
  34. # - Debug: 调试模式,保留调试信息,便于开发调试
  35. # - RelWithDebInfo: 带调试信息的发布模式
  36. # - MinSizeRel: 最小体积发布模式(比 Release 更激进优化体积)
  37. # -----------------------------------------------------------------------------
  38. if(NOT CMAKE_BUILD_TYPE)
  39. set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
  40. endif()
  41. # 设置可选的构建类型(供 cmake-gui 或 ccmake 使用)
  42. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
  43. "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
  44. # -----------------------------------------------------------------------------
  45. # 5. 编译器优化标志(Release 模式专用)
  46. # 说明: 这些标志专门用于减小编译后的可执行文件体积
  47. # -----------------------------------------------------------------------------
  48. if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
  49. # -O3: 最高级别优化(速度优先)
  50. # -Os: 优化代码大小(体积优先,推荐用于嵌入式)
  51. # -s: 去除符号表信息(strip)
  52. # -fvisibility=hidden: 隐藏符号,减少导出表大小
  53. # -fvisibility-inlines-hidden: 隐藏内联函数符号
  54. # -ffunction-sections -fdata-sections: 为每个函数/数据创建独立段
  55. # -Wl,--gc-sections: 链接时删除未使用的段
  56. # -Wl,--strip-all: 链接时去除所有符号
  57. # -flto: 链接时优化(Link Time Optimization),可显著减小体积
  58. set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -s")
  59. set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -s")
  60. # 可选: 启用 LTO(链接时优化)- 需要编译器支持,可减小 10-30% 体积
  61. # 注意: 会增加编译时间,某些编译器可能有兼容性问题
  62. # set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
  63. # 可选: 最小体积模式(比 Release 更激进)
  64. # set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -s -fvisibility=hidden -fvisibility-inlines-hidden")
  65. endif()
  66. # -----------------------------------------------------------------------------
  67. # 6. 优先使用动态链接库(减小可执行文件体积的关键)
  68. # 说明:
  69. # - ON: 优先查找动态库(.so),体积最小,但部署时需确保目标机有对应库
  70. # - OFF: 优先查找静态库(.a),体积大但独立性强
  71. # 建议: 开发/测试用动态库,发布时根据部署环境决定
  72. # -----------------------------------------------------------------------------
  73. option(USE_STATIC_LIBS "使用静态库链接(体积大但独立性强)" OFF)
  74. if(NOT USE_STATIC_LIBS)
  75. set(BUILD_SHARED_LIBS ON)
  76. # 设置动态库查找优先级
  77. set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".so.1" ".so.0" ".a")
  78. else()
  79. set(BUILD_SHARED_LIBS OFF)
  80. set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".so")
  81. endif()
  82. # -----------------------------------------------------------------------------
  83. # 7. 查找 PkgConfig 模块
  84. # 说明: pkg-config 用于自动查找系统安装的库的头文件和链接参数
  85. # -----------------------------------------------------------------------------
  86. find_package(PkgConfig REQUIRED)
  87. # -----------------------------------------------------------------------------
  88. # 8. 查找第三方库
  89. # -----------------------------------------------------------------------------
  90. # 8.1 FreeType2 - 字体渲染库
  91. # 用途: 在图像上绘制中文字符
  92. pkg_check_modules(FREETYPE REQUIRED freetype2)
  93. # 8.2 SQLite3 - 轻量级数据库
  94. # 用途: 存储车牌识别记录
  95. pkg_check_modules(SQLITE3 REQUIRED sqlite3)
  96. # 8.3 cURL - HTTP 客户端库
  97. # 用途: 网络请求(如上传识别结果到服务器)
  98. find_package(CURL REQUIRED)
  99. # 8.4 OpenCV - 计算机视觉库(体积大户!)
  100. # 说明: 如果只需要核心模块,可以指定 COMPONENTS 减少依赖
  101. # 例如: find_package(OpenCV REQUIRED COMPONENTS core imgproc imgcodecs highgui)
  102. find_package(OpenCV REQUIRED)
  103. # 8.5 OpenSSL - 加密/SSL 库
  104. # 用途: HTTPS 请求、数据加密
  105. find_package(OpenSSL REQUIRED)
  106. # 8.6 FFmpeg - 视频解码库(v43新增)
  107. # 用途: RTSP流解码,HEVC DRM硬件解码,H.264软解
  108. pkg_check_modules(AVFORMAT REQUIRED libavformat)
  109. pkg_check_modules(AVCODEC REQUIRED libavcodec)
  110. pkg_check_modules(AVUTIL REQUIRED libavutil)
  111. pkg_check_modules(SWSCALE REQUIRED libswscale)
  112. # 8.7 libcrypt - 密码哈希库(fix24 auth系统新增)
  113. # 用途: bcrypt 密码哈希(通过系统 libcrypt 的 crypt_r)
  114. find_library(CRYPT_LIBRARY crypt
  115. PATHS
  116. /usr/lib
  117. /usr/lib/aarch64-linux-gnu
  118. /usr/lib/x86_64-linux-gnu
  119. /usr/local/lib
  120. DOC "libcrypt path"
  121. )
  122. if(NOT CRYPT_LIBRARY)
  123. message(WARNING "libcrypt not found, auth system will not work. Install libcrypt-dev.")
  124. else()
  125. message(STATUS "Found libcrypt: ${CRYPT_LIBRARY}")
  126. endif()
  127. # -----------------------------------------------------------------------------
  128. # 9. 查找 cJSON 库
  129. # 说明: cJSON 可能没有 .pc 文件,使用多种方式查找
  130. # -----------------------------------------------------------------------------
  131. # 方法1: 尝试使用 pkg-config 查找(某些系统可能安装了 cjson.pc)
  132. pkg_check_modules(CJSON cjson)
  133. if(CJSON_FOUND)
  134. # 使用 pkg-config 找到的结果
  135. message(STATUS "通过 pkg-config 找到 cJSON")
  136. set(CJSON_LIBRARY ${CJSON_LIBRARIES})
  137. set(CJSON_INCLUDE_DIR ${CJSON_INCLUDE_DIRS})
  138. else()
  139. # 方法2: 手动查找库文件
  140. message(STATUS "pkg-config 未找到 cJSON,尝试手动查找...")
  141. # 查找库文件(优先动态库)
  142. find_library(CJSON_LIBRARY
  143. NAMES cjson
  144. PATHS
  145. /usr/lib
  146. /usr/lib/aarch64-linux-gnu
  147. /usr/lib/x86_64-linux-gnu
  148. /usr/local/lib
  149. /opt/cjson/lib
  150. DOC "cJSON library path"
  151. )
  152. # 查找头文件
  153. find_path(CJSON_INCLUDE_DIR
  154. NAMES cJSON.h
  155. PATHS
  156. /usr/include
  157. /usr/include/cjson
  158. /usr/local/include
  159. /usr/local/include/cjson
  160. /opt/cjson/include
  161. DOC "cJSON header path"
  162. )
  163. endif()
  164. # 检查是否找到 cJSON
  165. if(NOT CJSON_LIBRARY)
  166. message(WARNING "未找到 cJSON 库,尝试使用默认路径...")
  167. # 尝试常见默认路径
  168. if(EXISTS "/usr/lib/aarch64-linux-gnu/libcjson.so")
  169. set(CJSON_LIBRARY "/usr/lib/aarch64-linux-gnu/libcjson.so")
  170. elseif(EXISTS "/usr/lib/x86_64-linux-gnu/libcjson.so")
  171. set(CJSON_LIBRARY "/usr/lib/x86_64-linux-gnu/libcjson.so")
  172. elseif(EXISTS "/usr/lib/libcjson.so")
  173. set(CJSON_LIBRARY "/usr/lib/libcjson.so")
  174. elseif(EXISTS "/usr/local/lib/libcjson.so")
  175. set(CJSON_LIBRARY "/usr/local/lib/libcjson.so")
  176. else()
  177. message(FATAL_ERROR "无法找到 cJSON 库!请安装: sudo apt install libcjson-dev")
  178. endif()
  179. endif()
  180. if(NOT CJSON_INCLUDE_DIR)
  181. # 如果找不到头文件目录,使用系统默认包含路径
  182. # 并假设头文件直接在 /usr/include 下
  183. if(EXISTS "/usr/include/cJSON.h")
  184. set(CJSON_INCLUDE_DIR "/usr/include")
  185. elseif(EXISTS "/usr/include/cjson/cJSON.h")
  186. set(CJSON_INCLUDE_DIR "/usr/include/cjson")
  187. else()
  188. message(WARNING "未找到 cJSON 头文件目录,使用系统默认路径")
  189. set(CJSON_INCLUDE_DIR "") # 空表示使用系统默认路径
  190. endif()
  191. endif()
  192. # 验证找到的文件
  193. message(STATUS "cJSON 库路径: ${CJSON_LIBRARY}")
  194. message(STATUS "cJSON 头文件路径: ${CJSON_INCLUDE_DIR}")
  195. if(NOT EXISTS ${CJSON_LIBRARY})
  196. message(FATAL_ERROR "cJSON 库文件不存在: ${CJSON_LIBRARY}")
  197. endif()
  198. # -----------------------------------------------------------------------------
  199. # 10. HyperLPR3 SDK 设置
  200. # 说明: 车牌识别核心库,可能包含大型模型数据
  201. # -----------------------------------------------------------------------------
  202. set(HYPERLPR3_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/hyperlpr3")
  203. set(HYPERLPR3_INCLUDE_DIR "${HYPERLPR3_ROOT}/include")
  204. set(HYPERLPR3_LIB_DIR "${HYPERLPR3_ROOT}/lib")
  205. # 检查 SDK 是否存在
  206. if(NOT EXISTS ${HYPERLPR3_INCLUDE_DIR})
  207. message(FATAL_ERROR "HyperLPR3 SDK 头文件目录不存在: ${HYPERLPR3_INCLUDE_DIR}")
  208. endif()
  209. if(NOT EXISTS ${HYPERLPR3_LIB_DIR})
  210. message(FATAL_ERROR "HyperLPR3 SDK 库目录不存在: ${HYPERLPR3_LIB_DIR}")
  211. endif()
  212. # 添加 SDK 库目录到链接器搜索路径
  213. link_directories(${HYPERLPR3_LIB_DIR})
  214. # -----------------------------------------------------------------------------
  215. # 11. 包含目录设置
  216. # 说明: 使用 target_include_directories 替代全局 include_directories(现代 CMake 推荐)
  217. # -----------------------------------------------------------------------------
  218. # 源文件列表
  219. set(SOURCES
  220. ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp
  221. ${CMAKE_CURRENT_SOURCE_DIR}/src/common.cpp
  222. ${CMAKE_CURRENT_SOURCE_DIR}/src/config.cpp
  223. ${CMAKE_CURRENT_SOURCE_DIR}/src/rtsp_capture.cpp
  224. ${CMAKE_CURRENT_SOURCE_DIR}/src/plate_recognizer.cpp
  225. ${CMAKE_CURRENT_SOURCE_DIR}/src/station_lock.cpp
  226. ${CMAKE_CURRENT_SOURCE_DIR}/src/database.cpp
  227. ${CMAKE_CURRENT_SOURCE_DIR}/src/network_client.cpp
  228. ${CMAKE_CURRENT_SOURCE_DIR}/src/feishu_client.cpp
  229. ${CMAKE_CURRENT_SOURCE_DIR}/src/web_server.cpp
  230. ${CMAKE_CURRENT_SOURCE_DIR}/src/monitor.cpp
  231. ${CMAKE_CURRENT_SOURCE_DIR}/src/utils.cpp
  232. ${CMAKE_CURRENT_SOURCE_DIR}/src/weight_scale.cpp
  233. ${CMAKE_CURRENT_SOURCE_DIR}/src/weight_dispatcher.cpp
  234. ${CMAKE_CURRENT_SOURCE_DIR}/src/mqtt_client.cpp
  235. # ✅ fix24 功能一:登录认证系统
  236. ${CMAKE_CURRENT_SOURCE_DIR}/src/bcrypt/bcrypt.c
  237. ${CMAKE_CURRENT_SOURCE_DIR}/src/auth_crypto.cpp
  238. ${CMAKE_CURRENT_SOURCE_DIR}/src/auth_db.cpp
  239. ${CMAKE_CURRENT_SOURCE_DIR}/src/auth_session.cpp
  240. ${CMAKE_CURRENT_SOURCE_DIR}/src/auth_middleware.cpp
  241. ${CMAKE_CURRENT_SOURCE_DIR}/src/auth_api.cpp
  242. # fix24 v24: Web管理功能
  243. ${CMAKE_CURRENT_SOURCE_DIR}/src/system_monitor.cpp
  244. ${CMAKE_CURRENT_SOURCE_DIR}/src/frpc_manager.cpp
  245. ${CMAKE_CURRENT_SOURCE_DIR}/src/ssh_manager.cpp
  246. ${CMAKE_CURRENT_SOURCE_DIR}/src/log_manager.cpp
  247. ${CMAKE_CURRENT_SOURCE_DIR}/src/system_metrics_manager.cpp
  248. ${CMAKE_CURRENT_SOURCE_DIR}/third_party/cvxFont.cpp
  249. ${CMAKE_CURRENT_SOURCE_DIR}/third_party/md5ex1.c
  250. ${CMAKE_CURRENT_SOURCE_DIR}/third_party/ini.c
  251. )
  252. # 创建可执行文件
  253. add_executable(PlateRecApp ${SOURCES})
  254. # 为目标设置包含目录(PRIVATE 表示仅本目标使用)
  255. set(INCLUDE_DIRS
  256. ${PROJECT_SOURCE_DIR}/src # 模块头文件
  257. ${PROJECT_SOURCE_DIR}/third_party # 第三方头文件
  258. ${PROJECT_SOURCE_DIR} # 项目根目录
  259. ${HYPERLPR3_INCLUDE_DIR} # HyperLPR3 SDK 头文件
  260. ${OpenCV_INCLUDE_DIRS} # OpenCV 头文件
  261. ${FREETYPE_INCLUDE_DIRS} # FreeType 头文件
  262. ${SQLITE3_INCLUDE_DIRS} # SQLite3 头文件
  263. ${AVFORMAT_INCLUDE_DIRS} # FFmpeg libavformat 头文件(v43新增)
  264. ${AVCODEC_INCLUDE_DIRS} # FFmpeg libavcodec 头文件(v43新增)
  265. ${AVUTIL_INCLUDE_DIRS} # FFmpeg libavutil 头文件(v43新增)
  266. ${SWSCALE_INCLUDE_DIRS} # FFmpeg libswscale 头文件(v43新增)
  267. )
  268. # 只有当找到有效的 cJSON 头文件目录时才添加
  269. if(CJSON_INCLUDE_DIR AND NOT CJSON_INCLUDE_DIR STREQUAL "")
  270. list(APPEND INCLUDE_DIRS ${CJSON_INCLUDE_DIR})
  271. endif()
  272. target_include_directories(PlateRecApp PRIVATE ${INCLUDE_DIRS})
  273. # -----------------------------------------------------------------------------
  274. # 12. 链接库设置
  275. # 说明: 链接顺序很重要!被依赖的库放在后面
  276. # 顺序原则: 目标 <- 直接依赖 <- 间接依赖 <- 系统库
  277. # -----------------------------------------------------------------------------
  278. target_link_libraries(PlateRecApp PRIVATE
  279. # 1. HyperLPR3 SDK(车牌识别核心,可能包含模型数据)
  280. hyperlpr3
  281. # 2. 数据库和配置库
  282. ${SQLITE3_LIBRARIES} # SQLite3
  283. # 3. 图像/字体处理库
  284. ${FREETYPE_LIBRARIES} # FreeType2(字体渲染)
  285. ${OpenCV_LIBS} # OpenCV(计算机视觉,体积较大)
  286. # 4. 网络/加密库
  287. CURL::libcurl # cURL(HTTP 客户端)
  288. ${OPENSSL_LIBRARIES} # OpenSSL(加密/HTTPS)
  289. mosquittopp # MQTT C++客户端(fix20新增)
  290. mosquitto # MQTT C库(fix20新增)
  291. ${CRYPT_LIBRARY} # libcrypt(密码哈希,fix24 auth系统新增)
  292. # 5. 数据格式库
  293. ${CJSON_LIBRARY} # cJSON(JSON 解析)
  294. # 6. FFmpeg 视频解码库(v43新增)
  295. ${AVFORMAT_LIBRARIES} # libavformat(容器解封装)
  296. ${AVCODEC_LIBRARIES} # libavcodec(视频解码,含DRM硬解)
  297. ${AVUTIL_LIBRARIES} # libavutil(工具函数)
  298. ${SWSCALE_LIBRARIES} # libswscale(像素格式转换)
  299. # 7. 系统线程库(通常自动链接,显式指定更安全)
  300. pthread
  301. # 8. 数学库(某些平台需要)
  302. m
  303. # 9. 实时库(某些平台需要)
  304. rt
  305. )
  306. # -----------------------------------------------------------------------------
  307. # 13. 链接选项设置(体积优化)
  308. # -----------------------------------------------------------------------------
  309. if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
  310. # --as-needed: 只链接实际使用的符号(避免过度链接)
  311. # --gc-sections: 删除未使用的段
  312. # -O1: 链接时优化级别
  313. target_link_options(PlateRecApp PRIVATE
  314. "LINKER:--as-needed"
  315. "LINKER:--gc-sections"
  316. )
  317. endif()
  318. # -----------------------------------------------------------------------------
  319. # 14. 编译后处理(Release 模式)
  320. # 说明: 使用 strip 去除符号表,进一步减小体积
  321. # -----------------------------------------------------------------------------
  322. if(CMAKE_BUILD_TYPE STREQUAL "Release")
  323. add_custom_command(TARGET PlateRecApp POST_BUILD
  324. COMMAND ${CMAKE_STRIP} $<TARGET_FILE:PlateRecApp>
  325. COMMENT "去除符号表以减小程序体积..."
  326. )
  327. endif()
  328. # -----------------------------------------------------------------------------
  329. # 15. 安装规则(可选)
  330. # 说明: 定义 make install 时的安装路径
  331. # -----------------------------------------------------------------------------
  332. install(TARGETS PlateRecApp
  333. RUNTIME DESTINATION bin # 可执行文件
  334. LIBRARY DESTINATION lib # 动态库
  335. ARCHIVE DESTINATION lib/static # 静态库
  336. )
  337. # -----------------------------------------------------------------------------
  338. # 16. 输出配置信息(便于调试)
  339. # -----------------------------------------------------------------------------
  340. message(STATUS "========================================")
  341. message(STATUS "项目配置信息:")
  342. message(STATUS " 项目名称: ${PROJECT_NAME}")
  343. message(STATUS " 项目版本: ${PROJECT_VERSION}")
  344. message(STATUS " C++ 标准: C++${CMAKE_CXX_STANDARD}")
  345. message(STATUS " 构建类型: ${CMAKE_BUILD_TYPE}")
  346. message(STATUS " 使用静态库: ${USE_STATIC_LIBS}")
  347. message(STATUS "----------------------------------------")
  348. message(STATUS "库路径信息:")
  349. message(STATUS " OpenCV: ${OpenCV_INCLUDE_DIRS}")
  350. message(STATUS " OpenCV 库: ${OpenCV_LIBS}")
  351. message(STATUS " HyperLPR3: ${HYPERLPR3_INCLUDE_DIR}")
  352. message(STATUS " cJSON 库: ${CJSON_LIBRARY}")
  353. message(STATUS " cJSON 头文件: ${CJSON_INCLUDE_DIR}")
  354. message(STATUS " libcrypt: ${CRYPT_LIBRARY}")
  355. message(STATUS "========================================")
  356. # -----------------------------------------------------------------------------
  357. # 17. 体积优化建议(构建时提示)
  358. # -----------------------------------------------------------------------------
  359. if(CMAKE_BUILD_TYPE STREQUAL "Release" AND NOT USE_STATIC_LIBS)
  360. message(STATUS "")
  361. message(STATUS "【体积优化提示】")
  362. message(STATUS " 1. 当前使用动态链接,确保目标机安装以下库:")
  363. message(STATUS " - OpenCV: libopencv-core, libopencv-imgproc, ...")
  364. message(STATUS " - OpenSSL: libssl, libcrypto")
  365. message(STATUS " - SQLite3: libsqlite3")
  366. message(STATUS " - cJSON: libcjson")
  367. message(STATUS " - FreeType2: libfreetype")
  368. message(STATUS " - cURL: libcurl")
  369. message(STATUS " - libcrypt: libcrypt (密码哈希)")
  370. message(STATUS "")
  371. message(STATUS " 2. 如需静态链接(独立运行但体积大):")
  372. message(STATUS " cmake -DUSE_STATIC_LIBS=ON ..")
  373. message(STATUS "")
  374. message(STATUS " 3. 如需进一步减小体积,启用 LTO:")
  375. message(STATUS " 取消注释第 56 行的 set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)")
  376. message(STATUS "")
  377. endif()