From a9aa5612345bcfae9a5562e135dec9de8c3b8a8f Mon Sep 17 00:00:00 2001 From: Alexis Murzeau Date: Wed, 29 Apr 2020 22:09:45 +0200 Subject: CMake: copy clang and resource files only if necessary Uses a timestamp file in the build directory to detect when the input changes using DEPENDS from add_custom_command. Total copied files size sum up to more than 260 MB. This was copied at every incremental build, even if nothing changed. This leads to faster build, especially when the copied files are not cached in RAM or when not using a SSD. Change-Id: I3a0b691b961e1d8591068bacf40ae2467c8637cf Reviewed-by: Eike Ziller Reviewed-by: Cristian Adam --- cmake/QtCreatorAPI.cmake | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'cmake') diff --git a/cmake/QtCreatorAPI.cmake b/cmake/QtCreatorAPI.cmake index d88cff2fc66..4351c897f7c 100644 --- a/cmake/QtCreatorAPI.cmake +++ b/cmake/QtCreatorAPI.cmake @@ -1155,3 +1155,49 @@ function(qtc_glob_resources) string(APPEND qrcData "") file(WRITE "${_arg_QRC_FILE}" "${qrcData}") endfunction() + +function(qtc_copy_to_builddir custom_target_name) + cmake_parse_arguments(_arg "CREATE_SUBDIRS" "DESTINATION" "FILES;DIRECTORIES" ${ARGN}) + set(timestampFiles) + + qtc_output_binary_dir(_output_binary_dir) + + foreach(srcFile ${_arg_FILES}) + string(MAKE_C_IDENTIFIER "${srcFile}" destinationTimestampFilePart) + set(destinationTimestampFileName "${CMAKE_CURRENT_BINARY_DIR}/.${destinationTimestampFilePart}_timestamp") + list(APPEND timestampFiles "${destinationTimestampFileName}") + + add_custom_command(OUTPUT "${destinationTimestampFileName}" + COMMAND "${CMAKE_COMMAND}" -E make_directory "${_output_binary_dir}/${_arg_DESTINATION}" + COMMAND "${CMAKE_COMMAND}" -E copy "${srcFile}" "${_output_binary_dir}/${_arg_DESTINATION}" + COMMAND "${CMAKE_COMMAND}" -E touch "${destinationTimestampFileName}" + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + COMMENT "Copy ${srcFile} into build directory" + DEPENDS "${srcFile}" + VERBATIM + ) + endforeach() + + foreach(srcDirectory ${_arg_DIRECTORIES}) + string(MAKE_C_IDENTIFIER "${srcDirectory}" destinationTimestampFilePart) + set(destinationTimestampFileName "${CMAKE_CURRENT_BINARY_DIR}/.${destinationTimestampFilePart}_timestamp") + list(APPEND timestampFiles "${destinationTimestampFileName}") + set(destinationDirectory "${_output_binary_dir}/${_arg_DESTINATION}") + + if(_arg_CREATE_SUBDIRS) + set(destinationDirectory "${destinationDirectory}/${srcDirectory}") + endif() + + file(GLOB_RECURSE filesToCopy "${srcDirectory}/*") + add_custom_command(OUTPUT "${destinationTimestampFileName}" + COMMAND "${CMAKE_COMMAND}" -E copy_directory "${srcDirectory}" "${destinationDirectory}" + COMMAND "${CMAKE_COMMAND}" -E touch "${destinationTimestampFileName}" + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + COMMENT "Copy ${srcDirectory}/ into build directory" + DEPENDS ${filesToCopy} + VERBATIM + ) + endforeach() + + add_custom_target("${custom_target_name}" ALL DEPENDS ${timestampFiles}) +endfunction() -- cgit v1.2.3