From c33b864dd333b278bcc00a5a737b3db6f196a611 Mon Sep 17 00:00:00 2001 From: Dominik Holland Date: Wed, 12 May 2021 09:07:14 +0200 Subject: cmake: Regenerate code when qface, template or yaml files change Change-Id: I355377a2e57da3f51ee6227fdd6a515a1600b2dc Reviewed-by: Robert Griebl --- src/ivicore/Qt6IviCoreMacros.cmake | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/ivicore/Qt6IviCoreMacros.cmake b/src/ivicore/Qt6IviCoreMacros.cmake index 5101501..0ad7d75 100644 --- a/src/ivicore/Qt6IviCoreMacros.cmake +++ b/src/ivicore/Qt6IviCoreMacros.cmake @@ -48,8 +48,8 @@ function(qt6_ivigenerator_generate) message(FATAL_ERROR "QFACE_SOURCES can't be empty") endif() get_filename_component(QFACE_SOURCES "${ARG_QFACE_SOURCES}" REALPATH BASE_DIR) - get_filename_component(QFACE_SOURCE_DIR "${ARG_QFACE_SOURCES}" DIRECTORY) - get_filename_component(QFACE_BASE_NAME "${ARG_QFACE_SOURCES}" NAME_WLE) + get_filename_component(QFACE_SOURCE_DIR "${QFACE_SOURCES}" DIRECTORY) + get_filename_component(QFACE_BASE_NAME "${QFACE_SOURCES}" NAME_WLE) get_filename_component(QFACE_SOURCE_ANNOTATION ${QFACE_SOURCE_DIR}/${QFACE_BASE_NAME}.yaml REALPATH BASE_DIR) set(QFACE_TEMPLATE_PWD "${GENERATOR_PATH}/templates/${ARG_QFACE_FORMAT}") @@ -67,24 +67,25 @@ function(qt6_ivigenerator_generate) endif() # Register all source files to cause a cmake rerun - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${QFACE_SOURCES}) + set(GEN_DEPENDENCIES) + list(APPEND GEN_DEPENDENCIES ${QFACE_SOURCES}) if (EXISTS ${QFACE_SOURCE_ANNOTATION}) - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${QFACE_SOURCE_ANNOTATION}) + list(APPEND GEN_DEPENDENCIES ${QFACE_SOURCE_ANNOTATION}) endif() # Also register all files which are part of the current template file(GLOB FORMAT_FILES ${FORMAT_PATH}/*) - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${FORMAT_FILES}) - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${FORMAT_PATH}.yaml) + list(APPEND GEN_DEPENDENCIES ${FORMAT_FILES}) + list(APPEND GEN_DEPENDENCIES ${FORMAT_PATH}.yaml) # Most templates also have a dependency to a common folder file(GLOB COMMON_FORMAT_FILES ${GENERATOR_PATH}/templates/*common*/*) - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${COMMON_FORMAT_FILES}) + list(APPEND GEN_DEPENDENCIES ${COMMON_FORMAT_FILES}) set(GENERATOR_ARGUMENTS --format=${QFACE_FORMAT} --force) foreach(ANNOTATION ${ARG_QFACE_ANNOTATIONS}) get_filename_component(ANNOTATION_PATH "${ANNOTATION}" REALPATH BASE_DIR) list(APPEND GENERATOR_ARGUMENTS -A ${ANNOTATION_PATH}) # Dependency for regeneration - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${ANNOTATION_PATH}) + list(APPEND GEN_DEPENDENCIES ${ANNOTATION_PATH}) endforeach() foreach(IMPORT ${ARG_QFACE_IMPORT_PATH}) @@ -92,13 +93,22 @@ function(qt6_ivigenerator_generate) list(APPEND GENERATOR_ARGUMENTS -I ${IMPORT_PATH}) # Dependency for regeneration file(GLOB QFACE_FILES ${IMPORT_PATH}/*.qface) - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${QFACE_FILES}) + list(APPEND GEN_DEPENDENCIES ${QFACE_FILES}) endforeach() + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${GEN_DEPENDENCIES}) + # If the generator was run successfully before # Check for the timestamps to determine when to run it again. - # TODO, this needs to be extended to also include template and yaml changes - if (${QFACE_SOURCES} IS_NEWER_THAN ${QFACE_OUTPUT_DIR}/.stamp-ivigenerator) + set(RUN_GENERATOR FALSE) + foreach(DEP ${GEN_DEPENDENCIES}) + if (${DEP} IS_NEWER_THAN ${QFACE_OUTPUT_DIR}/.stamp-ivigenerator) + set(RUN_GENERATOR TRUE) + break() + endif() + endforeach() + + if (RUN_GENERATOR) # TODO How to best unset those again afterwards ? # Use cmake -E slee + cmake -E env COMMAND instead ? #equals(QMAKE_HOST.os, Windows): ENV = chcp 65001 && -- cgit v1.2.3