From 8d9b6d845da0917ae1a160a913e8851b4de2a9f7 Mon Sep 17 00:00:00 2001 From: Martchus Date: Mon, 18 Jul 2022 23:14:26 +0200 Subject: [PATCH] WIP: Avoid re-configuring built-in icons all the time It is quite slow and it should be fine doing it only once one the first configuration --- cmake/modules/QtConfig.cmake | 206 ++++++++++++++++++----------------- 1 file changed, 109 insertions(+), 97 deletions(-) diff --git a/cmake/modules/QtConfig.cmake b/cmake/modules/QtConfig.cmake index 67135a8..d87095c 100644 --- a/cmake/modules/QtConfig.cmake +++ b/cmake/modules/QtConfig.cmake @@ -504,114 +504,126 @@ if (REQUIRED_ICONS) CACHE STRING "specifies icon themes to be built-in") option(BUILTIN_ICON_THEMES_IN_LIBRARIES "specifies whether icon themes should also be built-in when building libraries" OFF) + option(BUILTIN_ICON_THEMES_CONFIGURED "whether built-in icons have been configured" NO) if (BUILTIN_ICON_THEMES AND (BUILTIN_ICON_THEMES_IN_LIBRARIES OR (NOT "${META_PROJECT_TYPE}" STREQUAL "library"))) - set(ICON_THEME_FILES) - set(ICON_SEARCH_PATHS) - if (CMAKE_FIND_ROOT_PATH) - foreach (ROOT_PATH ${CMAKE_FIND_ROOT_PATH}) - list(APPEND ICON_SEARCH_PATHS "${ROOT_PATH}/${CMAKE_INSTALL_DATAROOTDIR}/icons") - endforeach () - endif () - list(APPEND ICON_SEARCH_PATHS "${CMAKE_INSTALL_FULL_DATAROOTDIR}/icons") - list(APPEND ICON_SEARCH_PATHS "/usr/${CMAKE_INSTALL_DATAROOTDIR}/icons") # find icons from regular prefix when cross- - # compiling - list(REMOVE_DUPLICATES ICON_SEARCH_PATHS) - set(BUILTIN_ICONS_DIR "${CMAKE_CURRENT_BINARY_DIR}/icons") - set(DEFAULT_THEME_INDEX_FILE "${BUILTIN_ICONS_DIR}/default/index.theme") - file(REMOVE_RECURSE "${BUILTIN_ICONS_DIR}") - file(MAKE_DIRECTORY "${BUILTIN_ICONS_DIR}") - foreach (ICON_THEME ${BUILTIN_ICON_THEMES}) - string(REGEX MATCHALL "([^:]+|[^:]+$)" ICON_THEME_PARTS "${ICON_THEME}") - list(LENGTH ICON_THEME_PARTS ICON_THEME_PARTS_LENGTH) - if ("${ICON_THEME_PARTS_LENGTH}" STREQUAL 2) - list(GET ICON_THEME_PARTS 0 ICON_THEME) - list(GET ICON_THEME_PARTS 1 NEW_ICON_THEME_NAME) - else () - set(NEW_ICON_THEME_NAME "${ICON_THEME}") + set(BUILTIN_ICON_THEMES_QRC_FILE "${CMAKE_CURRENT_BINARY_DIR}/icons/${META_PROJECT_NAME}_builtinicons.qrc") + if (BUILTIN_ICON_THEMES_CONFIGURED AND EXISTS BUILTIN_ICON_THEMES_QRC_FILE) + message( + STATUS + "Skipping configuration of built-in icons as they have already been configured before. Run CMake with -DBUILTIN_ICON_THEMES_CONFIGURED=OFF to re-conduct the configuration." + ) + else () + set(ICON_THEME_FILES) + set(ICON_SEARCH_PATHS) + if (CMAKE_FIND_ROOT_PATH) + foreach (ROOT_PATH ${CMAKE_FIND_ROOT_PATH}) + list(APPEND ICON_SEARCH_PATHS "${ROOT_PATH}/${CMAKE_INSTALL_DATAROOTDIR}/icons") + endforeach () endif () - foreach (ICON_SEARCH_PATH ${ICON_SEARCH_PATHS}) - set(ICON_THEME_PATH "${ICON_SEARCH_PATH}/${ICON_THEME}") - set(NEW_ICON_THEME_PATH "${ICON_SEARCH_PATH}/${ICON_THEME}") - if (IS_DIRECTORY "${ICON_THEME_PATH}") - message( - STATUS - "The specified icon theme \"${ICON_THEME}\" has been located under \"${ICON_THEME_PATH}\" and will be built-in." - ) - # find index files - if (NOT ICON_THEME STREQUAL FALLBACK_ICON_THEME) - file( - GLOB GLOBBED_ICON_THEME_INDEX_FILES - LIST_DIRECTORIES false - "${ICON_THEME_PATH}/index.theme" "${ICON_THEME_PATH}/icon-theme.cache") - else () - # only index.theme required when icons are provided as fallback anyways - file( - GLOB GLOBBED_ICON_THEME_INDEX_FILES - LIST_DIRECTORIES false - "${ICON_THEME_PATH}/index.theme") - endif () - # make the first specified built-in the default theme - if (NOT EXISTS "${DEFAULT_THEME_INDEX_FILE}") - file(MAKE_DIRECTORY "${BUILTIN_ICONS_DIR}/default") - file(WRITE "${DEFAULT_THEME_INDEX_FILE}" "[Icon Theme]\nInherits=${NEW_ICON_THEME_NAME}") - list(APPEND ICON_THEME_FILES "default/index.theme") - endif () - # find required icons, except the icon theme is provided as fallback anyways - if (NOT ICON_THEME STREQUAL FALLBACK_ICON_THEME) - set(GLOB_PATTERNS) - foreach (REQUIRED_ICON ${REQUIRED_ICONS}) - list(APPEND GLOB_PATTERNS "${ICON_THEME_PATH}/${REQUIRED_ICON}" - "${ICON_THEME_PATH}/${REQUIRED_ICON}.*" "${ICON_THEME_PATH}/*/${REQUIRED_ICON}" - "${ICON_THEME_PATH}/*/${REQUIRED_ICON}.*") - endforeach () - file( - GLOB_RECURSE GLOBBED_ICON_THEME_FILES - LIST_DIRECTORIES false - ${GLOB_PATTERNS}) - else () + list(APPEND ICON_SEARCH_PATHS "${CMAKE_INSTALL_FULL_DATAROOTDIR}/icons") + list(APPEND ICON_SEARCH_PATHS "/usr/${CMAKE_INSTALL_DATAROOTDIR}/icons") # find icons from regular prefix when + # cross- compiling + list(REMOVE_DUPLICATES ICON_SEARCH_PATHS) + set(BUILTIN_ICONS_DIR "${CMAKE_CURRENT_BINARY_DIR}/icons") + set(DEFAULT_THEME_INDEX_FILE "${BUILTIN_ICONS_DIR}/default/index.theme") + file(REMOVE_RECURSE "${BUILTIN_ICONS_DIR}") + file(MAKE_DIRECTORY "${BUILTIN_ICONS_DIR}") + foreach (ICON_THEME ${BUILTIN_ICON_THEMES}) + string(REGEX MATCHALL "([^:]+|[^:]+$)" ICON_THEME_PARTS "${ICON_THEME}") + list(LENGTH ICON_THEME_PARTS ICON_THEME_PARTS_LENGTH) + if ("${ICON_THEME_PARTS_LENGTH}" STREQUAL 2) + list(GET ICON_THEME_PARTS 0 ICON_THEME) + list(GET ICON_THEME_PARTS 1 NEW_ICON_THEME_NAME) + else () + set(NEW_ICON_THEME_NAME "${ICON_THEME}") + endif () + foreach (ICON_SEARCH_PATH ${ICON_SEARCH_PATHS}) + set(ICON_THEME_PATH "${ICON_SEARCH_PATH}/${ICON_THEME}") + set(NEW_ICON_THEME_PATH "${ICON_SEARCH_PATH}/${ICON_THEME}") + if (IS_DIRECTORY "${ICON_THEME_PATH}") message( STATUS - "Icon files for specified theme \"${ICON_THEME}\" are skipped because these are provided as fallback anyways." + "The specified icon theme \"${ICON_THEME}\" has been located under \"${ICON_THEME_PATH}\" and will be built-in." ) - set(GLOBBED_ICON_THEME_FILES) - endif () - # make temporary copy of required icons and create resource list for Qt - foreach (ICON_THEME_FILE ${GLOBBED_ICON_THEME_INDEX_FILES} ${GLOBBED_ICON_THEME_FILES}) - # resolve symlinks - if (IS_SYMLINK "${ICON_THEME_FILE}") + # find index files + if (NOT ICON_THEME STREQUAL FALLBACK_ICON_THEME) + file( + GLOB GLOBBED_ICON_THEME_INDEX_FILES + LIST_DIRECTORIES false + "${ICON_THEME_PATH}/index.theme" "${ICON_THEME_PATH}/icon-theme.cache") + else () + # only index.theme required when icons are provided as fallback anyways + file( + GLOB GLOBBED_ICON_THEME_INDEX_FILES + LIST_DIRECTORIES false + "${ICON_THEME_PATH}/index.theme") + endif () + # make the first specified built-in the default theme + if (NOT EXISTS "${DEFAULT_THEME_INDEX_FILE}") + file(MAKE_DIRECTORY "${BUILTIN_ICONS_DIR}/default") + file(WRITE "${DEFAULT_THEME_INDEX_FILE}" "[Icon Theme]\nInherits=${NEW_ICON_THEME_NAME}") + list(APPEND ICON_THEME_FILES "default/index.theme") + endif () + # find required icons, except the icon theme is provided as fallback anyways + if (NOT ICON_THEME STREQUAL FALLBACK_ICON_THEME) + set(GLOB_PATTERNS) + foreach (REQUIRED_ICON ${REQUIRED_ICONS}) + list(APPEND GLOB_PATTERNS "${ICON_THEME_PATH}/${REQUIRED_ICON}" + "${ICON_THEME_PATH}/${REQUIRED_ICON}.*" "${ICON_THEME_PATH}/*/${REQUIRED_ICON}" + "${ICON_THEME_PATH}/*/${REQUIRED_ICON}.*") + endforeach () + file( + GLOB_RECURSE GLOBBED_ICON_THEME_FILES + LIST_DIRECTORIES false + ${GLOB_PATTERNS}) + else () + message( + STATUS + "Icon files for specified theme \"${ICON_THEME}\" are skipped because these are provided as fallback anyways." + ) + set(GLOBBED_ICON_THEME_FILES) + endif () + # make temporary copy of required icons and create resource list for Qt + foreach (ICON_THEME_FILE ${GLOBBED_ICON_THEME_INDEX_FILES} ${GLOBBED_ICON_THEME_FILES}) + # resolve symlinks + if (IS_SYMLINK "${ICON_THEME_FILE}") + string(REGEX REPLACE "^${ICON_SEARCH_PATH}/" "" ICON_THEME_FILE_RELATIVE_PATH + "${ICON_THEME_FILE}") + string(REGEX REPLACE "(^[^/\\]+)" "${NEW_ICON_THEME_NAME}" NEW_ICON_THEME_FILE_RELATIVE_PATH + "${ICON_THEME_FILE_RELATIVE_PATH}") + set(ICON_THEME_FILE_ALIAS " alias=\"${NEW_ICON_THEME_FILE_RELATIVE_PATH}\"") + get_filename_component(ICON_THEME_FILE "${ICON_THEME_FILE}" REALPATH) + else () + unset(ICON_THEME_FILE_ALIAS) + endif () string(REGEX REPLACE "^${ICON_SEARCH_PATH}/" "" ICON_THEME_FILE_RELATIVE_PATH "${ICON_THEME_FILE}") string(REGEX REPLACE "(^[^/\\]+)" "${NEW_ICON_THEME_NAME}" NEW_ICON_THEME_FILE_RELATIVE_PATH "${ICON_THEME_FILE_RELATIVE_PATH}") - set(ICON_THEME_FILE_ALIAS " alias=\"${NEW_ICON_THEME_FILE_RELATIVE_PATH}\"") - get_filename_component(ICON_THEME_FILE "${ICON_THEME_FILE}" REALPATH) - else () - unset(ICON_THEME_FILE_ALIAS) - endif () - string(REGEX REPLACE "^${ICON_SEARCH_PATH}/" "" ICON_THEME_FILE_RELATIVE_PATH "${ICON_THEME_FILE}") - string(REGEX REPLACE "(^[^/\\]+)" "${NEW_ICON_THEME_NAME}" NEW_ICON_THEME_FILE_RELATIVE_PATH - "${ICON_THEME_FILE_RELATIVE_PATH}") - get_filename_component(ICON_THEME_FILE_DIR "${ICON_THEME_FILE_RELATIVE_PATH}" DIRECTORY) - string(REGEX REPLACE "(^[^/\\]+)" "${NEW_ICON_THEME_NAME}" NEW_ICON_THEME_FILE_DIR - "${ICON_THEME_FILE_DIR}") - file(MAKE_DIRECTORY "${BUILTIN_ICONS_DIR}/${NEW_ICON_THEME_FILE_DIR}") - file(COPY "${ICON_THEME_FILE}" DESTINATION "${BUILTIN_ICONS_DIR}/${NEW_ICON_THEME_FILE_DIR}") - list(APPEND ICON_THEME_FILES - "${NEW_ICON_THEME_FILE_RELATIVE_PATH}") - endforeach () - break() + get_filename_component(ICON_THEME_FILE_DIR "${ICON_THEME_FILE_RELATIVE_PATH}" DIRECTORY) + string(REGEX REPLACE "(^[^/\\]+)" "${NEW_ICON_THEME_NAME}" NEW_ICON_THEME_FILE_DIR + "${ICON_THEME_FILE_DIR}") + file(MAKE_DIRECTORY "${BUILTIN_ICONS_DIR}/${NEW_ICON_THEME_FILE_DIR}") + file(COPY "${ICON_THEME_FILE}" DESTINATION "${BUILTIN_ICONS_DIR}/${NEW_ICON_THEME_FILE_DIR}") + list(APPEND ICON_THEME_FILES + "${NEW_ICON_THEME_FILE_RELATIVE_PATH}") + endforeach () + break() + endif () + unset(ICON_THEME_PATH) + endforeach () + if (NOT ICON_THEME_PATH) + message(FATAL_ERROR "The specified icon theme \"${ICON_THEME}\" could not be found.") endif () - unset(ICON_THEME_PATH) endforeach () - if (NOT ICON_THEME_PATH) - message(FATAL_ERROR "The specified icon theme \"${ICON_THEME}\" could not be found.") - endif () - endforeach () - set(BUILTIN_ICON_THEMES_QRC_FILE "${CMAKE_CURRENT_BINARY_DIR}/icons/${META_PROJECT_NAME}_builtinicons.qrc") - list(REMOVE_DUPLICATES ICON_THEME_FILES) - string(CONCAT BUILTIN_ICON_THEMES_QRC_FILE_CONTENT "" ${ICON_THEME_FILES} - "") - file(WRITE "${BUILTIN_ICON_THEMES_QRC_FILE}" "${BUILTIN_ICON_THEMES_QRC_FILE_CONTENT}") + list(REMOVE_DUPLICATES ICON_THEME_FILES) + string(CONCAT BUILTIN_ICON_THEMES_QRC_FILE_CONTENT "" ${ICON_THEME_FILES} + "") + file(WRITE "${BUILTIN_ICON_THEMES_QRC_FILE}" "${BUILTIN_ICON_THEMES_QRC_FILE_CONTENT}") + set(BUILTIN_ICON_THEMES_CONFIGURED + YES + CACHE BOOLEAN "whether built-in icons have been configured" FORCE) + endif () list(APPEND RES_FILES "${BUILTIN_ICON_THEMES_QRC_FILE}") endif () endif ()