diff --git a/Source/cmGetFilenameComponentCommand.cxx b/Source/cmGetFilenameComponentCommand.cxx index 6ca5930958..febece0653 100644 --- a/Source/cmGetFilenameComponentCommand.cxx +++ b/Source/cmGetFilenameComponentCommand.cxx @@ -107,9 +107,15 @@ bool cmGetFilenameComponentCommand(std::vector const& args, } } } - // Collapse the path to its simplest form. - result = cmSystemTools::CollapseFullPath(filename, baseDir); - if (args[2] == "REALPATH") { + if (args[2] == "ABSOLUTE") { + // Collapse the path to its simplest form. + result = cmSystemTools::CollapseFullPath(filename, baseDir); + } else { + // Convert relative paths to absolute paths + result = filename; + if (!cmSystemTools::FileIsFullPath(result)) { + result = cmStrCat(baseDir, '/', result); + } // Resolve symlinks if possible result = cmSystemTools::GetRealPath(result); } diff --git a/Tests/RunCMake/get_filename_component/KnownComponents.cmake b/Tests/RunCMake/get_filename_component/KnownComponents.cmake index 34af12eb04..93f9270faf 100644 --- a/Tests/RunCMake/get_filename_component/KnownComponents.cmake +++ b/Tests/RunCMake/get_filename_component/KnownComponents.cmake @@ -159,3 +159,11 @@ foreach(thisVar ${non_cache_vars}) message(SEND_ERROR "${thisVar} not found in regular variable list.") endif() endforeach() + +if(UNIX) + file(MAKE_DIRECTORY . "${CMAKE_CURRENT_BINARY_DIR}/subdir") + file(CREATE_LINK . "${CMAKE_CURRENT_BINARY_DIR}/subdir/symlink-to-dot" SYMBOLIC) + get_filename_component(realpath_actual "${CMAKE_CURRENT_BINARY_DIR}/subdir/symlink-to-dot/.." REALPATH) + get_filename_component(realpath_expect "${CMAKE_CURRENT_BINARY_DIR}" REALPATH) + check("symlink parent" "${realpath_actual}" "${realpath_expect}") +endif(UNIX)