Revelación completa: Originalmente preferí el enfoque global por su simplicidad, pero a lo largo de los años he llegado a reconocer que enumerar explícitamente los archivos es menos propenso a errores para proyectos grandes de múltiples desarrolladores.
Respuesta original:
Las ventajas del globbing son:
Es fácil agregar nuevos archivos, ya que solo se enumeran en un lugar: en el disco. No globbing crea duplicación.
Su archivo CMakeLists.txt será más corto. Esta es una gran ventaja si tiene muchos archivos. No globular te hace perder la lógica CMake entre grandes listas de archivos.
Las ventajas de usar listas de archivos codificados son:
CMake hará un seguimiento de las dependencias de un nuevo archivo en el disco correctamente: si usamos glob, los archivos que no se hayan bloqueado la primera vez cuando ejecutaste CMake no serán detectados
Se asegura de que solo se agreguen los archivos que desea. Globbing puede recoger archivos perdidos que no desea.
Para evitar el primer problema, simplemente puede "tocar" el CMakeLists.txt que hace el glob, ya sea utilizando el comando táctil o escribiendo el archivo sin cambios. Esto obligará a CMake a volver a ejecutar y recoger el nuevo archivo.
Para solucionar el segundo problema, puede organizar su código cuidadosamente en directorios, que es lo que probablemente haga de todos modos. En el peor de los casos, puede usar el list(REMOVE_ITEM)
comando para limpiar la lista global de archivos:
file(GLOB to_remove file_to_remove.cpp)
list(REMOVE_ITEM list ${to_remove})
La única situación real en la que esto puede morderte es si estás usando algo como git-bisect para probar versiones anteriores de tu código en el mismo directorio de compilación. En ese caso, es posible que deba limpiar y compilar más de lo necesario para asegurarse de obtener los archivos correctos en la lista. Este es un caso de esquina, y uno en el que ya estás alerta, que en realidad no es un problema.
Simply "touch" the CMakeLists.txt
está bien si usted es el desarrollador, pero para otros que construyen su software, realmente puede ser un problema que su compilación falla después de la actualización y la carga recae en ellos para investigar por qué.La mejor manera de especificar archivos fuente en CMake es enumerándolos explícitamente .
Los propios creadores de CMake aconsejan no usar globbing.
Ver: https://cmake.org/cmake/help/v3.15/command/file.html?highlight=glob#file
Por supuesto, es posible que desee saber cuáles son las desventajas: ¡siga leyendo!
Cuando falla Globbing:
La gran desventaja de globbing es que crear / eliminar archivos no actualizará automáticamente el sistema de compilación.
Si usted es la persona que agrega los archivos, esto puede parecer una compensación aceptable, sin embargo, esto causa problemas a otras personas que construyen su código, actualizan el proyecto desde el control de versiones, ejecutan la compilación y luego se contactan con usted, quejándose de que
"la compilación es roto".
Para empeorar las cosas, la falla generalmente produce algún error de vinculación que no da ninguna pista sobre la causa del problema y se pierde tiempo para solucionarlo.
En un proyecto en el que trabajé, comenzamos a englobar, pero recibimos tantas quejas cuando se agregaron nuevos archivos, que fue una razón suficiente para enumerar explícitamente los archivos en lugar de glob.
Esto también rompe los flujos de trabajo comunes de git
(
git bisect
y el cambio entre ramas de características).Por lo tanto, no podría recomendar esto, los problemas que causa superan con creces la conveniencia, cuando alguien no puede construir su software debido a esto, puede perder mucho tiempo para rastrear el problema o simplemente darse por vencido.
Y otra nota, solo recordar tocar
CMakeLists.txt
no siempre es suficiente, con las compilaciones automatizadas que usan globbing, tuve que ejecutarcmake
antes de cada compilación ya que los archivos podrían haberse agregado / eliminado desde la última compilación *.Excepciones a la regla:
Hay momentos en que es preferible el pegadizo:
CMakeLists.txt
archivos para proyectos existentes que no usan CMake.Es una forma rápida de obtener toda la fuente referenciada (una vez que el sistema de compilación se está ejecutando, reemplace globbing con listas de archivos explícitas).
cmake
para generar archivos de compilación cada vez para obtener una compilación confiable / correcta (lo que va en contra de la intención de CMake: la capacidad de dividir la configuración de la compilación ) .* Sí, podría haber escrito un código para comparar el árbol de archivos en el disco antes y después de una actualización, pero esta no es una buena solución y algo mejor le queda al sistema de compilación.
fuente
En CMake 3.12, los comandos
file(GLOB ...)
yfile(GLOB_RECURSE ...)
obtuvieron unaCONFIGURE_DEPENDS
opción que vuelve a ejecutar cmake si el valor del globo cambia. Como esa era la principal desventaja de buscar archivos fuente, ahora está bien hacerlo:Sin embargo, algunas personas aún recomiendan evitar la búsqueda de fuentes. De hecho, la documentación establece:
Personalmente, considero los beneficios de no tener que administrar manualmente la lista de archivos de origen para superar los posibles inconvenientes. Si tiene que volver a cambiar a los archivos de la lista manual, esto se puede lograr fácilmente simplemente imprimiendo la lista de origen global y pegándola nuevamente.
fuente
Puede glob con seguridad (y probablemente debería) a costa de un archivo adicional para contener las dependencias.
Agregue funciones como estas en alguna parte:
Y luego ve a pelear:
Todavía está analizando las dependencias explícitas (¡y activando todas las compilaciones automatizadas!) Como antes, solo está en dos archivos en lugar de uno.
El único cambio en el procedimiento es después de haber creado un nuevo archivo. Si no se bloquea, el flujo de trabajo consiste en modificar CMakeLists.txt desde Visual Studio y reconstruir, si lo hace, ejecuta cmake explícitamente, o simplemente toca CMakeLists.txt.
fuente
make
errores extraños en el enlazador.¡Especifique cada archivo individualmente!
Utilizo un CMakeLists.txt convencional y un script de Python para actualizarlo. Ejecuto el script de Python manualmente después de agregar archivos.
Vea mi respuesta aquí: https://stackoverflow.com/a/48318388/3929196
fuente