CMake: преобразование относительного пути в абсолютный путь, с каталогом сборки в качестве текущего каталога


В CMake можно преобразовать относительные пути в абсолютные с помощью

get_filename_component(ABSOLUTE_PATH ${RELATIVE_PATH} ABSOLUTE)
Однако такие пути, как ../../other_program/, основаны на исходном каталоге (т. е. на каталоге, в котором находятся файлы CMakeLists.txt), а не на каталоге сборки (т. е. на каталоге, из которого вызывается cmake). Это может привести к некоторой путанице, если вы укажете относительный путь в качестве параметра командной строки.

Есть ли способ сказать get_filename_component , что он должен основывать относительный путь на текущем двоичном dir вместо источник тока Дир?

3   11   2016-08-18 23:51:00

3 ответа:

Из документов get_filename_component (выделяя быть мне) :

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

Установить <VAR> на абсолютный путь <FileName>, где <COMP> - один из:

ABSOLUTE = полный путь к файлу REALPATH = полный путь к существующему файлу с разрешенными символьными ссылками

Если указанный <FileName> является относительным путем, то он вычисляется относительно данного базового каталога <BASE_DIR>. если базовый каталог не указан, то базовый каталог по умолчанию будет CMAKE_CURRENT_SOURCE_DIR.

Пути возвращаются с прямыми косыми чертами и не имеют завершающих косых черт. Если указан необязательный аргумент CACHE, то переменная результата добавляется в кэш.

Таким образом, вы используете:

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

Чтобы преобразовать абсолютный путь к файлу в относительный путь, можно использовать file команда :

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

Вычислите относительный путь от a <directory> до a <file> и сохраните его в <variable>.

file(RELATIVE_PATH buildDirRelFilePath "${CMAKE_BINARY_DIR}" "${myFile}")
get_filename_component(MY_RESULT_ABSOLUTE_PATH_VAR
                       "${CMAKE_CURRENT_LIST_DIR}/${MY_RELATIVE_PATH_VAR}"
                       ABSOLUTE)

Вы можете проверить, является ли путь абсолютным с помощью if(IS_ABSOLUTE path), и если он не является префиксом базового каталога, который вы хотите. Например,

if(NOT IS_ABSOLUTE ${p})
    set(p "${CMAKE_CURRENT_BINARY_DIR}/${p}")
endif()