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>") string(APPEND qrcData "</qresource></RCC>")
file(WRITE "${_arg_QRC_FILE}" "${qrcData}") file(WRITE "${_arg_QRC_FILE}" "${qrcData}")
endfunction() 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) set(resource_directories ${resource_directories} scripts)
endif() endif()
add_custom_target(copy_share_to_builddir ALL
COMMENT Copy files into build directory
VERBATIM
)
# copy resource directories during build # copy resource directories during build
foreach(dir IN ITEMS ${resource_directories}) qtc_copy_to_builddir(copy_share_to_builddir
add_custom_command(TARGET copy_share_to_builddir POST_BUILD DIRECTORIES ${resource_directories}
COMMAND "${CMAKE_COMMAND}" -E copy_directory "${dir}" DESTINATION "${IDE_DATA_PATH}"
"${PROJECT_BINARY_DIR}/${IDE_DATA_PATH}/${dir}" CREATE_SUBDIRS
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" )
COMMENT Copy resource directories into build directory
VERBATIM
)
endforeach()
# create install rule for resource directories # create install rule for resource directories
install(DIRECTORY ${resource_directories} DESTINATION "${IDE_DATA_PATH}") install(DIRECTORY ${resource_directories} DESTINATION "${IDE_DATA_PATH}")

View File

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

View File

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

View File

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