cmake_minimum_required(VERSION 3.17) project(RerunUicOnFileChange) include("../AutogenGuiTest.cmake") # Utility variables set(testProjectTemplateDir "${CMAKE_CURRENT_SOURCE_DIR}/UicOnFileChange") set(testProjectSrc "${CMAKE_CURRENT_BINARY_DIR}/UicOnFileChange") set(testProjectBinDir "${CMAKE_CURRENT_BINARY_DIR}/UicOnFileChange-build") set(TEST_CONFIG "Release") macro(sleep) message(STATUS "Sleeping for a few seconds.") execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) endmacro() macro(rebuild buildName) message(STATUS "Starting build ${buildName}.") execute_process(COMMAND "${CMAKE_COMMAND}" --build . --config "${TEST_CONFIG}" WORKING_DIRECTORY "${testProjectBinDir}" RESULT_VARIABLE result ) if (result) message(FATAL_ERROR "Build ${buildName} failed.") else() message(STATUS "Build ${buildName} finished.") endif() endmacro() configure_file("${testProjectTemplateDir}/mocwidget.h" "${testProjectSrc}/mocwidget.h" COPYONLY) configure_file("${testProjectTemplateDir}/mainwindow.h" "${testProjectSrc}/mainwindow.h" COPYONLY) configure_file("${testProjectTemplateDir}/main.cpp" "${testProjectSrc}/main.cpp" COPYONLY) configure_file("${testProjectTemplateDir}/CMakeLists.txt.in" "${testProjectSrc}/CMakeLists.txt" @ONLY) set(Num 1) configure_file("${testProjectTemplateDir}/mainwindow.ui.in" "${testProjectSrc}/mainwindow.ui" @ONLY) if(CMAKE_GENERATOR_INSTANCE) set(_D_CMAKE_GENERATOR_INSTANCE "-DCMAKE_GENERATOR_INSTANCE=${CMAKE_GENERATOR_INSTANCE}") else() set(_D_CMAKE_GENERATOR_INSTANCE "") endif() get_property(is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) if(is_multi) set(build_type_extra "-DCMAKE_CONFIGURATION_TYPES=${TEST_CONFIG}") set(extra_bin_path "${TEST_CONFIG}/") else() set(build_type_extra "-DCMAKE_BUILD_TYPE=${TEST_CONFIG}") endif() # Set the environment PATH/LD_LIBRARY_PATH variables to run the resulting executable if(WIN32 AND TARGET ${QT_QTCORE_TARGET}) get_target_property(qtcore_path ${QT_QTCORE_TARGET} LOCATION) if(NOT qtcore_path) get_target_property(qtcore_path ${QT_QTCORE_TARGET} IMPORTED_LOCATION) endif() get_filename_component(qtcore_path "${qtcore_path}" DIRECTORY) set(ENV{PATH} "${qtcore_path};$ENV{PATH}") endif() execute_process( COMMAND "${CMAKE_COMMAND}" -B "${testProjectBinDir}" -S "${testProjectSrc}" -G "${CMAKE_GENERATOR}" -A "${CMAKE_GENERATOR_PLATFORM}" -T "${CMAKE_GENERATOR_TOOLSET}" ${_D_CMAKE_GENERATOR_INSTANCE} "${build_type_extra}" "-DQT_TEST_VERSION=${QT_TEST_VERSION}" "-DCMAKE_AUTOGEN_VERBOSE=${CMAKE_AUTOGEN_VERBOSE}" "-DCMAKE_PREFIX_PATH:STRING=${CMAKE_PREFIX_PATH}" "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}" RESULT_VARIABLE exit_code OUTPUT_VARIABLE output ERROR_VARIABLE output ) if(NOT exit_code EQUAL 0) message(FATAL_ERROR "Initial configuration of UicOnFileChange failed. Output: ${output}") endif() # Initial build execute_process( COMMAND "${CMAKE_COMMAND}" --build "${testProjectBinDir}" --config "${TEST_CONFIG}" RESULT_VARIABLE exit_code OUTPUT_VARIABLE output ERROR_VARIABLE output ) if(NOT exit_code EQUAL 0) message(FATAL_ERROR "Initial build of UicOnFileChange failed. Output: ${output}") endif() execute_process(COMMAND "${testProjectBinDir}/${extra_bin_path}UicOnFileChange" RESULT_VARIABLE result) if(NOT result EQUAL "1") message(FATAL_ERROR "Initial build of UicOnFileChange test result is: ${result}") endif() sleep() set(Num 2) configure_file("${testProjectTemplateDir}/mainwindow.ui.in" "${testProjectSrc}/mainwindow.ui" @ONLY) rebuild(2) execute_process(COMMAND "${testProjectBinDir}/${extra_bin_path}UicOnFileChange" RESULT_VARIABLE result) if(NOT result EQUAL "0") message(FATAL_ERROR "Rebuild of UicOnFileChange test result is: ${result}") endif() # Check if the generated ui_mainwindow.h rules introduce circular dependency between the generated # ui_mainwinow.h and timestamp. # # The first rebuild updates a timestamp dependency file after "touching" mainwindow.h. sleep() execute_process(COMMAND ${CMAKE_COMMAND} -E touch "${testProjectSrc}/mainwindow.h") rebuild(3) # The second rebuild detects if cycling dependency is introduced by deps file. sleep() rebuild(4)