Antes que nada, la sintaxis de cmake es realmente simple. Consiste en "comandos" y "argumentos". Es tan simple que tarda un tiempo en asimilarse. Todo es "comando (argumentos)". Además, los nombres de los comandos no distinguen entre mayúsculas y minúsculas. Antes tenían que ser TODOS MAYÚSCULAS, pero desde la versión 2.6 (creo) no importa. Sin embargo, los argumentos son sensibles a mayúsculas y minúsculas.
cmake_minimum_required (VERSION 2.6)
Este comando establece la versión mínima requerida de cmake para un proyecto. Si la versión actual de cmake es inferior a 2.6, dejará de procesarse e informará de un error. Esto evita tener que soportar versiones antiguas de la herramienta.
set (CMAKE_BACKWARDS_COMPATIBILITY 2.6)
Establezca la variable CMAKE_BACKWARDS_COMPATIBILITY en el valor 2.6. En realidad, se trata de un error menor en el archivo CMakeLists.txt que ha presentado, ya que CMAKE_BACKWARDS_COMPATIBILITY no debe utilizarse para 2.6 y versiones posteriores. El script probablemente debería usar cmake_policy
. Esto es para especificar cómo se comportarán las versiones más nuevas de cmake cuando se enfrenten con inconsistencias en versiones anteriores de cmake. Cualquier script que escriba desde cero hoy no debería preocuparse por esto.
Project(${PLUGIN_NAME})
Establece el nombre del proyecto con el valor de lo que está en la variable PLUGIN_NAME
. Este valor se muestra como el nombre del proyecto en algunos IDEs. Para escribir un valor en una variable, puede usar set(PLUGIN_NAME myName)
y leer el valor que usa la sintaxis ${}
: "${PLUGIN_NAME}"
. Algunos comandos también escriben en variables, pero los usa de la misma manera que en el comando set
.
file (GLOB GENERAL RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
[^.]*.cpp
[^.]*.h
[^.]*.cmake
)
file
es un comando. Su primer argumento GLOB
significa "devolver archivos en el disco cuyos nombres coinciden con los patrones que daré como argumentos". El siguiente argumento GENERAL
es la variable en la que se almacena el resultado, como con set
, escribe el resultado en la variable y luego puede leerlo con ${GENERAL}
. RELATIVE
y la ruta significa devolver los nombres de archivo relativos a esa ruta, no la ruta completa. Entonces, en lugar de "C: \ some \ long \ path \ src \ foo.cpp" o "/home/me/some/path/src/foo.cpp" obtendría "src \ foo.cpp" o "src/foo.cpp ". La variable CMAKE_CURRENT_SOURCE_DIR es una "variable mágica" que CMake rellena para usted y se refiere a la ruta al directorio de origen que se está procesando actualmente, donde vive este archivo CMakeLists.txt. La última lista de argumentos son los patrones de archivos que se emparejarán. Básicamente, cualquier cosa que tenga la extensión de archivo cpp, h o cmake.
include_directories(${PLUGIN_INCLUDE_DIRS})
Añadir los directorios en los ${PLUGIN_INCLUDE_DIRS}
a los buscados por el compilador para incluir archivos. Esto dará como resultado argumentos extra "-I" si compila con gcc, por ejemplo.
# Generated files are stored in ${GENERATED} by the project configuration
Las líneas que comienzan con # son comentarios.
SET_SOURCE_FILES_PROPERTIES(
${GENERATED}
PROPERTIES
GENERATED 1
)
Los archivos pueden tener pares clave/valor asociados a ellos, y esto afecta la forma en que se crean. Aquí los archivos enumerados en la variable ${GENERATED}
tienen la propiedad "GENERADO" establecido en el valor 1. ¿Qué significa eso? Bueno, CMake ahora sabe que no debe buscar los archivos "$ {GENERATED}" en el disco, ya que se crearán en otro paso de compilación. En el fragmento publicado, nadie establece la variable ${GENERATED}
. Me imagino que se establece en otra parte de los archivos del proyecto. ¡No mezcle la variable ${GENERATED}
con la propiedad GENERADA! Este es un punto sutil, y tal vez la variable debería haber sido GENERATED_FILES
para evitar confusiones, es decir, SET_SOURCE_FILES_PROPERTIES(${GENERATED_FILES} PROPERTIES GENERATED 1)
.
SOURCE_GROUP(Generated FILES ${GENERATED})
Esto crea un grupo, que en Visual Studio se traduce en una ficha de archivo, llamado "generada" que contiene los archivos en la variable ${GENERATED}
.
SET(SOURCES ${GENERAL} ${GENERATED})
Esta línea establece las fuentes variables a lo que está en las variables ${GENERAL}
y ${GENERATED}
. Anteriormente configuramos ${GENERAL}
como la lista de archivos cpp, h y cmake que se encontraban en el directorio de origen actual. En un pseudocódigo tipo C, esto es como "FUENTES = GENERAL + GENERADO". Como detalle de la implementación, el valor FUENTES es en realidad una lista y sus contenidos están separados por ";" caracteres. Por lo general, esto se hace para que luego pueda crear una biblioteca o ejecutable simplemente usando la variable ${SOURCES}
en lugar de repetir las otras 2 variables en todas partes.
¡Gracias! Desearía poder darte más de un voto positivo. Esta es una gran ayuda. –