summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/cmIfCommand.cxx23
-rw-r--r--Source/cmIfCommand.h4
-rw-r--r--Tests/StringFileTest/CMakeLists.txt5
3 files changed, 31 insertions, 1 deletions
diff --git a/Source/cmIfCommand.cxx b/Source/cmIfCommand.cxx
index e745735..c9a6c08 100644
--- a/Source/cmIfCommand.cxx
+++ b/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())
{
diff --git a/Source/cmIfCommand.h b/Source/cmIfCommand.h
index e49c21f..90cf1a0 100644
--- a/Source/cmIfCommand.h
+++ b/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"
diff --git a/Tests/StringFileTest/CMakeLists.txt b/Tests/StringFileTest/CMakeLists.txt
index 044f271..c43bd07 100644
--- a/Tests/StringFileTest/CMakeLists.txt
+++ b/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)