[Cmake-commits] CMake branch, next, updated. v3.0.0-rc1-979-gf818b71

Stephen Kelly steveire at gmail.com
Thu Mar 13 10:44:06 EDT 2014


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, next has been updated
       via  f818b7107b0a51cec4459047b19ed41f36ebb3d6 (commit)
       via  4f7fe6c564601b7eae2223f3c750abdeeda3e8a7 (commit)
       via  478cdf6065dff52e4c657070dfb5a97ae1287897 (commit)
      from  7c4e65d58164fddae72ec6032c99a44d590a6a17 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=f818b7107b0a51cec4459047b19ed41f36ebb3d6
commit f818b7107b0a51cec4459047b19ed41f36ebb3d6
Merge: 7c4e65d 4f7fe6c
Author:     Stephen Kelly <steveire at gmail.com>
AuthorDate: Thu Mar 13 10:44:04 2014 -0400
Commit:     CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Thu Mar 13 10:44:04 2014 -0400

    Merge topic 'fix-Qt4-moc-command-depends' into next
    
    4f7fe6c5 Qt4: Fix moc command dependencies for incremental build.
    478cdf60 CustomCommand: Evaluate generator expressions in DEPENDS.


http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=4f7fe6c564601b7eae2223f3c750abdeeda3e8a7
commit 4f7fe6c564601b7eae2223f3c750abdeeda3e8a7
Author:     Stephen Kelly <steveire at gmail.com>
AuthorDate: Tue Mar 4 11:03:37 2014 +0100
Commit:     Stephen Kelly <steveire at gmail.com>
CommitDate: Thu Mar 13 15:17:19 2014 +0100

    Qt4: Fix moc command dependencies for incremental build.
    
    Since commit v2.8.12~327^2 (Qt4Macros: Allow specifying a TARGET
    in invokations of macros., 2013-02-26), a parameters file is
    populated with moc arguments at generate-time.
    
    When the compile definitions or include directories change, the
    parameters file is updated but moc is not re-run in response.
    
    Fix that by making the moc invocation depend on the parameters file.
    
    Reported-At: https://bugreports.qt-project.org/browse/QTBUG-36970

diff --git a/Modules/Qt4Macros.cmake b/Modules/Qt4Macros.cmake
index 8baf896..aca8996 100644
--- a/Modules/Qt4Macros.cmake
+++ b/Modules/Qt4Macros.cmake
@@ -141,7 +141,7 @@ macro (QT4_CREATE_MOC_COMMAND infile outfile moc_flags moc_options moc_target)
   set(_moc_extra_parameters_file @${_moc_parameters_file})
   add_custom_command(OUTPUT ${outfile}
                       COMMAND Qt4::moc ${_moc_extra_parameters_file}
-                      DEPENDS ${infile}
+                      DEPENDS ${infile} ${_moc_parameters_file}
                       ${_moc_working_dir}
                       VERBATIM)
 endmacro ()
diff --git a/Tests/Qt4Targets/CMakeLists.txt b/Tests/Qt4Targets/CMakeLists.txt
index af9fc3f..60954a2 100644
--- a/Tests/Qt4Targets/CMakeLists.txt
+++ b/Tests/Qt4Targets/CMakeLists.txt
@@ -36,3 +36,24 @@ add_executable(Qt4WrapMacroTest WIN32 main_wrap_test.cpp ${moc_file})
 set_property(TARGET Qt4WrapMacroTest PROPERTY AUTOMOC OFF)
 target_include_directories(Qt4WrapMacroTest PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/interface")
 target_link_libraries(Qt4WrapMacroTest Qt4::QtGui)
+
+set(timeformat "%Y%j%H%M%S")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/IncrementalMocBuild")
+execute_process(COMMAND "${CMAKE_COMMAND}" -DADD_DEF=0 "-H${CMAKE_CURRENT_SOURCE_DIR}/IncrementalMoc" "-B${CMAKE_CURRENT_BINARY_DIR}/IncrementalMocBuild" "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}")
+execute_process(COMMAND "${CMAKE_COMMAND}" --build "${CMAKE_CURRENT_BINARY_DIR}/IncrementalMocBuild")
+file(TIMESTAMP "${CMAKE_CURRENT_BINARY_DIR}/IncrementalMocBuild/moc_foo.cpp" tsvar_before "${timeformat}")
+if (NOT tsvar_before)
+  message(SEND_ERROR "Unable to read timestamp from moc file from first build!")
+endif()
+
+execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) # Ensure that at least a second passes.
+execute_process(COMMAND "${CMAKE_COMMAND}" -DADD_DEF=1 "${CMAKE_CURRENT_BINARY_DIR}/IncrementalMocBuild" "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}")
+execute_process(COMMAND "${CMAKE_COMMAND}" --build "${CMAKE_CURRENT_BINARY_DIR}/IncrementalMocBuild")
+file(TIMESTAMP "${CMAKE_CURRENT_BINARY_DIR}/IncrementalMocBuild/moc_foo.cpp" tsvar_after "${timeformat}")
+if (NOT tsvar_after)
+  message(SEND_ERROR "Unable to read timestamp from moc file from first build!")
+endif()
+
+if (NOT tsvar_after GREATER tsvar_before)
+  message(SEND_ERROR "Rebuild did not re-create moc file. Before: ${tsvar_before}. After: ${tsvar_after}")
+endif()
diff --git a/Tests/Qt4Targets/IncrementalMoc/CMakeLists.txt b/Tests/Qt4Targets/IncrementalMoc/CMakeLists.txt
new file mode 100644
index 0000000..4ba0ced
--- /dev/null
+++ b/Tests/Qt4Targets/IncrementalMoc/CMakeLists.txt
@@ -0,0 +1,13 @@
+
+cmake_minimum_required(VERSION 2.8.12)
+project(IncrementalMoc)
+
+find_package(Qt4 REQUIRED)
+
+qt4_generate_moc(foo.h moc_foo.cpp)
+
+add_library(testlib foo.cpp moc_foo.cpp)
+target_link_libraries(testlib Qt4::QtCore)
+if (ADD_DEF)
+  target_compile_definitions(testlib PRIVATE NEW_DEF)
+endif()
diff --git a/Tests/Qt4Targets/IncrementalMoc/foo.cpp b/Tests/Qt4Targets/IncrementalMoc/foo.cpp
new file mode 100644
index 0000000..e924f7e
--- /dev/null
+++ b/Tests/Qt4Targets/IncrementalMoc/foo.cpp
@@ -0,0 +1,8 @@
+
+#include "foo.h"
+
+Foo::Foo()
+  : QObject(0)
+{
+
+}
diff --git a/Tests/Qt4Targets/IncrementalMoc/foo.h b/Tests/Qt4Targets/IncrementalMoc/foo.h
new file mode 100644
index 0000000..38d899f
--- /dev/null
+++ b/Tests/Qt4Targets/IncrementalMoc/foo.h
@@ -0,0 +1,9 @@
+
+#include <QObject>
+
+class Foo : QObject
+{
+  Q_OBJECT
+public:
+  Foo();
+};

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=478cdf6065dff52e4c657070dfb5a97ae1287897
commit 478cdf6065dff52e4c657070dfb5a97ae1287897
Author:     Stephen Kelly <steveire at gmail.com>
AuthorDate: Fri Mar 7 17:20:10 2014 +0100
Commit:     Stephen Kelly <steveire at gmail.com>
CommitDate: Thu Mar 13 15:17:19 2014 +0100

    CustomCommand: Evaluate generator expressions in DEPENDS.
    
    Rely on evaluation in cmCustomCommandGenerator for the generators.
    
    When tracing target dependencies, depend on the union of dependencies
    for all configurations.

diff --git a/Source/cmCustomCommandGenerator.cxx b/Source/cmCustomCommandGenerator.cxx
index a091cff..04a514f 100644
--- a/Source/cmCustomCommandGenerator.cxx
+++ b/Source/cmCustomCommandGenerator.cxx
@@ -90,8 +90,21 @@ std::vector<std::string> const& cmCustomCommandGenerator::GetOutputs() const
   return this->CC.GetOutputs();
 }
 
+#include <assert.h>
+
 //----------------------------------------------------------------------------
 std::vector<std::string> const& cmCustomCommandGenerator::GetDepends() const
 {
-  return this->CC.GetDepends();
+  this->Depends.clear();
+  std::vector<std::string> depends = this->CC.GetDepends();
+  for(std::vector<std::string>::const_iterator
+        i = depends.begin();
+      i != depends.end(); ++i)
+    {
+    cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = this->GE->Parse(*i);
+    std::string rr = cge->Evaluate(this->Makefile, this->Config);
+    cmSystemTools::ExpandListArgument(
+      rr, this->Depends);
+    }
+  return this->Depends;
 }
diff --git a/Source/cmCustomCommandGenerator.h b/Source/cmCustomCommandGenerator.h
index cbcdb41..a59f307 100644
--- a/Source/cmCustomCommandGenerator.h
+++ b/Source/cmCustomCommandGenerator.h
@@ -28,6 +28,7 @@ class cmCustomCommandGenerator
   bool OldStyle;
   bool MakeVars;
   cmGeneratorExpression* GE;
+  mutable std::vector<std::string> Depends;
 public:
   cmCustomCommandGenerator(cmCustomCommand const& cc,
                            const std::string& config,
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index db88749..fc6b881 100644
--- a/Source/cmGeneratorTarget.cxx
+++ b/Source/cmGeneratorTarget.cxx
@@ -604,6 +604,9 @@ private:
   bool IsUtility(std::string const& dep);
   void CheckCustomCommand(cmCustomCommand const& cc);
   void CheckCustomCommands(const std::vector<cmCustomCommand>& commands);
+  void FollowCommandDepends(cmCustomCommand const& cc,
+                            const std::string& config,
+                            std::set<std::string>& emitted);
 };
 
 //----------------------------------------------------------------------------
@@ -820,16 +823,48 @@ cmTargetTraceDependencies
     }
 
   // Queue the custom command dependencies.
-  std::vector<std::string> const& depends = cc.GetDepends();
-  for(std::vector<std::string>::const_iterator di = depends.begin();
-      di != depends.end(); ++di)
+  std::vector<std::string> configs;
+  std::set<std::string> emitted;
+  this->Makefile->GetConfigurations(configs);
+  if (configs.empty())
+    {
+    this->FollowCommandDepends(cc, "", emitted);
+    }
+  for(std::vector<std::string>::const_iterator ci = configs.begin();
+      ci != configs.end(); ++ci)
+    {
+    this->FollowCommandDepends(cc, *ci, emitted);
+    }
+}
+
+//----------------------------------------------------------------------------
+void cmTargetTraceDependencies::FollowCommandDepends(cmCustomCommand const& cc,
+                                              const std::string& config,
+                                              std::set<std::string>& emitted)
+{
+  cmListFileBacktrace lfbt;
+  std::vector<std::string> evaluatedDepends;
+  for(std::vector<std::string>::const_iterator di = cc.GetDepends().begin();
+      di != cc.GetDepends().end(); ++di)
+    {
+    cmGeneratorExpression ge(lfbt);
+    cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(*di);
+    cmSystemTools::ExpandListArgument(
+      cge->Evaluate(this->Makefile, config), evaluatedDepends);
+    }
+
+  for(std::vector<std::string>::const_iterator di = evaluatedDepends.begin();
+      di != evaluatedDepends.end(); ++di)
     {
     std::string const& dep = *di;
-    if(!this->IsUtility(dep))
+    if(emitted.insert(dep).second)
       {
-      // The dependency does not name a target and may be a file we
-      // know how to generate.  Queue it.
-      this->FollowName(dep);
+      if(!this->IsUtility(dep))
+        {
+        // The dependency does not name a target and may be a file we
+        // know how to generate.  Queue it.
+        this->FollowName(dep);
+        }
       }
     }
 }
diff --git a/Tests/CustomCommand/CMakeLists.txt b/Tests/CustomCommand/CMakeLists.txt
index bbae387..4a74aec 100644
--- a/Tests/CustomCommand/CMakeLists.txt
+++ b/Tests/CustomCommand/CMakeLists.txt
@@ -185,7 +185,7 @@ add_executable(CustomCommand
 # here to test adding the generation rule after referencing the
 # generated source in a target.
 add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/generated.c
-  DEPENDS generator
+  DEPENDS $<1:generator> $<0:does_not_exist>
   COMMAND generator
   ARGS ${PROJECT_BINARY_DIR}/generated.c
   )

-----------------------------------------------------------------------

Summary of changes:
 Modules/Qt4Macros.cmake                        |    2 +-
 Source/cmCustomCommandGenerator.cxx            |   15 +++++++-
 Source/cmCustomCommandGenerator.h              |    1 +
 Source/cmGeneratorTarget.cxx                   |   49 ++++++++++++++++++++----
 Tests/CustomCommand/CMakeLists.txt             |    2 +-
 Tests/Qt4Targets/CMakeLists.txt                |   21 ++++++++++
 Tests/Qt4Targets/IncrementalMoc/CMakeLists.txt |   13 +++++++
 Tests/Qt4Targets/IncrementalMoc/foo.cpp        |    8 ++++
 Tests/Qt4Targets/IncrementalMoc/foo.h          |    9 +++++
 9 files changed, 110 insertions(+), 10 deletions(-)
 create mode 100644 Tests/Qt4Targets/IncrementalMoc/CMakeLists.txt
 create mode 100644 Tests/Qt4Targets/IncrementalMoc/foo.cpp
 create mode 100644 Tests/Qt4Targets/IncrementalMoc/foo.h


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list