2017-12-20 1 views
1

Gibt es eine robuste Möglichkeit, Pfade in CMake zu normalisieren?CMake: Wie normalisiert man Pfade?

Beispiel:

# Let's assume that an environment variable MY_ROOT_DIR is set 
# that points to some directory. 
set(MYFILE "$ENV{MY_ROOT_DIR}/somefile.txt") 
message(${MYFILE}) 
# This will result for example in 
# Win:   C:\path\to\my\root\dir/somefile.txt 
# Unix based: /path/to/my/root/dir/somefile.txt 

In diesem Beispiel würde es MY_ROOT_DIR zu normalisieren erforderlich (dh umgekehrte Schrägstriche mit Schrägstrichen ersetzen) vor der Verwendung als Pfadkomponente. Wie würdest du das in CMake machen?

CMake (oder die Werkzeuge weiter unten in der Toolchain) können Pfade mit gemischten Separatoren (/ oder \) verarbeiten oder nicht. CMake verwendet / als Standardtrennzeichen. Eine typische Warnung von CMake für Wege mit dem falschen Weg Separator erzeugte \ kann wie folgt aussehen:

CMake Warning (dev) at cmake_install.cmake:5 (set): 
    Syntax error in cmake code at 

    C:/path/to/my/root/build/cmake_install.cmake:5 

    when parsing string 

    C:\path\to\my\root/somefile.txt 

    Invalid escape sequence \p 

    Policy CMP0010 is not set: Bad variable reference syntax is an error. Run 
    "cmake --help-policy CMP0010" for policy details. Use the cmake_policy 
    command to set the policy and suppress this warning. 

Vielen Dank für alle Hinweise zu diesem!

+0

Ich bin damit einverstanden. Die Antwort ist sicherlich :) – normanius

+0

... obwohl ich nicht in der Lage war, diesen anderen Beitrag zu finden, wenn ich nach einer Lösung für mein Problem suche. – normanius

Antwort

3

Sie können dazu den Befehl file(TO_CMAKE_PATH) verwenden.

Der TO_CMAKE_PATH Modus wandelt eine native <path> in einen Cmake-style Pfad mit vorausSchrägStriche (/). Die Eingabe kann ein einzelner Pfad oder ein Systemsuchpfad wie $ENV{PATH} sein. Ein Suchpfad wird in eine cmake-artige Liste konvertiert, die durch ; Zeichen getrennt ist. Hier

ist ein Beispiel:

file(TO_CMAKE_PATH "$ENV{MY_DIR_VAR}" ENV_MY_DIR_VAR) 
Verwandte Themen