The following issue has been SUBMITTED. 
====================================================================== 
http://public.kitware.com/Bug/view.php?id=15743 
====================================================================== 
Reported By:                Andreas Schuh
Assigned To:                
====================================================================== 
Project:                    CMake
Issue ID:                   15743
Category:                   CMake
Reproducibility:            always
Severity:                   minor
Priority:                   normal
Status:                     new
====================================================================== 
Date Submitted:             2015-09-15 11:15 EDT
Last Modified:              2015-09-15 11:15 EDT
====================================================================== 
Summary:                    get_filename_component turns real path to ABSOLUTE
path
Description: 
I encountered a very strange behaviour of the get_filename_component using the
ABSOLUTE subcommand. The given input path was before turned into a real path
with symbolic links resolved using the REALPATH subcommand. Calling
get_filename_component with ABSOLUTE on this real path I would have expected an
unchanged path. Instead, ABSOLUTE returns a path with symbolic links again! Note
that both the source and build directory are located in different symlinked
directory paths.

Looking at the C++ code of the get_filename_component command revealed some
strange call to SystemTools::CheckTranslationPath in
SystemTools::CollapseFullPath which implements the ABSOLUTE subcommand. There is
also a commented line beforehand with a comment expecting to break something by
doing so... the call to SystemTools::AddTranslationPath.

The issue affects also previous releases (tried 3.2.2 and 2.8.12.2).

IMHO I find it extremely strange that get_filename_component needs such
translation table (without having digged deeper to fully understand its
purpose). Cleaning a path or splitting it into parts should be a purely string
based operation without actual file system information.

Steps to Reproduce: 
1. Create directory hierarchy with symlinks similar to my scenario:

  Real source directory:
    /vol/medic01/users/as12312/Code/CMakeGetFileNameComponentIssue

  Real build directory:
    /vol/biomedic/users/as12312/build/merapi/cmake-get_filename_component-issue

  Symbolic links:
    /homes/as12312/Code -> /vol/medic01/users/as12312/Code
    /homes/as12312/opt -> /vol/biomedic/users/as12312

2. Copy attached CMakeLists.txt to the source directory
3. Change into the symlinked build directory and use the symbolic link to the
source directory as argument to CMake

  cd /homes/as12312/opt/build/merapi/cmake-get_filename_component-issue
  cmake /homes/as12321/Code/CMakeGetFileNameComponentIssue

The output is the following:

CMAKE_SOURCE_DIR:
        REALPATH = 
/vol/medic01/users/as12312/Code/CMakeGetFileNameComponentIssue
        ABSOLUTE = 
/vol/medic01/users/as12312/Code/CMakeGetFileNameComponentIssue
CMAKE_BINARY_DIR:
        REALPATH =
/vol/biomedic/users/as12312/build/merapi/cmake-get_filename_component-issue
        ABSOLUTE = 
/homes/as12312/opt/build/merapi/cmake-get_filename_component-issue
-- Configuring done
-- Generating done
-- Build files have been written to:
/homes/as12312/opt/build/merapi/cmake-get_filename_component-issue

Note that the ABSOLUTE return value of get_filename_component of the real input
path contains symbolic links again!
====================================================================== 

Issue History 
Date Modified    Username       Field                    Change               
====================================================================== 
2015-09-15 11:15 Andreas Schuh  New Issue                                    
2015-09-15 11:15 Andreas Schuh  File Added: CMakeLists.txt                    
======================================================================

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers

Reply via email to