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 <eike.ziller@qt.io>
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
This commit is contained in:
Alexis Murzeau
2020-04-29 22:09:45 +02:00
parent 95d9eafc8a
commit a9aa561234
5 changed files with 64 additions and 48 deletions

View File

@@ -1155,3 +1155,49 @@ function(qtc_glob_resources)
string(APPEND qrcData "</qresource></RCC>")
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()

View File

@@ -20,21 +20,12 @@ if (APPLE)
set(resource_directories ${resource_directories} scripts)
endif()
add_custom_target(copy_share_to_builddir ALL
COMMENT Copy files into build directory
VERBATIM
)
# copy resource directories during build
foreach(dir IN ITEMS ${resource_directories})
add_custom_command(TARGET copy_share_to_builddir POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_directory "${dir}"
"${PROJECT_BINARY_DIR}/${IDE_DATA_PATH}/${dir}"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT Copy resource directories into build directory
VERBATIM
)
endforeach()
qtc_copy_to_builddir(copy_share_to_builddir
DIRECTORIES ${resource_directories}
DESTINATION "${IDE_DATA_PATH}"
CREATE_SUBDIRS
)
# create install rule for resource directories
install(DIRECTORY ${resource_directories} DESTINATION "${IDE_DATA_PATH}")

View File

@@ -37,11 +37,8 @@ install(
DESTINATION "${IDE_DATA_PATH}/generic-highlighter/"
)
add_custom_target(copy_generic_highligher_to_builddir ALL VERBATIM)
add_custom_command(TARGET copy_generic_highligher_to_builddir POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_directory data/syntax
"${PROJECT_BINARY_DIR}/${IDE_DATA_PATH}/generic-highlighter/syntax"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT Copy files into build directory
VERBATIM
# copy resource directories during build
qtc_copy_to_builddir(copy_generic_highligher_to_builddir
DIRECTORIES data/syntax
DESTINATION "${IDE_DATA_PATH}/generic-highlighter/syntax"
)

View File

@@ -147,32 +147,18 @@ if (NOT TARGET libclang)
return()
endif()
add_custom_target(copy_clang_to_builddir ALL
COMMENT Copy Clang files into build directory
)
# For the developer build directory
add_custom_command(TARGET copy_clang_to_builddir POST_BUILD
COMMAND "${CMAKE_COMMAND}"
-E copy_directory
"${LLVM_LIBRARY_DIR}/clang/${CLANG_VERSION}/include"
"${PROJECT_BINARY_DIR}/${IDE_LIBEXEC_PATH}/clang/lib/clang/${CLANG_VERSION}/include"
VERBATIM
qtc_copy_to_builddir(copy_clang_to_builddir
DIRECTORIES "${LLVM_LIBRARY_DIR}/clang/${CLANG_VERSION}/include"
DESTINATION "${IDE_LIBEXEC_PATH}/clang/lib/clang/${CLANG_VERSION}/include"
)
foreach(executable clang clang-cl clangd clang-tidy clazy-standalone)
if (EXISTS "${LLVM_TOOLS_BINARY_DIR}/${executable}${CMAKE_EXECUTABLE_SUFFIX}")
add_custom_command(TARGET copy_clang_to_builddir PRE_BUILD
COMMAND "${CMAKE_COMMAND}"
-E make_directory
"${PROJECT_BINARY_DIR}/${IDE_LIBEXEC_PATH}/clang/bin/"
COMMAND "${CMAKE_COMMAND}"
-E copy
"${LLVM_TOOLS_BINARY_DIR}/${executable}${CMAKE_EXECUTABLE_SUFFIX}"
"${PROJECT_BINARY_DIR}/${IDE_LIBEXEC_PATH}/clang/bin/"
VERBATIM
qtc_copy_to_builddir(copy_clang_${executable}_to_builddir
FILES "${LLVM_TOOLS_BINARY_DIR}/${executable}${CMAKE_EXECUTABLE_SUFFIX}"
DESTINATION "${IDE_LIBEXEC_PATH}/clang/bin/"
)
# For the install directory
install(PROGRAMS
"${LLVM_TOOLS_BINARY_DIR}/${executable}${CMAKE_EXECUTABLE_SUFFIX}"

View File

@@ -3,11 +3,7 @@ install(
DESTINATION "${IDE_DATA_PATH}"
)
add_custom_target(copy_fonts_to_builddir ALL VERBATIM)
add_custom_command(TARGET copy_fonts_to_builddir POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_directory fonts
"${PROJECT_BINARY_DIR}/${IDE_DATA_PATH}/fonts"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT Copy files into build directory
VERBATIM
qtc_copy_to_builddir(copy_fonts_to_builddir
DIRECTORIES fonts
DESTINATION "${IDE_DATA_PATH}/fonts"
)