完美一版

This commit is contained in:
2026-08-23 00:22:27 +08:00
parent 4f0908e8d8
commit 800123d05d
2 changed files with 29 additions and 0 deletions
@@ -440,6 +440,18 @@ rcl_get_effective_install_dir(library_test_rcl_full_name::core _rcl_full_name_in
test_assert_strequal("${_rcl_full_name_install_dir}" "${TEST_OUTPUT_DIR}/rcl_full_name/install/core")
library_get(library_test_rcl_full_name library_test_rcl_full_name::core INIT_SCRIPT_CONTENT _rcl_full_name_init_script)
test_assert_strequal("${_rcl_full_name_init_script}" "set(LIBRARY_TEST_RCL_CORE TRUE)")
rcl_export_configuration(library_test_rcl_full_name)
library_get_effective_data_export_dir(library_test_rcl_full_name _rcl_full_name_data_dir)
set(_rcl_full_name_map_file "${_rcl_full_name_data_dir}/registry/nodes/library_test_rcl_full_name/core/map.txt")
map_deserialize_file(_rcl_full_name_disk_map "${_rcl_full_name_map_file}")
map_get(_rcl_full_name_disk_map GIT_BRANCH _rcl_full_name_disk_branch)
test_assert_strequal("${_rcl_full_name_disk_branch}" "main")
library_set(library_test_rcl_full_name library_test_rcl_full_name::core GIT_BRANCH updated)
rcl_export_configuration(library_test_rcl_full_name)
map_deserialize_file(_rcl_full_name_refreshed_map "${_rcl_full_name_map_file}")
map_get(_rcl_full_name_refreshed_map GIT_BRANCH _rcl_full_name_refreshed_branch)
# 旧 map.txt 已存在时仍必须覆盖;此断言防止重新引入 EXISTS/时间戳短路。
test_assert_strequal("${_rcl_full_name_refreshed_branch}" "updated")
library_create(library_test_auto_register "${TEST_OUTPUT_DIR}/auto_register")
set(_target_loader_script "${TEST_OUTPUT_DIR}/target_loader.sh")
file(WRITE "${_target_loader_script}" [=[#!/usr/bin/env bash
@@ -159,6 +159,21 @@ function(rcl_get_data_export_dir namespace_name output_variable)
library_get_effective_data_export_dir("${namespace_name}" _data_export_dir)
set(${output_variable} "${_data_export_dir}" PARENT_SCOPE)
endfunction()
# API: rcl_export_configuration(<namespace_name>)
# 作用: 将命名空间当前注册配置完整刷新到磁盘,供后续动作目标加载。
# 参数: namespace_name 是已经初始化并完成注册的命名空间。
# 返回: 无。
# 设计契约:
# 1. 当前 configure 过程中,内存 registry 是配置编辑态的唯一权威来源。
# 2. namespace 的全部注册和属性设置完成后调用本函数;随后才能创建动作目标。
# 3. 每次 configure 都必须无条件覆盖磁盘快照。禁止用 EXISTS、时间戳或旧 map.txt 跳过刷新,
# 否则 CMakeLists 中修改过的版本、选项、依赖和初始化脚本不会进入本轮动作目标。
# 4. library_export_dir 负责整批导出,禁止逐文件修补 registry,避免产生不同步的状态源。
function(rcl_export_configuration namespace_name)
rcl_get_data_export_dir("${namespace_name}" _namespace_data_dir)
library_cache_operations("${namespace_name}" _operations)
library_export_dir("${namespace_name}" "${_namespace_data_dir}")
endfunction()
# API: rcl_set_script_root(<namespace_name> <script_root>)
# 作用: 设置命名空间脚本根目录。
# 参数: namespace_name 是命名空间;script_root 是脚本根目录。
@@ -387,6 +402,8 @@ endfunction()
# 作用: 从磁盘读取一个库的自包含配置,不导出 namespace,也不写文件。
# 参数: library_name 使用 namespace::id;两个输出参数分别接收临时 map ID 和配置记录的数据目录。
# 返回: 通过 PARENT_SCOPE 返回输出;单库配置文件不存在时终止配置。
# 设计契约: 本函数只读取由 rcl_export_configuration 在本轮 configure 中刷新的快照;
# 禁止在这里从旧文件恢复、按缺失补写或回退到内存 registry。
function(__rcl_read_library_map library_name map_output data_dir_output)
__rcl_split_library_name("${library_name}" _namespace_name _library_id)
rcl_get_data_export_dir("${_namespace_name}" _namespace_data_dir)