summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOrkun Tokdemir <ilhanorkuntokdemir@gmail.com>2024-07-16 15:26:25 (GMT)
committerOrkun Tokdemir <ilhanorkuntokdemir@gmail.com>2024-07-17 16:12:04 (GMT)
commit5363bebc1e188c301c9bfe647fe41ae0cef92df1 (patch)
tree835eeda66ffbb40764dbb36b4e24136062da9b97
parent68ea116380b62b98da8c8492228b3d48d846920b (diff)
downloadCMake-5363bebc1e188c301c9bfe647fe41ae0cef92df1.zip
CMake-5363bebc1e188c301c9bfe647fe41ae0cef92df1.tar.gz
CMake-5363bebc1e188c301c9bfe647fe41ae0cef92df1.tar.bz2
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
-rw-r--r--Source/cmQtAutoGenInitializer.cxx7
-rw-r--r--Tests/RunCMake/Autogen_6/CMakeLists.txt3
-rw-r--r--Tests/RunCMake/Autogen_6/RunCMakeTest.cmake70
-rw-r--r--Tests/RunCMake/Autogen_6/multi_ui_files/CMakeLists.txt25
-rw-r--r--Tests/RunCMake/Autogen_6/multi_ui_files/src/main.cpp11
-rw-r--r--Tests/RunCMake/Autogen_6/multi_ui_files/src/mainwindow.cpp25
-rw-r--r--Tests/RunCMake/Autogen_6/multi_ui_files/src/mainwindow.h22
-rw-r--r--Tests/RunCMake/Autogen_6/multi_ui_files/src/mainwindow.ui33
-rw-r--r--Tests/RunCMake/Autogen_6/multi_ui_files/src/widget1.cpp22
-rw-r--r--Tests/RunCMake/Autogen_6/multi_ui_files/src/widget1.h23
-rw-r--r--Tests/RunCMake/Autogen_6/multi_ui_files/src/widget1.ui52
-rw-r--r--Tests/RunCMake/Autogen_6/multi_ui_files/src/widget2.cpp22
-rw-r--r--Tests/RunCMake/Autogen_6/multi_ui_files/src/widget2.h24
-rw-r--r--Tests/RunCMake/Autogen_6/multi_ui_files/src/widget2.ui45
14 files changed, 382 insertions, 2 deletions
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 <QApplication>
+
+#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 <QVBoxLayout>
+
+#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 <QMainWindow>
+
+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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>800</width>
+ <height>600</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>MainWindow</string>
+ </property>
+ <widget class="QWidget" name="centralwidget">
+ <layout class="QGridLayout" name="gridLayout"/>
+ </widget>
+ <widget class="QMenuBar" name="menubar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>800</width>
+ <height>22</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QStatusBar" name="statusbar"/>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
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 <QWidget>
+
+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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Widget1</class>
+ <widget class="QWidget" name="Widget1">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QFormLayout" name="formLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Input:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="lineEdit"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>OnTextChanged:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="OnTextChanged">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
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 <QWidget>
+
+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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Widget2</class>
+ <widget class="QWidget" name="Widget2">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QFormLayout" name="formLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Input:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="lineEdit"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>OnTextChanged:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="OnTextChanged">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>