cmake_minimum_required(VERSION 3.20) project(ClientAll LANGUAGES C CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(MSVC) add_compile_options(/utf-8) endif() # Qt全局配置 set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) set(CMAKE_PREFIX_PATH "C:\\Qt\\5.15.2\\msvc2019_64" ${CMAKE_PREFIX_PATH}) find_package(Qt5 REQUIRED COMPONENTS Core Network Gui Widgets) # ========== OpenSSL 手动配置(完全抛弃find_package) ========== set(OPENSSL_ROOT_DIR "C:/Program Files/OpenSSL-Win64") set(OPENSSL_INC "${OPENSSL_ROOT_DIR}/include") set(OPENSSL_LIB_DEBUG "${OPENSSL_ROOT_DIR}/lib/VC/x64/MDd") set(OPENSSL_LIB_RELEASE "${OPENSSL_ROOT_DIR}/lib/VC/x64/MD") # 全局宏,所有子项目统一启用OpenSSL add_compile_definitions(HAVE_OPENSSL=1) # ========================================================== # 统一输出目录 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/bin) # Bootstrap 不依赖 Qt,可在 Updater 退出后替换 Updater 与 Qt 运行库 add_subdirectory(Bootstrap) # 先编译公共库 add_subdirectory(Common) # 再编译三个业务程序 add_subdirectory(Launcher) add_subdirectory(Updater) add_subdirectory(MainApp) # 默认启动项目 set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT Launcher) # Copy client.ini and config directory to output bin folder set(APP_CONFIG_SOURCE_FILE "${CMAKE_SOURCE_DIR}/config/app_config.example.json") set(CONFIG_SOURCE_DIR "${CMAKE_SOURCE_DIR}/config") set(MANIFEST_PUBLIC_KEY_FILE "${CONFIG_SOURCE_DIR}/manifest_public_key.pem") set(INI_TARGET_FOLDER "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") # app_config.json 包含运行时版本状态;如果存在旧 client.ini,则交给客户端首次启动迁移 file(MAKE_DIRECTORY "${INI_TARGET_FOLDER}") file(MAKE_DIRECTORY "${INI_TARGET_FOLDER}/config") if(NOT EXISTS "${INI_TARGET_FOLDER}/config/app_config.json" AND NOT EXISTS "${INI_TARGET_FOLDER}/client.ini") configure_file("${APP_CONFIG_SOURCE_FILE}" "${INI_TARGET_FOLDER}/config/app_config.json" COPYONLY) endif() foreach(RUNTIME_RESOURCE local_state.json version_policy.dat) if(NOT EXISTS "${INI_TARGET_FOLDER}/config/${RUNTIME_RESOURCE}") configure_file("${CONFIG_SOURCE_DIR}/${RUNTIME_RESOURCE}" "${INI_TARGET_FOLDER}/config/${RUNTIME_RESOURCE}" COPYONLY) endif() endforeach() # 编译阶段同步静态配置资源 add_custom_target(copy_client_resources ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${INI_TARGET_FOLDER} COMMAND ${CMAKE_COMMAND} -E make_directory ${INI_TARGET_FOLDER}/config COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MANIFEST_PUBLIC_KEY_FILE} ${INI_TARGET_FOLDER}/config/manifest_public_key.pem COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MANIFEST_PUBLIC_KEY_FILE} ${INI_TARGET_FOLDER}/manifest_public_key.pem COMMENT "Copy client config directory and manifest public key to output bin folder" ) add_dependencies(Launcher copy_client_resources) add_dependencies(Updater copy_client_resources) add_dependencies(MainApp copy_client_resources) # Install rules for packaging if(EXISTS ${CONFIG_SOURCE_DIR}) install(DIRECTORY ${CONFIG_SOURCE_DIR} DESTINATION bin/config) endif() if(EXISTS ${MANIFEST_PUBLIC_KEY_FILE}) install(FILES ${MANIFEST_PUBLIC_KEY_FILE} DESTINATION bin) endif()