From 0e346427a254024b8eafe52956e8f4ba05d856ed Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 19 Jun 2015 09:38:04 -0400 Subject: QtAutogen: Always run autogen step even when rcc is enabled (#15608) In commit v3.2.0-rc1~480^2 (QtAutogen: Regenerate qrc files if their input changes, 2014-09-17) the "cmake -E cmake_autogen" rule was switched from always running to running as a custom command with dependencies if rcc is enabled. This is not correct because automoc always needs to re-run. Switch back to always running the command. --- Source/cmQtAutoGenerators.cxx | 22 +--------------------- Tests/QtAutogen/CMakeLists.txt | 23 +++++++++++++++++++++++ Tests/QtAutogen/automoc_rerun/CMakeLists.txt | 27 +++++++++++++++++++++++++++ Tests/QtAutogen/automoc_rerun/input.txt | 1 + Tests/QtAutogen/automoc_rerun/res1.qrc | 5 +++++ Tests/QtAutogen/automoc_rerun/test1.cpp | 5 +++++ Tests/QtAutogen/automoc_rerun/test1.h.in1 | 8 ++++++++ Tests/QtAutogen/automoc_rerun/test1.h.in2 | 7 +++++++ 8 files changed, 77 insertions(+), 21 deletions(-) create mode 100644 Tests/QtAutogen/automoc_rerun/CMakeLists.txt create mode 100644 Tests/QtAutogen/automoc_rerun/input.txt create mode 100644 Tests/QtAutogen/automoc_rerun/res1.qrc create mode 100644 Tests/QtAutogen/automoc_rerun/test1.cpp create mode 100644 Tests/QtAutogen/automoc_rerun/test1.h.in1 create mode 100644 Tests/QtAutogen/automoc_rerun/test1.h.in2 diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index f472ed8..d2f6e36 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -466,31 +466,11 @@ bool cmQtAutoGenerators::InitializeAutogenTarget(cmTarget* target) else #endif { - cmTarget* autogenTarget = 0; - if (!rcc_output.empty() && !isNinja) - { - std::vector no_byproducts; - makefile->AddCustomCommandToOutput(rcc_output, no_byproducts, - depends, "", - commandLines, 0, - workingDirectory.c_str(), - false, false); - - cmCustomCommandLines no_commands; - autogenTarget = makefile->AddUtilityCommand( - autogenTargetName, true, - workingDirectory.c_str(), rcc_output, - no_commands, false, autogenComment.c_str()); - - } - else - { - autogenTarget = makefile->AddUtilityCommand( + cmTarget* autogenTarget = makefile->AddUtilityCommand( autogenTargetName, true, workingDirectory.c_str(), /*byproducts=*/rcc_output, depends, commandLines, false, autogenComment.c_str()); - } // Set target folder const char* autogenFolder = makefile->GetState() diff --git a/Tests/QtAutogen/CMakeLists.txt b/Tests/QtAutogen/CMakeLists.txt index 60b44fd..1dfa648 100644 --- a/Tests/QtAutogen/CMakeLists.txt +++ b/Tests/QtAutogen/CMakeLists.txt @@ -167,3 +167,26 @@ file(TIMESTAMP "${qrc_file1}" file1_step1 "${timeformat}") if (NOT file1_step1 GREATER file1_before) message(SEND_ERROR "file1 (${qrc_file1}) should have changed in the first step!") endif() + +#----------------------------------------------------------------------------- +try_compile(MOC_RERUN + "${CMAKE_CURRENT_BINARY_DIR}/automoc_rerun" + "${CMAKE_CURRENT_SOURCE_DIR}/automoc_rerun" + automoc_rerun + CMAKE_FLAGS "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}" "-DQT_TEST_VERSION=${QT_TEST_VERSION}" + "-DCMAKE_PREFIX_PATH=${Qt_PREFIX_DIR}" + OUTPUT_VARIABLE output +) +if (NOT MOC_RERUN) + message(SEND_ERROR "Initial build of automoc_rerun failed. Output: ${output}") +endif() + +configure_file(automoc_rerun/test1.h.in2 automoc_rerun/test1.h COPYONLY) + +execute_process(COMMAND "${CMAKE_COMMAND}" --build . + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/automoc_rerun" + RESULT_VARIABLE automoc_rerun_result + ) +if (automoc_rerun_result) + message(SEND_ERROR "Second build of automoc_rerun failed.") +endif() diff --git a/Tests/QtAutogen/automoc_rerun/CMakeLists.txt b/Tests/QtAutogen/automoc_rerun/CMakeLists.txt new file mode 100644 index 0000000..17bc332 --- /dev/null +++ b/Tests/QtAutogen/automoc_rerun/CMakeLists.txt @@ -0,0 +1,27 @@ +cmake_minimum_required(VERSION 3.1) +project(automoc_rerun CXX) + +if (QT_TEST_VERSION STREQUAL 4) + find_package(Qt4 REQUIRED) + set(QT_CORE_TARGET Qt4::QtCore) +else() + if (NOT QT_TEST_VERSION STREQUAL 5) + message(SEND_ERROR "Invalid Qt version specified.") + endif() + + find_package(Qt5Core REQUIRED) + set(QT_CORE_TARGET Qt5::Core) +endif() + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +configure_file(test1.h.in1 test1.h COPYONLY) + +add_executable(test1 + ${CMAKE_CURRENT_BINARY_DIR}/test1.h + test1.cpp + res1.qrc + ) +target_include_directories(test1 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +target_link_libraries(test1 ${QT_CORE_TARGET}) diff --git a/Tests/QtAutogen/automoc_rerun/input.txt b/Tests/QtAutogen/automoc_rerun/input.txt new file mode 100644 index 0000000..da62762 --- /dev/null +++ b/Tests/QtAutogen/automoc_rerun/input.txt @@ -0,0 +1 @@ +Res1 input. diff --git a/Tests/QtAutogen/automoc_rerun/res1.qrc b/Tests/QtAutogen/automoc_rerun/res1.qrc new file mode 100644 index 0000000..fb804b5 --- /dev/null +++ b/Tests/QtAutogen/automoc_rerun/res1.qrc @@ -0,0 +1,5 @@ + + + input.txt + + diff --git a/Tests/QtAutogen/automoc_rerun/test1.cpp b/Tests/QtAutogen/automoc_rerun/test1.cpp new file mode 100644 index 0000000..4316a91 --- /dev/null +++ b/Tests/QtAutogen/automoc_rerun/test1.cpp @@ -0,0 +1,5 @@ +#include "test1.h" +int main() +{ + return 0; +} diff --git a/Tests/QtAutogen/automoc_rerun/test1.h.in1 b/Tests/QtAutogen/automoc_rerun/test1.h.in1 new file mode 100644 index 0000000..fee2c09 --- /dev/null +++ b/Tests/QtAutogen/automoc_rerun/test1.h.in1 @@ -0,0 +1,8 @@ +#include +class test1 : public QObject +{ + Q_OBJECT + public slots: + void onTst1() {} + void onTst2() {} +}; diff --git a/Tests/QtAutogen/automoc_rerun/test1.h.in2 b/Tests/QtAutogen/automoc_rerun/test1.h.in2 new file mode 100644 index 0000000..6531d10 --- /dev/null +++ b/Tests/QtAutogen/automoc_rerun/test1.h.in2 @@ -0,0 +1,7 @@ +#include +class test1 : public QObject +{ + Q_OBJECT + public slots: + void onTst1() {} +}; -- cgit v0.12