Browse Source

ENH: Patch from Alex for adding IF(FILE_IS_NEWER). I also added a test.

Brad King 19 years ago
parent
commit
6449089436
3 changed files with 31 additions and 1 deletions
  1. 22 1
      Source/cmIfCommand.cxx
  2. 4 0
      Source/cmIfCommand.h
  3. 5 0
      Tests/StringFileTest/CMakeLists.txt

+ 22 - 1
Source/cmIfCommand.cxx

@@ -226,7 +226,7 @@ bool cmIfCommand::IsTrue(const std::vector<std::string> &args,
         IncrementArguments(newArgs,argP1,argP2);
         reducible = 1;
         }
-      // does a file exist
+      // does a directory with this name exist
       if (*arg == "IS_DIRECTORY" && argP1  != newArgs.end())
         {
         if(cmSystemTools::FileIsDirectory((argP1)->c_str()))
@@ -242,6 +242,27 @@ bool cmIfCommand::IsTrue(const std::vector<std::string> &args,
         IncrementArguments(newArgs,argP1,argP2);
         reducible = 1;
         }
+      // is file A newer than file B
+      if (*arg == "FILE_IS_NEWER" && argP1  != newArgs.end() && argP2  != newArgs.end())
+        {
+        int fileIsNewer=0;
+        bool success=cmSystemTools::FileTimeCompare((argP1)->c_str(), (argP2)->c_str(),
+                              &fileIsNewer);
+        if(success==false || fileIsNewer==1 || fileIsNewer==0)
+          {
+          *arg = "1";
+          }
+        else 
+          {
+          *arg = "0";
+          }
+
+        newArgs.erase(argP2);
+        newArgs.erase(argP1);
+        argP1 = arg;
+        IncrementArguments(newArgs,argP1,argP2);
+        reducible = 1;
+        }
       // does a command exist
       if (*arg == "COMMAND" && argP1  != newArgs.end())
         {

+ 4 - 0
Source/cmIfCommand.h

@@ -128,6 +128,10 @@ public:
       "  IF(EXISTS directory-name)\n"
       "True if the named file or directory exists.  "
       "Behavior is well-defined only for full paths.\n"
+      "  IF(FILE_IS_NEWER file1 file2)\n"
+      "True if file1 is newer than file2 or if one of the two files "
+      "doesn't exist. "
+      "Behavior is well-defined only for full paths.\n"
       "  IF(IS_DIRECTORY directory-name)\n"
       "True if the given name is a directory.  "
       "Behavior is well-defined only for full paths.\n"

+ 5 - 0
Tests/StringFileTest/CMakeLists.txt

@@ -75,6 +75,11 @@ FOREACH(var
   FILE(APPEND "${file}" "#define ${var} \"${${var}}\"\n")
 ENDFOREACH(var)
 
+# Verify that the file was created recently.
+IF(NOT FILE_IS_NEWER "${file}" "${CMAKE_CURRENT_SOURCE_DIR}/InputFile.h.in")
+  MESSAGE(FATAL_ERROR "IF(FILE_IS_NEWER) does not seem to work.")
+ENDIF(NOT FILE_IS_NEWER "${file}" "${CMAKE_CURRENT_SOURCE_DIR}/InputFile.h.in")
+
 # Test configuration of the string
 SET(TEST_DEFINED 123)
 SET(TEST_NOT_DEFINED)