Normalerweise habe ich in meinem Projekt die Richtlinie, niemals Zeilen in Textdateien zu erstellen, die eine Zeilenlänge von 80 überschreiten, sodass sie in allen Arten von Editoren leicht bearbeitet werden können (Sie kennen den Deal). Aber mit CMake habe ich das Problem, dass ich nicht weiß, wie man eine einfache Zeichenfolge in mehrere Zeilen aufteilt, um eine große Zeile zu vermeiden. Betrachten Sie diesen grundlegenden Code:
set(MYPROJ_VERSION_MAJOR "1")
set(MYPROJ_VERSION_MINOR "0")
set(MYPROJ_VERSION_PATCH "0")
set(MYPROJ_VERSION_EXTRA "rc1")
set(MYPROJ_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_EXTRA}")
Das Limit von 80 Zeilen wird bereits überschritten. Wie kann ich eine Zeile in CMake in mehrere Zeilen aufteilen, ohne ausführlich zu werden (mehrere list(APPEND ...)
oder ähnliches)?
CMake 3.0 und neuer
Verwenden Sie den
string(CONCAT)
Befehl:Obwohl CMake 3.0 und neuere die Fortsetzung von Argumenten in Anführungszeichen unterstützen , können Sie die zweite oder nachfolgende Zeile nicht einrücken, ohne das Leerzeichen für die Einrückung in Ihrer Zeichenfolge zu erhalten.
CMake 2.8 und älter
Sie können eine Liste verwenden. Jedes Element der Liste kann in eine neue Zeile gesetzt werden:
Eine Liste ohne Anführungszeichen wird ohne Leerzeichen verkettet:
Wenn Sie wirklich eine Zeichenfolge benötigen, können Sie die Liste zuerst in eine Zeichenfolge konvertieren:
Alle Semikolons in Ihren ursprünglichen Zeichenfolgen werden als Listenelementtrennzeichen angezeigt und entfernt. Sie müssen entkommen:
quelle
Es ist immer noch ein wenig ausführlich, aber wenn Sie das Limit von 80 Zeichen wirklich stört, können Sie wiederholt an dieselbe Variable anhängen:
Gibt Ausgabe:
quelle
Es gibt keine Möglichkeit, ein Zeichenfolgenliteral in CMakeLists.txt-Dateien oder in CMake-Skripten auf mehrere Zeilen aufzuteilen. Wenn Sie eine neue Zeile in eine Zeichenfolge einfügen, enthält die Zeichenfolge selbst eine wörtliche neue Zeile.
CMake verwendet jedoch Leerzeichen, um Argumente zu trennen, sodass Sie ein Leerzeichen, das ein Argumenttrennzeichen ist, an einer beliebigen Stelle in eine neue Zeile ändern können, ohne das Verhalten zu ändern.
Sie könnten diese längere Zeile umformulieren:
wie diese zwei kürzeren Zeilen:
Sie sind völlig gleichwertig.
quelle
Das Beispiel in der ursprünglichen Frage handelt nur von einer relativ kurzen Zeichenfolge. Für längere Zeichenfolgen (einschließlich der Beispiele in anderen Antworten) könnte ein Klammerargument besser sein. Aus der Dokumentation:
quelle
\n
s geben. Wenn Sie das nicht wollen, denke ich nicht, dass Klammerargumente Ihre Lösung sind.Für diejenigen, die hierher gebracht wurden von Wie teile ich einen CMake-Generatorausdruck in mehrere Zeilen auf? Ich möchte einige Notizen hinzufügen.
Die Zeilenfortsetzungsmethode funktioniert nicht. CMake kann keine Generatorliste analysieren, die mit Leerzeichen (Einrückung) und Zeilenfortsetzung erstellt wurde.
Während die String-Lösung (CONCAT) einen Generatorausdruck bereitstellt, der ausgewertet werden kann, wird der ausgewertete Ausdruck von Anführungszeichen umgeben, wenn das Ergebnis ein Leerzeichen enthält.
Für jede einzelne Option, die hinzugefügt werden soll, muss eine separate Generatorliste erstellt werden. Wenn also Stapeloptionen wie im Folgenden ausgeführt werden, schlägt der Build fehl:
Dies liegt daran, dass die resultierenden Optionen in Anführungszeichen an den Compiler übergeben werden
Um lange Generatorausdrücke auszuwerten, die mit der String (CONCAT) -Lösung dargestellt werden, muss jeder Generatorausdruck eine einzelne Option ohne Leerzeichen ergeben:
Dies hängt möglicherweise nicht mit der Frage zusammen, auf die ich eine Antwort poste. Leider ist die Frage, die ich beantworte, fälschlicherweise als Duplikat dieser Frage markiert.
Generatorlisten werden nicht wie Zeichenfolgen behandelt und analysiert. Aus diesem Grund müssen zusätzliche Maßnahmen ergriffen werden, um eine Generatorliste auf mehrere Zeilen aufzuteilen.
quelle
Um eine gute Einrückung in Ihrem Code beizubehalten, ist dies einfach genug
Oder bilden Sie eine Zeichenfolge direkt mit
wie in Douglas 'Antwort, wer mehr Details hat. Ich dachte jedoch, dies könnte nur den wesentlichen Punkt zusammenfassen.
quelle