Как получить системный разделитель путей с помощью CMake

Я настраиваю какой-то проект с помощью CMake. Мне нужно получить разделитель пути (например, / или \) в переменную CMake, чтобы что-то сделать, неважно, что именно. Как я могу это сделать?


person einpoklum    schedule 26.01.2018    source источник
comment
Помогают ли команды CMake file(TO_CMAKE_PATH "${dir}" dir) и file(TO_NATIVE_PATH "${dir}" dir)?   -  person vre    schedule 26.01.2018
comment
@vre: Возможно, если вы можете объяснить их немного больше...   -  person einpoklum    schedule 26.01.2018
comment
Из документов: режим TO_CMAKE_PATH преобразует собственный «путь» в путь в стиле cmake с косой чертой (/). Входными данными могут быть один путь или путь системного поиска, например $ENV{PATH}. Путь поиска будет преобразован в список в стиле cmake, разделенный ; персонажи. Режим TO_NATIVE_PATH преобразует ‹path› в стиле cmake в собственный путь с косой чертой для конкретной платформы (\ в Windows и / в других местах). Всегда заключайте ‹путь› в двойные кавычки, чтобы убедиться, что он рассматривается как единственный аргумент этой команды.   -  person vre    schedule 26.01.2018
comment
@vre: Но почему пустой путь (в конце концов, "${dir}" изначально равен "") приводит к чему-то интересному после преобразования?   -  person einpoklum    schedule 26.01.2018
comment
Я только что протестировал следующий файл CMakeLists.txt cmake_minimum_required (VERSION 2.8.12) project(a_test) file(TO_CMAKE_PATH "\\" path) message(STATUS "\\ converted to CMake path ${path}") file(TO_NATIVE_PATH "/" path) message(STATUS "/ converted to native path ${path}") file(TO_CMAKE_PATH "" path) message(STATUS "empty path converted to CMake path ${path}") file(TO_NATIVE_PATH "" path) message(STATUS "empty path converted to native path ${path}") в Windows, и все работает, как и ожидалось.   -  person vre    schedule 27.01.2018


Ответы (1)


Не существует переменной CMake для системного разделителя путей, которую можно было бы использовать напрямую.

Но, как прокомментировал @vre, используя команду file(TO_NATIVE_PATH), вы можете сделать:

file(TO_NATIVE_PATH "/" _separator)
message("The systems's path separator is '${_separator}'")

Если у вас есть полные пути, $<SHELL_PATH:...> выражение генератора (версия CMake >= 3.4) очень полезна:

Содержимое ... преобразовано в стиль пути оболочки. Например, косая черта преобразуется в обратную косую черту в оболочках Windows, а буквы дисков преобразуются в пути posix в оболочках MSYS. ... должен быть абсолютным путем.

person Florian    schedule 26.01.2018
comment
Хм, вы уверены, что TO_NATIVE_PATH из / приведет к разделителю путей на всех платформах? В частности, в Windows нет даже одного корня для файловой системы. - person einpoklum; 26.01.2018
comment
@einpoklum Я не был уверен, поэтому попробовал на Windows и Ununtu. Оба работают нормально. И если я посмотрю на рассматриваемый исходный код CMake, например SystemTools::ConvertToWindowsOutputPath(), он в основном конвертирует косые черты (в отличие от $<SHELL_PATH:...> выражение генератора). - person Florian; 27.01.2018