CMake: Convert relative path to absolute path, with build directory as current directory
Solution 1
From the docs of get_filename_component
(highlighting be me)
:
get_filename_component(<VAR> <FileName> <COMP> [BASE_DIR <BASE_DIR>] [CACHE])
Set
<VAR>
to the absolute path of<FileName>
, where<COMP>
is one of:
ABSOLUTE
= Full path to fileREALPATH
= Full path to existing file with symlinks resolvedIf the provided
<FileName>
is a relative path, it is evaluated relative to the given base directory<BASE_DIR>
. If no base directory is provided, the default base directory will beCMAKE_CURRENT_SOURCE_DIR
.Paths are returned with forward slashes and have no trailing slashes. If the optional
CACHE
argument is specified, the result variable is added to the cache.
Thus, you use:
get_filename_component(buildDirRelFilePath "${myFile}"
REALPATH BASE_DIR "${CMAKE_BINARY_DIR}")
To convert an absolute path to a file into a relative paths, you might use the file
command:
file(RELATIVE_PATH <variable> <directory> <file>)
Compute the relative path from a
<directory>
to a<file>
and store it in the<variable>
.
file(RELATIVE_PATH buildDirRelFilePath "${CMAKE_BINARY_DIR}" "${myFile}")
Solution 2
get_filename_component(MY_RESULT_ABSOLUTE_PATH_VAR
"${CMAKE_CURRENT_LIST_DIR}/${MY_RELATIVE_PATH_VAR}"
ABSOLUTE)
Solution 3
You could check whether path is absolute with if(IS_ABSOLUTE path)
and if it isn't prepend the base directory you want. For example,
if(NOT IS_ABSOLUTE ${p})
set(p "${CMAKE_CURRENT_BINARY_DIR}/${p}")
endif()

Julian Helfferich
I'm a scientific software developer with a PhD in physics. Working for Avant-garde Materials Simulation I am busy with all kinds of things, from getting the new server room running, setting up a HPC environment, to streamlining the post-processing of our crystal structure prediction software... Former software projects: SSAGES, the new Metadynamics simulation package developed in cooperation of Argonne Nat. Labs, UChicago, and U Notre Dame. Plus, I am a volunteer bug-fixer for some small KDE open source desktop apps: KBlocks, where I somehow ended up being the "official" maintainer, and KBreakout. AFK, I like enjoy a good beer with some good music in our local honky-tonk.
Updated on February 20, 2020Comments
-
Julian Helfferich almost 3 years
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 theCMakeLists.txt
files is), not the build directory (i.e. the directory from whichcmake
is called). This can lead to some confusion if you give a relative path as a command line option.Is there a way to tell
get_filename_component
that it should base the relative path on the current binary dir instead of the current source dir?