Por lo general, tengo una política en mi proyecto, para nunca crear líneas en archivos de texto que excedan una longitud de línea de 80, por lo que son fácilmente editables en todo tipo de editores (ya conoce el trato). Pero con CMake tengo el problema de que no sé cómo dividir una cadena simple en varias líneas para evitar una línea enorme. Considere este código básico:
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}")
Ya supera el límite de 80 líneas. Entonces, ¿cómo puedo dividir una línea en CMake en varias líneas sin llegar a ser detallado (múltiples list(APPEND ...)
o similares)?
CMake 3.0 y más reciente
Usa el
string(CONCAT)
comando:Aunque CMake 3.0 y las versiones más recientes admiten la continuación de la línea de los argumentos entre comillas , no puede sangrar la segunda línea o las siguientes sin obtener el espacio en blanco de sangría incluido en su cadena.
CMake 2.8 y anteriores
Puede utilizar una lista. Cada elemento de la lista se puede colocar en una nueva línea:
Una lista utilizada sin comillas se concatena sin espacios en blanco:
Si realmente necesita una cadena, puede convertir la lista en una cadena primero:
Cualquier punto y coma en sus cadenas originales se verá como separador de elementos de lista y se eliminará. Deben escapar:
fuente
Todavía es un poco detallado, pero si el límite de 80 caracteres realmente te molesta, puedes agregar repetidamente la misma variable:
Da salida:
fuente
No hay forma de dividir un literal de cadena en varias líneas en archivos CMakeLists.txt o en scripts CMake. Si incluye una línea nueva dentro de una cadena, habrá una línea nueva literal en la cadena en sí.
Sin embargo, CMake usa espacios en blanco para separar argumentos, por lo que puede cambiar un espacio que es un separador de argumentos en una nueva línea en cualquier lugar que desee, sin cambiar el comportamiento.
Podrías reformular esta línea más larga:
como estas dos líneas más cortas:
Son completamente equivalentes.
fuente
El ejemplo de la pregunta original trata solo de una cadena relativamente corta. Para cadenas más largas (incluidos los ejemplos dados en otras respuestas), un argumento de corchetes podría ser mejor. De la documentación:
fuente
\n
s. Si no quiere eso, no creo que los argumentos entre corchetes sean su solución.Para aquellos que fueron traídos aquí desde ¿Cómo divido una expresión generadora de CMake en varias líneas? Me gustaría agregar algunas notas.
El método de continuación de línea no funcionará, CMake no puede analizar una lista generadora hecha con espacios en blanco (sangría) y continuación de línea.
Si bien la solución de cadena (CONCAT) proporcionará una expresión generadora que se puede evaluar, la expresión evaluada estará rodeada de comillas si el resultado contiene un espacio.
Para que se agregue cada opción individual, se debe construir una lista de generador separada, por lo que las opciones de apilamiento como lo he hecho a continuación harán que la compilación falle:
Esto se debe a que las opciones resultantes se pasan al compilador entre comillas.
Para evaluar expresiones generadoras largas representadas mediante la solución de cadena (CONCAT), cada expresión generadora debe evaluar una sola opción sin espacios:
Esto puede no estar relacionado con la pregunta a la que estoy publicando una respuesta; desafortunadamente, la pregunta que estoy respondiendo está marcada incorrectamente como un duplicado de esta pregunta.
Las listas de generadores no se manejan ni analizan de la misma manera que las cadenas, y debido a esto, hay medidas adicionales que se deben tomar para dividir una lista de generadores en varias líneas.
fuente
Para mantener una buena sangría en su código, es bastante sencillo hacerlo
O forma una cadena directamente con
como en la respuesta de Douglas, que tiene más detalles. Sin embargo, pensé que esto podría resumir el punto esencial.
fuente