Browse Source

Help: Document behavior of if(EXISTS,IS_DIRECTORY) for empty paths

Document and add explicit tests for empty string input:
`if(EXISTS "")` and `if(IS_DIRECTORY "")` are always false.
This avoids need for users to do extra checks due to
CMake non-short-circuit logic as below:

    if("${p}")
      if(EXISTS "${p}")
scivision 2 years ago
parent
commit
a1dc38a567

+ 6 - 2
Help/command/if.rst

@@ -165,6 +165,8 @@ File Operations
  Resolves symbolic links, i.e. if the named file or directory is a
  symbolic link, returns true if the target of the symbolic link exists.
 
+ False if the given path is an empty string.
+
 ``if(file1 IS_NEWER_THAN file2)``
  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.  If the file
@@ -173,10 +175,12 @@ File Operations
  of a tie.  This includes the case of passing the same file name for
  both file1 and file2.
 
-``if(IS_DIRECTORY path-to-directory)``
- True if the given name is a directory.  Behavior is well-defined only
+``if(IS_DIRECTORY path)``
+ True if ``path`` is a directory.  Behavior is well-defined only
  for full paths.
 
+ False if the given path is an empty string.
+
 ``if(IS_SYMLINK file-name)``
  True if the given name is a symbolic link.  Behavior is well-defined
  only for full paths.

+ 3 - 0
Tests/RunCMake/if/IsDirectoryLong.cmake

@@ -8,3 +8,6 @@ if(IS_DIRECTORY "${d}/")
 else()
   message(STATUS "Directory path with length ${dl} correctly does not exist.")
 endif()
+if(IS_DIRECTORY "")
+  message(FATAL_ERROR "IS_DIRECTORY \"\" should not exist")
+endif()

+ 1 - 0
Tests/RunCMake/if/RunCMakeTest.cmake

@@ -1,6 +1,7 @@
 include(RunCMake)
 
 run_cmake(InvalidArgument1)
+run_cmake(exists)
 run_cmake(IsDirectory)
 run_cmake(IsDirectoryLong)
 run_cmake(duplicate-deep-else)

+ 3 - 0
Tests/RunCMake/if/exists.cmake

@@ -0,0 +1,3 @@
+if(EXISTS "")
+  message(FATAL_ERROR "EXISTS \"\" should not exist")
+endif()