diff --git a/0_cmake_library/cmake_library/test/domain/library/library_test.cmake b/0_cmake_library/cmake_library/test/domain/library/library_test.cmake index b551fc6..26d1456 100644 --- a/0_cmake_library/cmake_library/test/domain/library/library_test.cmake +++ b/0_cmake_library/cmake_library/test/domain/library/library_test.cmake @@ -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 diff --git a/0_cmake_library/register_libaray/rcl_register_ex.cmake b/0_cmake_library/register_libaray/rcl_register_ex.cmake index 098a1b5..152187d 100644 --- a/0_cmake_library/register_libaray/rcl_register_ex.cmake +++ b/0_cmake_library/register_libaray/rcl_register_ex.cmake @@ -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 是已经初始化并完成注册的命名空间。 +# 返回: 无。 +# 设计契约: +# 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 是脚本根目录。 @@ -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)