CMake: convert relative path to absolute path, with assembly directory as current directory

In CMake, you can convert relative paths to absolute paths using

get_filename_component(ABSOLUTE_PATH ${RELATIVE_PATH} ABSOLUTE) 

However, paths such as ../../other_program/ are based on the source directory (i.e., the directory where the CMakeLists.txt files are located) and not the build directory (i.e. the directory from which cmake is called). This can lead to some confusion if you specify a relative path as a command line parameter.

Is there a way to tell get_filename_component that it should base the relative path on the current binary directory instead of the current source directory?

+7
cmake
source share
3 answers

From docs get_filename_component (highlighting me)

 get_filename_component(<VAR> <FileName> <COMP> [BASE_DIR <BASE_DIR>] [CACHE]) 

Set <VAR> to the absolute path <FileName> , where <COMP> is one of:

ABSOLUTE = Full path to a file REALPATH = Full path to an existing file with allowed symbolic links

If the provided <FileName> is a relative path, it is evaluated relative to the given base directory <BASE_DIR> . If the base directory is not specified, the default base directory will be CMAKE_CURRENT_SOURCE_DIR .

Paths are returned using a slash and do not have trailing slashes. If the optional CACHE argument is specified, the result variable is added to the cache.

So you use:

 get_filename_component(buildDirRelFilePath "${myFile}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") 

To convert an absolute path to a file into relative paths, you can use the file command:

 file(RELATIVE_PATH <variable> <directory> <file>) 

Compute the relative path from a <directory> to a <file> and save it in <variable> .

 file(RELATIVE_PATH buildDirRelFilePath "${CMAKE_BINARY_DIR}" "${myFile}") 
+7
source share

You can check if the path is absolute with if(IS_ABSOLUTE path) , and if it does not add the base directory you want. For example,

 if(NOT IS_ABSOLUTE ${p}) set(p "${CMAKE_CURRENT_BINARY_DIR}/${p}") endif() 
+3
source share
 get_filename_component(MY_RESULT_ABSOLUTE_PATH_VAR "${CMAKE_CURRENT_LIST_DIR}/${MY_RELATIVE_PATH_VAR}" ABSOLUTE) 
+3
source share

All Articles