feat(hardening): 内嵌产品配置 + 系统级状态 + 全量 i18n + 依赖治理 + 资料清理
update-client-hardening 四工作流合入(构建/静态检查已过): - 配置:不可变产品策略经 UpdateClientResources.cmake 归一化校验后 内嵌 qrc(URL/相对路径/主程序必须落 install_root/版本/UUID 格式, CMake override 写入前复验);可变机器状态迁系统级原生存储; 运行目录不再落可编辑 app_config.json。 - i18n:生产源全英文(no-Han 检查 41/41),中文进 translations/ zh_CN 目录;翻译加载收敛 Common/TranslationHelper 唯一入口; Bootstrap 补资源文件。 - 依赖:Qt/OpenSSL/架构/Perl 机器路径改 imported targets + UpdateClientDependencies.cmake,3rdparty 由父工程契约供给。 - 清理:旧 README/SDK README/3 个重复 PowerShell 打包脚本/PDF 提取 文本删除,canonical README + 5 份结构化英文文档替代;Launcher requireAdministrator manifest;统一 MSVC /utf-8 删运行时编码设置。
This commit is contained in:
+119
-56
@@ -1,70 +1,133 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
project(ClientAll LANGUAGES C CXX)
|
||||
|
||||
project(SimCAEUpdateClient LANGUAGES C CXX)
|
||||
|
||||
set(UPDATE_CLIENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
set(UPDATE_CLIENT_IS_STANDALONE OFF)
|
||||
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||
set(UPDATE_CLIENT_IS_STANDALONE ON)
|
||||
endif()
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
if(MSVC)
|
||||
add_compile_options(/utf-8)
|
||||
endif()
|
||||
# Qt全局配置
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
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 运行库
|
||||
|
||||
if(MSVC)
|
||||
add_compile_options(/utf-8)
|
||||
endif()
|
||||
|
||||
cmake_path(
|
||||
ABSOLUTE_PATH UPDATE_CLIENT_SOURCE_DIR
|
||||
BASE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.."
|
||||
NORMALIZE
|
||||
OUTPUT_VARIABLE _update_client_source_root
|
||||
)
|
||||
cmake_path(GET _update_client_source_root PARENT_PATH _update_client_parent_root)
|
||||
set(
|
||||
UPDATE_CLIENT_THIRDPARTY_ROOT
|
||||
"${_update_client_parent_root}/3rdparty"
|
||||
CACHE PATH
|
||||
"Root directory for update-client third-party packages"
|
||||
)
|
||||
option(
|
||||
UPDATE_CLIENT_STRICT_THIRDPARTY
|
||||
"Require OpenSSL imported library and include paths to stay under the third-party root"
|
||||
ON
|
||||
)
|
||||
set(
|
||||
UPDATE_CLIENT_PRODUCT_CONFIG_FILE
|
||||
""
|
||||
CACHE FILEPATH
|
||||
"Exact product config to embed; empty selects config/config.json then the example"
|
||||
)
|
||||
set(
|
||||
UPDATE_CLIENT_LAUNCH_TOKEN
|
||||
""
|
||||
CACHE STRING
|
||||
"Optional build-provided launch ticket token override"
|
||||
)
|
||||
mark_as_advanced(UPDATE_CLIENT_LAUNCH_TOKEN)
|
||||
set(UPDATE_CLIENT_MAIN_EXECUTABLE "" CACHE STRING "Override main_executable in embedded config")
|
||||
set(UPDATE_CLIENT_LAUNCHER_EXECUTABLE "" CACHE STRING "Override launcher_executable in embedded config")
|
||||
set(UPDATE_CLIENT_UPDATER_EXECUTABLE "" CACHE STRING "Override updater_executable in embedded config")
|
||||
set(UPDATE_CLIENT_BOOTSTRAP_EXECUTABLE "" CACHE STRING "Override bootstrap_executable in embedded config")
|
||||
set(UPDATE_CLIENT_PLATFORM "" CACHE STRING "Override platform in embedded config")
|
||||
set(UPDATE_CLIENT_ARCH "" CACHE STRING "Override arch in embedded config")
|
||||
|
||||
if(WIN32)
|
||||
set(_update_client_deploy_qt_default ON)
|
||||
else()
|
||||
set(_update_client_deploy_qt_default OFF)
|
||||
endif()
|
||||
option(
|
||||
UPDATE_CLIENT_DEPLOY_QT_RUNTIME
|
||||
"Run the Qt deployment tool after building each Qt executable"
|
||||
${_update_client_deploy_qt_default}
|
||||
)
|
||||
option(
|
||||
UPDATE_CLIENT_REQUIRE_TRANSLATIONS
|
||||
"Fail configuration when translations/update-client_zh_CN.ts is absent"
|
||||
OFF
|
||||
)
|
||||
option(
|
||||
UPDATE_CLIENT_INSTALL_RUNTIME_ASSETS
|
||||
"Install update-client runtime assets from this project"
|
||||
${UPDATE_CLIENT_IS_STANDALONE}
|
||||
)
|
||||
|
||||
list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
||||
include(UpdateClientDependencies)
|
||||
include(UpdateClientResources)
|
||||
|
||||
update_client_find_dependencies()
|
||||
update_client_select_product_config(_update_client_product_config_source)
|
||||
update_client_generate_normalized_product_config(
|
||||
_update_client_product_config
|
||||
"${_update_client_product_config_source}"
|
||||
)
|
||||
update_client_create_embedded_resources(
|
||||
UpdateClientEmbeddedResources
|
||||
"${_update_client_product_config}"
|
||||
)
|
||||
|
||||
add_custom_target(UpdateClientNoHanCheck ALL
|
||||
COMMAND "${CMAKE_COMMAND}"
|
||||
"-DUPDATE_CLIENT_SCAN_ROOT=${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
-P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/CheckNoHan.cmake"
|
||||
COMMENT "Checking update-client production sources for Han characters"
|
||||
VERBATIM
|
||||
)
|
||||
add_dependencies(UpdateClientEmbeddedResources UpdateClientNoHanCheck)
|
||||
|
||||
if(UPDATE_CLIENT_IS_STANDALONE)
|
||||
if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
|
||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/out/lib")
|
||||
endif()
|
||||
if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
|
||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/out/bin")
|
||||
endif()
|
||||
if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/out/bin")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
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()
|
||||
|
||||
foreach(_update_client_primary_target IN ITEMS
|
||||
Bootstrap Common Launcher Updater MainApp)
|
||||
add_dependencies("${_update_client_primary_target}" UpdateClientNoHanCheck)
|
||||
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)
|
||||
|
||||
set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" PROPERTY VS_STARTUP_PROJECT Launcher)
|
||||
|
||||
if(UPDATE_CLIENT_INSTALL_RUNTIME_ASSETS)
|
||||
update_client_install_openssl_runtime(bin)
|
||||
endif()
|
||||
if(EXISTS ${MANIFEST_PUBLIC_KEY_FILE})
|
||||
install(FILES ${MANIFEST_PUBLIC_KEY_FILE} DESTINATION bin)
|
||||
endif()
|
||||
Reference in New Issue
Block a user