Zwykle mam w swoim projekcie zasadę, aby nigdy nie tworzyć wierszy w plikach tekstowych, które przekraczają długość linii 80, więc można je łatwo edytować we wszelkiego rodzaju edytorach (znasz ofertę). Ale w przypadku CMake pojawia się problem polegający na tym, że nie wiem, jak podzielić prosty ciąg na wiele linii, aby uniknąć jednej ogromnej linii. Rozważ ten podstawowy kod:
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}")
Już przekracza limit 80 linii. Jak więc podzielić wiersz w CMake na wiele wierszy bez przechodzenia do szczegółów (wiele list(APPEND ...)
lub tym podobnych)?
CMake 3.0 i nowsze
Użyj
string(CONCAT)
polecenia:Chociaż CMake 3.0 i nowsze obsługują kontynuację wierszy argumentów cytowanych w cudzysłowie , nie można wciskać drugiego lub kolejnych wierszy bez umieszczania w ciągu znaków białych znaków wcięcia.
CMake 2.8 i starsze
Możesz użyć listy. Każdy element listy można umieścić w nowej linii:
Lista używana bez cudzysłowów jest łączona bez spacji:
Jeśli naprawdę potrzebujesz łańcucha, możesz najpierw przekonwertować listę na ciąg:
Wszelkie średniki w oryginalnych ciągach znaków będą widoczne jako separatory elementów listy i zostaną usunięte. Muszą uciec:
źródło
Nadal jest trochę rozwlekły, ale jeśli limit 80 znaków naprawdę Cię denerwuje, możesz wielokrotnie dodawać do tej samej zmiennej:
Daje wynik:
źródło
Nie ma sposobu, aby podzielić literał ciągu na wiele wierszy w plikach CMakeLists.txt lub w skryptach CMake. Jeśli umieścisz znak nowej linii w ciągu, w samym ciągu będzie istniał dosłowny znak nowej linii.
Jednak CMake używa białych znaków do oddzielania argumentów, więc możesz zmienić spację, która jest separatorem argumentów, na znak nowej linii w dowolnym miejscu, bez zmiany zachowania.
Możesz zmienić sformułowanie tej dłuższej linii:
jako te dwie krótsze linie:
Są całkowicie równoważne.
źródło
Dla tych, którzy zostali przywiezieni z Jak podzielić wyrażenie generatora CMake na wiele wierszy? Chciałbym dodać kilka uwag.
Metoda kontynuacji linii nie zadziała, CMake nie może przeanalizować listy generatorów utworzonej z użyciem białych znaków (wcięć) i kontynuacji linii.
Chociaż rozwiązanie typu string (CONCAT) zapewni wyrażenie generatora, które można ocenić, oszacowane wyrażenie zostanie otoczone cudzysłowami, jeśli wynik zawiera spację.
Dla każdej opcji, która ma zostać dodana, należy utworzyć oddzielną listę generatorów, więc opcje układania w stos, takie jak poniżej, spowodują niepowodzenie kompilacji:
Dzieje się tak, ponieważ wynikowe opcje są przekazywane do kompilatora w cudzysłowach
Aby obliczyć długie wyrażenia generatora reprezentowane za pomocą rozwiązania typu string (CONCAT), każde wyrażenie generatora musi wyliczać na pojedynczą opcję bez spacji:
Może to nie mieć związku z pytaniem, na które piszę odpowiedź, niestety pytanie, na które odpowiadam, jest błędnie oznaczone jako duplikat tego pytania.
Listy generatorów nie są obsługiwane i przetwarzane w taki sam sposób jak łańcuchy, dlatego też istnieją dodatkowe środki, które należy podjąć, aby podzielić listę generatorów na wiele wierszy.
źródło
Przykład w pierwotnym pytaniu dotyczy tylko stosunkowo krótkiego ciągu. W przypadku dłuższych łańcuchów (w tym przykładów podanych w innych odpowiedziach) argument w nawiasach mógłby być lepszy. Z dokumentacji:
źródło
\n
s. Jeśli tego nie chcesz, nie sądzę, aby argumenty w nawiasach były rozwiązaniem.Aby zachować dobre wcięcia w kodzie, wystarczy to zrobić
Lub utwórz ciąg bezpośrednio za pomocą
jak w odpowiedzi Douglasa, który ma więcej szczegółów. Pomyślałem jednak, że może to podsumować najważniejszy punkt.
źródło