@@ -27,10 +27,26 @@ function(_nam_validate_file_link_mode MODE_VALUE OUT_VAR)
2727endfunction ()
2828
2929function (_nam_detect_file_link_mode OUT_VAR )
30- set (_probe_root "${CMAKE_CURRENT_BINARY_DIR} /.nam_probe" )
31- file (MAKE_DIRECTORY "${_probe_root} " )
32- set (_src "${_probe_root} /src.txt" )
33- set (_dst "${_probe_root} /dst.txt" )
30+ set (options)
31+ set (oneValueArgs SOURCE_ROOT DESTINATION_ROOT)
32+ cmake_parse_arguments (NAM "${options} " "${oneValueArgs} " "" ${ARGN} )
33+
34+ if (DEFINED NAM_SOURCE_ROOT AND NOT "${NAM_SOURCE_ROOT} " STREQUAL "" )
35+ set (_source_root "${NAM_SOURCE_ROOT} " )
36+ else ()
37+ set (_source_root "${CMAKE_CURRENT_BINARY_DIR} " )
38+ endif ()
39+
40+ if (DEFINED NAM_DESTINATION_ROOT AND NOT "${NAM_DESTINATION_ROOT} " STREQUAL "" )
41+ set (_destination_root "${NAM_DESTINATION_ROOT} " )
42+ else ()
43+ set (_destination_root "${CMAKE_CURRENT_BINARY_DIR} " )
44+ endif ()
45+
46+ file (MAKE_DIRECTORY "${_source_root} " "${_destination_root} " )
47+ string (RANDOM LENGTH 12 ALPHABET "0123456789abcdef" _probe_id)
48+ set (_src "${_source_root} /.nam_probe_${_probe_id} _src.txt" )
49+ set (_dst "${_destination_root} /.nam_probe_${_probe_id} _dst.txt" )
3450 file (WRITE "${_src} " "probe\n " )
3551 file (REMOVE "${_dst} " )
3652
@@ -67,13 +83,21 @@ function(_nam_detect_file_link_mode OUT_VAR)
6783endfunction ()
6884
6985function (_nam_resolve_file_link_mode OUT_VAR )
86+ set (options)
87+ set (oneValueArgs SOURCE_ROOT DESTINATION_ROOT)
88+ cmake_parse_arguments (NAM "${options} " "${oneValueArgs} " "" ${ARGN} )
89+
7090 if (DEFINED NAM_INTERNAL_FORCE_FILE_LINK_MODE AND NOT "${NAM_INTERNAL_FORCE_FILE_LINK_MODE} " STREQUAL "" )
7191 _nam_validate_file_link_mode ("${NAM_INTERNAL_FORCE_FILE_LINK_MODE} " _forced_mode )
7292 set (${OUT_VAR} "${_forced_mode} " PARENT_SCOPE )
7393 return ()
7494 endif ()
7595
76- _nam_detect_file_link_mode (_detected_mode )
96+ _nam_detect_file_link_mode (
97+ _detected_mode
98+ SOURCE_ROOT "${NAM_SOURCE_ROOT} "
99+ DESTINATION_ROOT "${NAM_DESTINATION_ROOT} "
100+ )
77101 set (${OUT_VAR} "${_detected_mode} " PARENT_SCOPE )
78102endfunction ()
79103
@@ -428,7 +452,13 @@ function(nam_add_channel_target)
428452 set (ExternalData_URL_TEMPLATES "ExternalDataCustomScript://NAM/%(hash)" )
429453 set (ExternalData_CUSTOM_SCRIPT_NAM "${_fetch_script} " )
430454 add_custom_target ("${NAM_TARGET} " )
431- _nam_resolve_file_link_mode (_file_link_mode )
455+ set (_refs_root "${_build_root} /refs" )
456+ set (_externaldata_binary_root "${_build_root} /assets" )
457+ _nam_resolve_file_link_mode (
458+ _file_link_mode
459+ SOURCE_ROOT "${_externaldata_binary_root} "
460+ DESTINATION_ROOT "${NAM_DESTINATION_ROOT} /${NAM_CHANNEL} "
461+ )
432462 if (NAM_NO_SYMLINKS)
433463 set (_file_link_mode "copy" )
434464 endif ()
@@ -454,17 +484,18 @@ function(nam_add_channel_target)
454484 )
455485
456486 set (_data_name "${NAM_CHANNEL} /${_relative_path} " )
457- get_filename_component (_link_dir "${CMAKE_CURRENT_SOURCE_DIR} /${_data_name} " DIRECTORY )
487+ set (_data_ref "${_refs_root} /${_data_name} " )
488+ get_filename_component (_link_dir "${_data_ref} " DIRECTORY )
458489 file (MAKE_DIRECTORY "${_link_dir} " )
459- file (WRITE "${CMAKE_CURRENT_SOURCE_DIR} / ${_data_name } .sha256" "${_sha256} \n " )
460- list (APPEND _asset_refs "DATA{${_data_name } }" )
490+ file (WRITE "${_data_ref } .sha256" "${_sha256} \n " )
491+ list (APPEND _asset_refs "DATA{${_data_ref } }" )
461492 list (APPEND _asset_relpaths "${_relative_path} " )
462493 endforeach ()
463494
464495 if (_asset_refs)
465496 set (_asset_target "${NAM_TARGET} __externaldata" )
466- set (ExternalData_SOURCE_ROOT "${CMAKE_CURRENT_SOURCE_DIR } " )
467- set (ExternalData_BINARY_ROOT "${_build_root} /assets " )
497+ set (ExternalData_SOURCE_ROOT "${_refs_root } " )
498+ set (ExternalData_BINARY_ROOT "${_externaldata_binary_root} " )
468499 unset (ExternalData_NO_SYMLINKS)
469500 set (_old_suppress_dev "${CMAKE_SUPPRESS_DEVELOPER_WARNINGS} " )
470501 set (CMAKE_SUPPRESS_DEVELOPER_WARNINGS 1)
0 commit comments