From 1320e0768e57754b51294a00480927d50176bf02 Mon Sep 17 00:00:00 2001
From: Stephen Kelly <steveire@gmail.com>
Date: Mon, 18 Nov 2013 08:09:56 +0100
Subject: cmQtAutogen: Allow specifying depends for autogen targets.

Test this by generating files with a custom target, which moc
requires to be present when it is run.
---
 Help/manual/cmake-properties.7.rst       |  1 +
 Help/prop_tgt/AUTOGEN_TARGET_DEPENDS.rst | 14 ++++++++++++++
 Source/cmQtAutoGenerators.cxx            |  5 +++++
 Tests/QtAutogen/CMakeLists.txt           |  9 ++++++++-
 Tests/QtAutogen/generated.cpp            | 10 ++++++++++
 Tests/QtAutogen/generated.h              | 17 +++++++++++++++++
 Tests/QtAutogen/myinterface.h.in         | 14 ++++++++++++++
 7 files changed, 69 insertions(+), 1 deletion(-)
 create mode 100644 Help/prop_tgt/AUTOGEN_TARGET_DEPENDS.rst
 create mode 100644 Tests/QtAutogen/generated.cpp
 create mode 100644 Tests/QtAutogen/generated.h
 create mode 100644 Tests/QtAutogen/myinterface.h.in

diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst
index abc6fde..2a121da 100644
--- a/Help/manual/cmake-properties.7.rst
+++ b/Help/manual/cmake-properties.7.rst
@@ -80,6 +80,7 @@ Properties on Targets
    /prop_tgt/ARCHIVE_OUTPUT_DIRECTORY
    /prop_tgt/ARCHIVE_OUTPUT_NAME_CONFIG
    /prop_tgt/ARCHIVE_OUTPUT_NAME
+   /prop_tgt/AUTOGEN_TARGET_DEPENDS
    /prop_tgt/AUTOMOC_MOC_OPTIONS
    /prop_tgt/AUTOMOC
    /prop_tgt/AUTOUIC
diff --git a/Help/prop_tgt/AUTOGEN_TARGET_DEPENDS.rst b/Help/prop_tgt/AUTOGEN_TARGET_DEPENDS.rst
new file mode 100644
index 0000000..006c83a
--- /dev/null
+++ b/Help/prop_tgt/AUTOGEN_TARGET_DEPENDS.rst
@@ -0,0 +1,14 @@
+AUTOGEN_TARGET_DEPENDS
+----------------------
+
+Target dependencies of the corresponding ``_automoc`` target.
+
+Targets which have their :prop_tgt:`AUTOMOC` target set to true have a
+corresponding ``_automoc`` target which is used to autogenerate generate moc
+files.  As this ``_automoc`` target is created at generate-time, it is not
+possible to define dependencies of it, such as to create inputs for the moc
+executable.
+
+The ``AUTOGEN_TARGET_DEPENDS`` target can be set instead to a list of dependencies
+for the ``_automoc`` target. The buildsystem will be generated to depend on its
+contents.
diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx
index 35717ce..a7d20ae 100644
--- a/Source/cmQtAutoGenerators.cxx
+++ b/Source/cmQtAutoGenerators.cxx
@@ -204,6 +204,11 @@ bool cmQtAutoGenerators::InitializeAutogenTarget(cmTarget* target)
                                     "", makefile->GetCurrentOutputDirectory());
 
   std::vector<std::string> depends;
+  if (const char *autogenDepends =
+                                target->GetProperty("AUTOGEN_TARGET_DEPENDS"))
+    {
+    cmSystemTools::ExpandListArgument(autogenDepends, depends);
+    }
   std::vector<std::string> toolNames;
   if (target->GetPropertyAsBool("AUTOMOC"))
     {
diff --git a/Tests/QtAutogen/CMakeLists.txt b/Tests/QtAutogen/CMakeLists.txt
index 7991c4e..9dd5289 100644
--- a/Tests/QtAutogen/CMakeLists.txt
+++ b/Tests/QtAutogen/CMakeLists.txt
@@ -43,10 +43,17 @@ add_library(codeeditorLib STATIC codeeditor.cpp)
 
 add_library(privateSlot OBJECT private_slot.cpp)
 
+add_custom_target(generate_moc_input
+  COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/myinterface.h.in" "${CMAKE_CURRENT_BINARY_DIR}"
+  COMMAND ${CMAKE_COMMAND} -E rename "${CMAKE_CURRENT_BINARY_DIR}/myinterface.h.in" "${CMAKE_CURRENT_BINARY_DIR}/myinterface.h"
+)
+# set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/myinterface.h" PROPERTIES GENERATED TRUE)
+
 add_executable(QtAutogen main.cpp calwidget.cpp foo.cpp blub.cpp bar.cpp abc.cpp
                xyz.cpp yaf.cpp gadget.cpp $<TARGET_OBJECTS:privateSlot>
-               test.qrc resourcetester.cpp
+               test.qrc resourcetester.cpp generated.cpp
 )
+set_property(TARGET QtAutogen APPEND PROPERTY AUTOGEN_TARGET_DEPENDS generate_moc_input)
 
 set_target_properties(QtAutogen codeeditorLib privateSlot PROPERTIES AUTOMOC TRUE)
 
diff --git a/Tests/QtAutogen/generated.cpp b/Tests/QtAutogen/generated.cpp
new file mode 100644
index 0000000..f53bf53
--- /dev/null
+++ b/Tests/QtAutogen/generated.cpp
@@ -0,0 +1,10 @@
+
+#include "generated.h"
+
+Generated::Generated(QObject *parent)
+  : QObject(parent)
+{
+
+}
+
+#include "moc_generated.cpp"
diff --git a/Tests/QtAutogen/generated.h b/Tests/QtAutogen/generated.h
new file mode 100644
index 0000000..dd22489
--- /dev/null
+++ b/Tests/QtAutogen/generated.h
@@ -0,0 +1,17 @@
+
+#ifndef GENERATED_H
+#define GENERATED_H
+
+#include <QObject>
+
+#include "myinterface.h"
+
+class Generated : public QObject, MyInterface
+{
+  Q_OBJECT
+  Q_INTERFACES(MyInterface)
+public:
+  explicit Generated(QObject *parent = 0);
+};
+
+#endif
diff --git a/Tests/QtAutogen/myinterface.h.in b/Tests/QtAutogen/myinterface.h.in
new file mode 100644
index 0000000..c6c0ba1
--- /dev/null
+++ b/Tests/QtAutogen/myinterface.h.in
@@ -0,0 +1,14 @@
+
+#ifndef MYINTERFACE_H
+#define MYINTERFACE_H
+
+#include <QObject>
+
+class MyInterface
+{
+
+};
+
+Q_DECLARE_INTERFACE(MyInterface, "org.cmake.example.MyInterface")
+
+#endif
-- 
cgit v0.12