55# - `.dvc` files produced by `dvc add`
66#
77# Consumer-side behavior:
8- # - pure public `ExternalData` API
8+ # - ExternalData-compatible public API surface
99# - no hand-maintained asset catalog
1010
1111include_guard (GLOBAL )
1212
13+ if (NOT DEFINED NAM_USE_VENDORED_EXTERNALDATA)
14+ set (
15+ NAM_USE_VENDORED_EXTERNALDATA
16+ ON
17+ CACHE BOOL
18+ "Use the vendored ExternalData module bundled with NAM instead of the stock host module"
19+ )
20+ endif ()
21+ mark_as_advanced (NAM_USE_VENDORED_EXTERNALDATA )
22+
1323function (_nam_summary MESSAGE_TEXT )
1424 message (STATUS "NablaAssetManifests: ${MESSAGE_TEXT} " )
1525endfunction ()
1626
27+ function (_nam_include_externaldata OUT_VAR )
28+ if (NAM_USE_VENDORED_EXTERNALDATA)
29+ include ("${CMAKE_CURRENT_FUNCTION_LIST_DIR} /vendor/ExternalData-NAM.cmake" )
30+ set (_provider "vendored" )
31+ else ()
32+ include (ExternalData )
33+ set (_provider "stock" )
34+ endif ()
35+ set (${OUT_VAR} "${_provider} " PARENT_SCOPE )
36+ endfunction ()
37+
1738function (_nam_validate_file_link_mode MODE_VALUE OUT_VAR )
1839 string (TOLOWER "${MODE_VALUE} " _mode)
1940 if (
@@ -438,7 +459,8 @@ function(nam_add_channel_target)
438459 list (LENGTH _items _item_count)
439460 _nam_get_backend_kind (_backend_kind )
440461 _nam_resolve_cache_root (_cache_root CACHE_ROOT "${NAM_CACHE_ROOT} " )
441- _nam_summary ("configure channel target `${NAM_TARGET} `: channel=`${NAM_CHANNEL} `, repo=`${NAM_REPO} `, tag=`${NAM_TAG} `, backend=`${_backend_kind} `, cache_root=`${_cache_root} `, total=${_item_count} " )
462+ _nam_include_externaldata (_externaldata_provider )
463+ _nam_summary ("configure channel target `${NAM_TARGET} `: channel=`${NAM_CHANNEL} `, repo=`${NAM_REPO} `, tag=`${NAM_TAG} `, backend=`${_backend_kind} `, externaldata=`${_externaldata_provider} `, cache_root=`${_cache_root} `, total=${_item_count} " )
442464
443465 _nam_get_github_release_index_file (_index_file REPO "${NAM_REPO} " TAG "${NAM_TAG} " CACHE_ROOT "${NAM_CACHE_ROOT} " )
444466
@@ -447,16 +469,20 @@ function(nam_add_channel_target)
447469 file (MAKE_DIRECTORY "${_build_root} " )
448470 file (WRITE "${_fetch_script} " "set(CMAKE_MESSAGE_LOG_LEVEL NOTICE)\n set(NAM_RELEASE_INDEX_FILE [=[${_index_file} ]=])\n include([=[${CMAKE_CURRENT_FUNCTION_LIST_DIR} /NablaAssetManifestsExternalDataFetch.cmake]=])\n " )
449471
450- include (ExternalData )
451472 set (ExternalData_OBJECT_STORES "${_cache_root} /objects" )
452473 set (ExternalData_URL_TEMPLATES "ExternalDataCustomScript://NAM/%(hash)" )
453474 set (ExternalData_CUSTOM_SCRIPT_NAM "${_fetch_script} " )
454475 add_custom_target ("${NAM_TARGET} " )
455476 set (_refs_root "${_build_root} /refs" )
456477 set (_externaldata_binary_root "${_build_root} /assets" )
478+ if (_externaldata_provider STREQUAL "vendored" )
479+ set (_materialization_source_root "${_cache_root} /objects/SHA256" )
480+ else ()
481+ set (_materialization_source_root "${_externaldata_binary_root} " )
482+ endif ()
457483 _nam_resolve_file_link_mode (
458484 _file_link_mode
459- SOURCE_ROOT "${_externaldata_binary_root } "
485+ SOURCE_ROOT "${_materialization_source_root } "
460486 DESTINATION_ROOT "${NAM_DESTINATION_ROOT} /${NAM_CHANNEL} "
461487 )
462488 if (NAM_NO_SYMLINKS)
@@ -465,7 +491,9 @@ function(nam_add_channel_target)
465491 _nam_summary ("materialization mode for file assets: `${_file_link_mode} `" )
466492
467493 set (_asset_refs)
494+ set (_asset_data_refs)
468495 set (_asset_relpaths)
496+ set (_asset_target_paths)
469497 foreach (_asset IN LISTS _items)
470498 _nam_find_channel_asset (
471499 CHANNEL "${NAM_CHANNEL} "
@@ -485,53 +513,101 @@ function(nam_add_channel_target)
485513
486514 set (_data_name "${NAM_CHANNEL} /${_relative_path} " )
487515 set (_data_ref "${_refs_root} /${_data_name} " )
516+ set (_target_path "${NAM_DESTINATION_ROOT} /${_data_name} " )
488517 get_filename_component (_link_dir "${_data_ref} " DIRECTORY )
489518 file (MAKE_DIRECTORY "${_link_dir} " )
490519 file (WRITE "${_data_ref} .sha256" "${_sha256} \n " )
491520 list (APPEND _asset_refs "DATA{${_data_ref} }" )
521+ list (APPEND _asset_data_refs "${_data_ref} " )
492522 list (APPEND _asset_relpaths "${_relative_path} " )
523+ list (APPEND _asset_target_paths "${_target_path} " )
493524 endforeach ()
494525
495526 if (_asset_refs)
496- set (_asset_target "${NAM_TARGET} __externaldata" )
497- set (ExternalData_SOURCE_ROOT "${_refs_root} " )
498- set (ExternalData_BINARY_ROOT "${_externaldata_binary_root} " )
499- unset (ExternalData_NO_SYMLINKS)
500- set (_old_suppress_dev "${CMAKE_SUPPRESS_DEVELOPER_WARNINGS} " )
501- set (CMAKE_SUPPRESS_DEVELOPER_WARNINGS 1)
502- ExternalData_Expand_Arguments ("${_asset_target} " _asset_expanded ${_asset_refs} )
503- set (CMAKE_SUPPRESS_DEVELOPER_WARNINGS "${_old_suppress_dev} " )
504- ExternalData_Add_Target ("${_asset_target} " SHOW_PROGRESS "${NAM_SHOW_PROGRESS} " )
505- set (_externaldata_config "${CMAKE_CURRENT_BINARY_DIR} /${_asset_target} _config.cmake" )
506- if (EXISTS "${_externaldata_config} " )
527+ if (_externaldata_provider STREQUAL "vendored" )
528+ set (ExternalData_LINK_MODE "${_file_link_mode} " )
529+ set (ExternalData_TIMEOUT_INACTIVITY "" )
530+ set (ExternalData_TIMEOUT_ABSOLUTE "" )
531+ set (ExternalData_NO_SYMLINKS "" )
532+ string (CONCAT _ExternalData_CONFIG_CODE
533+ "set(ExternalData_CUSTOM_SCRIPT_NAM [=[${_fetch_script} ]=])" )
534+ set (_externaldata_config "${CMAKE_CURRENT_BINARY_DIR} /${NAM_TARGET} __externaldata_config.cmake" )
535+ configure_file (
536+ "${CMAKE_CURRENT_FUNCTION_LIST_DIR} /vendor/ExternalData_config.cmake.in"
537+ "${_externaldata_config} "
538+ @ONLY
539+ )
507540 if (NAM_VERBOSE)
508541 set (_externaldata_log_level "STATUS" )
509542 else ()
510543 set (_externaldata_log_level "NOTICE" )
511544 endif ()
512545 file (READ "${_externaldata_config} " _externaldata_config_contents )
513546 file (WRITE "${_externaldata_config} " "set(CMAKE_MESSAGE_LOG_LEVEL ${_externaldata_log_level} )\n ${_externaldata_config_contents} " )
547+
548+ list (LENGTH _asset_data_refs _asset_count)
549+ math (EXPR _asset_last "${_asset_count} - 1" )
550+ foreach (_index RANGE ${_asset_last} )
551+ list (GET _asset_data_refs ${_index} _data_ref)
552+ list (GET _asset_target_paths ${_index} _target_path)
553+ set (_stamp "${_build_root} /file_stamps/${_index} .stamp" )
554+ set (_hash_record "${_build_root} /hash_records/${_index} .txt" )
555+ get_filename_component (_stamp_dir "${_stamp} " DIRECTORY )
556+ get_filename_component (_hash_record_dir "${_hash_record} " DIRECTORY )
557+ file (MAKE_DIRECTORY "${_stamp_dir} " )
558+ file (MAKE_DIRECTORY "${_hash_record_dir} " )
559+ add_custom_command (
560+ OUTPUT "${_stamp} " "${_target_path} " "${_hash_record} "
561+ COMMAND "${CMAKE_COMMAND} " -Drelative_top=${CMAKE_BINARY_DIR} -Dfile=${_target_path} -Dname=${_data_ref} -Dexts=.sha256 -DExternalData_STAMP_FILE=${_hash_record} -DExternalData_ACTION=fetch -DExternalData_SHOW_PROGRESS=${NAM_SHOW_PROGRESS} -DExternalData_CONFIG=${_externaldata_config} -P "${CMAKE_CURRENT_FUNCTION_LIST_DIR} /vendor/ExternalData-NAM.cmake"
562+ COMMAND "${CMAKE_COMMAND} " -E touch "${_stamp} "
563+ MAIN_DEPENDENCY "${_data_ref} .sha256"
564+ DEPENDS "${_fetch_script} " "${_externaldata_config} "
565+ VERBATIM
566+ )
567+ list (APPEND _materialize_stamps "${_stamp} " )
568+ endforeach ()
569+ else ()
570+ set (_asset_target "${NAM_TARGET} __externaldata" )
571+ set (ExternalData_SOURCE_ROOT "${_refs_root} " )
572+ set (ExternalData_BINARY_ROOT "${_externaldata_binary_root} " )
573+ unset (ExternalData_LINK_MODE)
574+ unset (ExternalData_NO_SYMLINKS)
575+ set (_old_suppress_dev "${CMAKE_SUPPRESS_DEVELOPER_WARNINGS} " )
576+ set (CMAKE_SUPPRESS_DEVELOPER_WARNINGS 1)
577+ ExternalData_Expand_Arguments ("${_asset_target} " _asset_expanded ${_asset_refs} )
578+ set (CMAKE_SUPPRESS_DEVELOPER_WARNINGS "${_old_suppress_dev} " )
579+ ExternalData_Add_Target ("${_asset_target} " SHOW_PROGRESS "${NAM_SHOW_PROGRESS} " )
580+ set (_externaldata_config "${CMAKE_CURRENT_BINARY_DIR} /${_asset_target} _config.cmake" )
581+ if (EXISTS "${_externaldata_config} " )
582+ if (NAM_VERBOSE)
583+ set (_externaldata_log_level "STATUS" )
584+ else ()
585+ set (_externaldata_log_level "NOTICE" )
586+ endif ()
587+ file (READ "${_externaldata_config} " _externaldata_config_contents )
588+ file (WRITE "${_externaldata_config} " "set(CMAKE_MESSAGE_LOG_LEVEL ${_externaldata_log_level} )\n ${_externaldata_config_contents} " )
589+ endif ()
590+ add_dependencies ("${NAM_TARGET} " "${_asset_target} " )
591+
592+ list (LENGTH _asset_expanded _asset_expanded_count)
593+ math (EXPR _asset_last "${_asset_expanded_count} - 1" )
594+ foreach (_index RANGE ${_asset_last} )
595+ list (GET _asset_expanded ${_index} _expanded_path)
596+ set (_stamp "${_build_root} /file_stamps/${_index} .stamp" )
597+ get_filename_component (_stamp_dir "${_stamp} " DIRECTORY )
598+ file (MAKE_DIRECTORY "${_stamp_dir} " )
599+ list (GET _asset_relpaths ${_index} _relative_path)
600+ set (_target_path "${NAM_DESTINATION_ROOT} /${NAM_CHANNEL} /${_relative_path} " )
601+ add_custom_command (
602+ OUTPUT "${_stamp} "
603+ COMMAND "${CMAKE_COMMAND} " -DINPUT=${_expanded_path} -DDESTINATION=${_target_path} -DLINK_MODE=${_file_link_mode} -P "${CMAKE_CURRENT_FUNCTION_LIST_DIR} /NablaAssetManifestsMaterialize.cmake"
604+ COMMAND "${CMAKE_COMMAND} " -E touch "${_stamp} "
605+ DEPENDS "${_expanded_path} "
606+ VERBATIM
607+ )
608+ list (APPEND _materialize_stamps "${_stamp} " )
609+ endforeach ()
514610 endif ()
515- add_dependencies ("${NAM_TARGET} " "${_asset_target} " )
516-
517- list (LENGTH _asset_expanded _asset_expanded_count)
518- math (EXPR _asset_last "${_asset_expanded_count} - 1" )
519- foreach (_index RANGE ${_asset_last} )
520- list (GET _asset_expanded ${_index} _expanded_path)
521- list (GET _asset_relpaths ${_index} _relative_path)
522- set (_target_path "${NAM_DESTINATION_ROOT} /${NAM_CHANNEL} /${_relative_path} " )
523- set (_stamp "${_build_root} /file_stamps/${_index} .stamp" )
524- get_filename_component (_stamp_dir "${_stamp} " DIRECTORY )
525- file (MAKE_DIRECTORY "${_stamp_dir} " )
526- add_custom_command (
527- OUTPUT "${_stamp} "
528- COMMAND "${CMAKE_COMMAND} " -DINPUT=${_expanded_path} -DDESTINATION=${_target_path} -DLINK_MODE=${_file_link_mode} -P "${CMAKE_CURRENT_FUNCTION_LIST_DIR} /NablaAssetManifestsMaterialize.cmake"
529- COMMAND "${CMAKE_COMMAND} " -E touch "${_stamp} "
530- DEPENDS "${_expanded_path} "
531- VERBATIM
532- )
533- list (APPEND _materialize_stamps "${_stamp} " )
534- endforeach ()
535611 endif ()
536612
537613 if (_materialize_stamps)
0 commit comments