From 5363bebc1e188c301c9bfe647fe41ae0cef92df1 Mon Sep 17 00:00:00 2001 From: Orkun Tokdemir Date: Tue, 16 Jul 2024 17:26:25 +0200 Subject: Autogen: Fix compilation of unchanged source files Since generated `ui` headers are added as byproducts of the autogen target, it causes to compilation of unchanged files. This commits adds generated `ui` headers to byproducts of the timestamp target instead of the autogen target's. Fixes: #25436 Fixes: #26135 --- Source/cmQtAutoGenInitializer.cxx | 7 ++- Tests/RunCMake/Autogen_6/CMakeLists.txt | 3 + Tests/RunCMake/Autogen_6/RunCMakeTest.cmake | 70 ++++++++++++++++++++++ .../Autogen_6/multi_ui_files/CMakeLists.txt | 25 ++++++++ .../RunCMake/Autogen_6/multi_ui_files/src/main.cpp | 11 ++++ .../Autogen_6/multi_ui_files/src/mainwindow.cpp | 25 ++++++++ .../Autogen_6/multi_ui_files/src/mainwindow.h | 22 +++++++ .../Autogen_6/multi_ui_files/src/mainwindow.ui | 33 ++++++++++ .../Autogen_6/multi_ui_files/src/widget1.cpp | 22 +++++++ .../Autogen_6/multi_ui_files/src/widget1.h | 23 +++++++ .../Autogen_6/multi_ui_files/src/widget1.ui | 52 ++++++++++++++++ .../Autogen_6/multi_ui_files/src/widget2.cpp | 22 +++++++ .../Autogen_6/multi_ui_files/src/widget2.h | 24 ++++++++ .../Autogen_6/multi_ui_files/src/widget2.ui | 45 ++++++++++++++ 14 files changed, 382 insertions(+), 2 deletions(-) create mode 100644 Tests/RunCMake/Autogen_6/CMakeLists.txt create mode 100644 Tests/RunCMake/Autogen_6/RunCMakeTest.cmake create mode 100644 Tests/RunCMake/Autogen_6/multi_ui_files/CMakeLists.txt create mode 100644 Tests/RunCMake/Autogen_6/multi_ui_files/src/main.cpp create mode 100644 Tests/RunCMake/Autogen_6/multi_ui_files/src/mainwindow.cpp create mode 100644 Tests/RunCMake/Autogen_6/multi_ui_files/src/mainwindow.h create mode 100644 Tests/RunCMake/Autogen_6/multi_ui_files/src/mainwindow.ui create mode 100644 Tests/RunCMake/Autogen_6/multi_ui_files/src/widget1.cpp create mode 100644 Tests/RunCMake/Autogen_6/multi_ui_files/src/widget1.h create mode 100644 Tests/RunCMake/Autogen_6/multi_ui_files/src/widget1.ui create mode 100644 Tests/RunCMake/Autogen_6/multi_ui_files/src/widget2.cpp create mode 100644 Tests/RunCMake/Autogen_6/multi_ui_files/src/widget2.h create mode 100644 Tests/RunCMake/Autogen_6/multi_ui_files/src/widget2.ui diff --git a/Source/cmQtAutoGenInitializer.cxx b/Source/cmQtAutoGenInitializer.cxx index c95be77..915b2ef 100644 --- a/Source/cmQtAutoGenInitializer.cxx +++ b/Source/cmQtAutoGenInitializer.cxx @@ -1340,9 +1340,12 @@ bool cmQtAutoGenInitializer::InitAutogenTarget() } if (this->Uic.Enabled) { - for (const auto& file : this->Uic.UiHeaders) { + // Make all ui_*.h files byproducts of the ${target}_autogen/timestamp + // custom command if the generation of depfile is enabled. + auto& byProducts = useDepfile ? timestampByproducts : autogenByproducts; + for (auto const& file : this->Uic.UiHeaders) { this->AddGeneratedSource(file.first, this->Uic); - autogenByproducts.push_back(file.second); + byProducts.push_back(file.second); } } diff --git a/Tests/RunCMake/Autogen_6/CMakeLists.txt b/Tests/RunCMake/Autogen_6/CMakeLists.txt new file mode 100644 index 0000000..2632ffa --- /dev/null +++ b/Tests/RunCMake/Autogen_6/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.16) +project(${RunCMake_TEST} NONE) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/Autogen_6/RunCMakeTest.cmake b/Tests/RunCMake/Autogen_6/RunCMakeTest.cmake new file mode 100644 index 0000000..b629a5c --- /dev/null +++ b/Tests/RunCMake/Autogen_6/RunCMakeTest.cmake @@ -0,0 +1,70 @@ +include(RunCMake) +include(Autogen_common/utils) + +if (DEFINED with_qt_version) + set(RunCMake_TEST_OPTIONS + -Dwith_qt_version=${with_qt_version} + "-DQt${with_qt_version}_DIR:PATH=${Qt${with_qt_version}_DIR}" + "-DCMAKE_PREFIX_PATH:STRING=${CMAKE_PREFIX_PATH}" + ) + if (QtCore_VERSION VERSION_GREATER_EQUAL 5.15.0) + macro(set_test_variables_for_unwanted_builds) + if (RunCMake_GENERATOR MATCHES "Ninja") + set(RunCMake_TEST_NOT_EXPECT_stdout "widget2.cpp.o.d|mainwindow.cpp.o.d") + elseif (RunCMake_GENERATOR MATCHES "Make") + set(RunCMake_TEST_NOT_EXPECT_stdout "Building CXX object multi_ui_files/CMakeFiles/example.dir/src/widget2.cpp.o|\ + Building CXX object multi_ui_files/CMakeFiles/example.dir/src/mainwindow.cpp.o") + elseif (RunCMake_GENERATOR MATCHES "Visual Studio") + set(RunCMake_TEST_NOT_EXPECT_stdout "widget2.cpp|mainwindow.cpp") + elseif (RunCMake_GENERATOR MATCHES "Xcode") + set(RunCMake_TEST_NOT_EXPECT_stdout "widget2.cpp|mainwindow.cpp") + endif() + endmacro() + + function(uic_build_test test_name binary_dir source_dir file_to_touch test_config) + set(RunCMake_TEST_BINARY_DIR ${binary_dir}) + set(RunCMake_TEST_SOURCE_DIR ${source_dir}) + + if (NOT RunCMake_GENERATOR MATCHES "Visual Studio") + set(test_verbose_arg "--verbose") + endif() + if (RunCMake_GENERATOR_IS_MULTI_CONFIG) + set(config_desc "-${test_config}") + set(RunCMake_TEST_VARIANT_DESCRIPTION "${config_desc}") + set(multiconfig_config_arg "--config ${test_config}") + else() + set(RunCMake_TEST_VARIANT_DESCRIPTION "") + set(config_arg "-DCMAKE_BUILD_TYPE=Debug") + endif() + run_cmake_with_options(${test_name} ${RunCMake_TEST_OPTIONS} ${config_arg}) + set(RunCMake_TEST_NO_CLEAN 1) + run_cmake_command("${test_name}-build" ${CMAKE_COMMAND} --build . ${test_verbose_arg} ${multiconfig_config_arg}) + + file(TOUCH ${file_to_touch}) + set(RunCMake_TEST_VARIANT_DESCRIPTION "${config_desc}-first_build_after_touching") + set_test_variables_for_unwanted_builds() + run_cmake_command("${test_name}-build" ${CMAKE_COMMAND} --build . ${test_verbose_arg} ${multiconfig_config_arg}) + message(STATUS "${test_name}-build${config_desc}-Only build files that were touched were built - PASSED") + endfunction() + + if(RunCMake_GENERATOR MATCHES "Make|Ninja|Visual Studio|Xcode") + if (RunCMake_GENERATOR_IS_MULTI_CONFIG) + set(configs "Debug" "Release") + else() + set(configs "single_config") + endif() + + foreach(config IN ITEMS ${configs}) + if (NOT ${config} STREQUAL "single_config") + set(config_desc "-${config}") + endif() + + uic_build_test(multi_ui_files_touch_ui ${RunCMake_BINARY_DIR}/multi_ui_files_touch_ui${config_desc}-build + ${RunCMake_SOURCE_DIR}/multi_ui_files ${RunCMake_SOURCE_DIR}/multi_ui_files/src/widget1.ui ${config}) + + uic_build_test(multi_ui_files_touch_cpp ${RunCMake_BINARY_DIR}/multi_ui_files_touch_cpp${config_desc}-build + ${RunCMake_SOURCE_DIR}/multi_ui_files ${RunCMake_SOURCE_DIR}/multi_ui_files/src/widget1.cpp ${config}) + endforeach() + endif() + endif() +endif () diff --git a/Tests/RunCMake/Autogen_6/multi_ui_files/CMakeLists.txt b/Tests/RunCMake/Autogen_6/multi_ui_files/CMakeLists.txt new file mode 100644 index 0000000..f472337 --- /dev/null +++ b/Tests/RunCMake/Autogen_6/multi_ui_files/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 3.5) + +project(UicIncrementalBuild LANGUAGES CXX) + +find_package(Qt${with_qt_version} REQUIRED COMPONENTS Core Widgets Gui) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) + +add_executable(example + src/mainwindow.ui + src/widget1.ui + src/widget2.ui + src/mainwindow.h + src/widget1.h + src/widget2.h + src/main.cpp + src/mainwindow.cpp + src/widget1.cpp + src/widget2.cpp +) + +target_link_libraries(example PRIVATE Qt${with_qt_version}::Widgets + Qt${with_qt_version}::Core + Qt${with_qt_version}::Gui) diff --git a/Tests/RunCMake/Autogen_6/multi_ui_files/src/main.cpp b/Tests/RunCMake/Autogen_6/multi_ui_files/src/main.cpp new file mode 100644 index 0000000..8d76ad9 --- /dev/null +++ b/Tests/RunCMake/Autogen_6/multi_ui_files/src/main.cpp @@ -0,0 +1,11 @@ +#include + +#include "mainwindow.h" + +int main(int argc, char* argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/Tests/RunCMake/Autogen_6/multi_ui_files/src/mainwindow.cpp b/Tests/RunCMake/Autogen_6/multi_ui_files/src/mainwindow.cpp new file mode 100644 index 0000000..eb3d366 --- /dev/null +++ b/Tests/RunCMake/Autogen_6/multi_ui_files/src/mainwindow.cpp @@ -0,0 +1,25 @@ +#include "mainwindow.h" + +#include + +#include "src/ui_mainwindow.h" +#include "widget1.h" + +MainWindow::MainWindow(QWidget* parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); + auto layout = new QVBoxLayout; + layout->addWidget(new Widget1); + + QWidget* w = new QWidget(this); + w->setLayout(layout); + + setCentralWidget(w); +} + +MainWindow::~MainWindow() +{ + delete ui; +} diff --git a/Tests/RunCMake/Autogen_6/multi_ui_files/src/mainwindow.h b/Tests/RunCMake/Autogen_6/multi_ui_files/src/mainwindow.h new file mode 100644 index 0000000..3e64459 --- /dev/null +++ b/Tests/RunCMake/Autogen_6/multi_ui_files/src/mainwindow.h @@ -0,0 +1,22 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include + +QT_BEGIN_NAMESPACE +namespace Ui { +class MainWindow; +} +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT +public: + MainWindow(QWidget* parent = nullptr); + ~MainWindow(); + +private: + Ui::MainWindow* ui; +}; +#endif // MAINWINDOW_H diff --git a/Tests/RunCMake/Autogen_6/multi_ui_files/src/mainwindow.ui b/Tests/RunCMake/Autogen_6/multi_ui_files/src/mainwindow.ui new file mode 100644 index 0000000..828d7c1 --- /dev/null +++ b/Tests/RunCMake/Autogen_6/multi_ui_files/src/mainwindow.ui @@ -0,0 +1,33 @@ + + + MainWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + + + + + 0 + 0 + 800 + 22 + + + + + + + + diff --git a/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget1.cpp b/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget1.cpp new file mode 100644 index 0000000..05657ce --- /dev/null +++ b/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget1.cpp @@ -0,0 +1,22 @@ +#include "widget1.h" + +#include "src/ui_widget1.h" + +Widget1::Widget1(QWidget* parent) + : QWidget(parent) + , ui(new Ui::Widget1) +{ + ui->setupUi(this); + connect(ui->lineEdit, SIGNAL(textChanged(const QString&)), this, + SLOT(onTextChanged(const QString&))); +} + +Widget1::~Widget1() +{ + delete ui; +} + +void Widget1::onTextChanged(const QString& text) +{ + ui->OnTextChanged->setText(text); +} diff --git a/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget1.h b/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget1.h new file mode 100644 index 0000000..8c28d6d --- /dev/null +++ b/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget1.h @@ -0,0 +1,23 @@ +#ifndef WIDGET1_H +#define WIDGET1_H + +#include + +namespace Ui { +class Widget1; +} + +class Widget1 : public QWidget +{ + Q_OBJECT +public: + explicit Widget1(QWidget* parent = nullptr); + ~Widget1(); +public slots: + void onTextChanged(const QString& text); + +private: + Ui::Widget1* ui; +}; + +#endif // WIDGET1_H diff --git a/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget1.ui b/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget1.ui new file mode 100644 index 0000000..db0c58d --- /dev/null +++ b/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget1.ui @@ -0,0 +1,52 @@ + + + Widget1 + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + Input: + + + + + + + + + + OnTextChanged: + + + + + + + + + + + + + + TextLabel + + + + + + + + diff --git a/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget2.cpp b/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget2.cpp new file mode 100644 index 0000000..7f4bbaf --- /dev/null +++ b/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget2.cpp @@ -0,0 +1,22 @@ +#include "widget2.h" + +#include "src/ui_widget2.h" + +Widget2::Widget2(QWidget* parent) + : QWidget(parent) + , ui(new Ui::Widget2) +{ + ui->setupUi(this); + connect(ui->lineEdit, SIGNAL(textChanged(const QString&)), this, + SLOT(onTextChanged(const QString&))); +} + +Widget2::~Widget2() +{ + delete ui; +} + +void Widget2::onTextChanged(const QString& text) +{ + ui->OnTextChanged->setText(text); +} diff --git a/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget2.h b/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget2.h new file mode 100644 index 0000000..41d7e1f --- /dev/null +++ b/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget2.h @@ -0,0 +1,24 @@ +#ifndef WIDGET2_H +#define WIDGET2_H + +#include + +namespace Ui { +class Widget2; +} + +class Widget2 : public QWidget +{ + Q_OBJECT + +public: + explicit Widget2(QWidget* parent = nullptr); + ~Widget2(); +public slots: + void onTextChanged(const QString& text); + +private: + Ui::Widget2* ui; +}; + +#endif // WIDGET2_H diff --git a/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget2.ui b/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget2.ui new file mode 100644 index 0000000..facf467 --- /dev/null +++ b/Tests/RunCMake/Autogen_6/multi_ui_files/src/widget2.ui @@ -0,0 +1,45 @@ + + + Widget2 + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + Input: + + + + + + + + + + OnTextChanged: + + + + + + + + + + + + + + + -- cgit v0.12