1 include("${CONFIG_FILE}")
2 set(prefix "COPYFILES: ")
5 if(IS_SYMLINK "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/symlink_test")
9 set(update_dephelper 0)
10 if(DEFINED DEPHELPER AND NOT EXISTS "${DEPHELPER}")
11 set(update_dephelper 1)
16 macro(copy_file_ src dst prefix)
17 string(REPLACE "${CMAKE_BINARY_DIR}/" "" dst_name "${dst}")
19 if(NOT EXISTS "${dst}")
23 if(local_update OR NOT IS_SYMLINK "${dst}")
24 message("${prefix}Symlink: '${dst_name}' ...")
26 get_filename_component(target_path "${dst}" PATH)
27 file(MAKE_DIRECTORY "${target_path}")
28 execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${src}" "${dst}"
29 RESULT_VARIABLE SYMLINK_RESULT)
30 if(NOT SYMLINK_RESULT EQUAL 0)
31 #message("Symlink failed, fallback to 'copy'")
36 if("${src}" IS_NEWER_THAN "${dst}" OR IS_SYMLINK "${dst}")
37 file(REMOVE "${dst}") # configure_file(COPYONLY) doesn't update timestamp sometimes
41 message("${prefix}Copying: '${dst_name}' ...")
42 configure_file(${src} ${dst} COPYONLY)
44 #message("${prefix}Up-to-date: '${dst_name}'")
48 set(update_dephelper 1)
50 file(TIMESTAMP "${dst}" dst_t UTC)
51 set(__state "${__state}${dst_t} ${dst}\n")
54 if(NOT DEFINED COPYLIST_VAR)
55 set(COPYLIST_VAR "COPYLIST")
57 list(LENGTH ${COPYLIST_VAR} __length)
58 message("${prefix}... ${__length} entries (${COPYLIST_VAR})")
59 foreach(id ${${COPYLIST_VAR}})
60 set(src "${${COPYLIST_VAR}_SRC_${id}}")
61 set(dst "${${COPYLIST_VAR}_DST_${id}}")
63 message(FATAL_ERROR "Source file/dir is missing: ${src} (${CONFIG_FILE})")
66 if(DEFINED ${COPYLIST_VAR}_MODE_${id})
67 set(_mode "${${COPYLIST_VAR}_MODE_${id}}")
69 if(_mode STREQUAL "COPYFILE")
70 #message("... COPY ${src} => ${dst}")
71 copy_file_("${src}" "${dst}" "${prefix} ")
72 elseif(_mode STREQUAL "COPYDIR")
73 get_filename_component(src_name "${src}" NAME)
74 get_filename_component(src_path "${src}" PATH)
75 get_filename_component(src_name2 "${src_path}" NAME)
77 set(src_glob "${src}/*")
78 if(DEFINED ${COPYLIST_VAR}_GLOB_${id})
79 set(src_glob "${${COPYLIST_VAR}_GLOB_${id}}")
81 file(GLOB_RECURSE _files RELATIVE "${src}" ${src_glob})
82 list(LENGTH _files __length)
83 message("${prefix} ... directory '.../${src_name2}/${src_name}' with ${__length} files")
85 if(NOT EXISTS "${src}/${f}")
86 message(FATAL_ERROR "COPY ERROR: Source file is missing: ${src}/${f}")
88 copy_file_("${src}/${f}" "${dst}/${f}" "${prefix} ")
93 set(STATE_FILE "${CONFIG_FILE}.state")
94 if(EXISTS "${STATE_FILE}")
95 file(READ "${STATE_FILE}" __prev_state)
99 if(NOT "${__state}" STREQUAL "${__prev_state}")
100 file(WRITE "${STATE_FILE}" "${__state}")
101 message("${prefix}Updated!")
102 set(update_dephelper 1)
105 if(NOT update_dephelper)
106 message("${prefix}All files are up-to-date.")
107 elseif(DEFINED DEPHELPER)
108 file(WRITE "${DEPHELPER}" "")