¿Por qué el archivo cmake GLOB es malvado?
El documento de CMake dice sobre el archivo de comando GLOB :
No recomendamos utilizar GLOB para recopilar una lista de archivos fuente de su árbol de fuentes. Si ningún archivo CMakeLists.txt cambia cuando se agrega o elimina una fuente, entonces el sistema de compilación generado no puede saber cuándo pedirle a CMake que se regenere.
Varios hilos de discusión en la web afirman que distribuir archivos fuente es malo.
Sin embargo, para que el sistema de compilación sepa que se ha agregado o eliminado una fuente, es suficiente decir
touch CMakeLists.txt
¿Bien?
Entonces eso es menos esfuerzo que editar CMakeLists.txt
para insertar o eliminar un nombre de archivo fuente. Tampoco es más difícil de recordar. Así que no veo ninguna buena razón para desaconsejarlo file GLOB
.
¿Qué hay de malo en este argumento?
El problema es cuando no estás solo trabajando en un proyecto.
Digamos que el proyecto tiene los desarrolladores A y B.
A agrega un nuevo archivo fuente x.c
. No cambia CMakeLists.txt
y se compromete una vez que termina de implementar x.c
.
Ahora B hace un git pull
, y como no ha habido modificaciones en el CMakeLists.txt
, CMake no se ejecuta nuevamente y B causa errores del vinculador al compilar, porque x.c
no se ha agregado a su lista de archivos fuente.
Edición de 2020: CMake 3.12 introduce el CONFIGURE_DEPENDS
argumento file(GLOB
que realiza el análisis global en busca de archivos nuevos: https://cmake.org/cmake/help/v3.12/command/file.html#filesystem
Sin embargo, esto no es portátil (ya que las soluciones Visual Studio o Xcode no admiten la función), así que utilícelo solo como una primera aproximación, de lo contrario, otras personas pueden tener problemas para compilar sus archivos CMake en el IDE de su elección.
No es intrínsecamente malo: tiene ventajas y desventajas, que se tratan relativamente bien en esta respuesta aquí en StackOverflow. Pero si lo usas descuidadamente, podrías terminar ignorando los cambios de dependencia y requiriendo reconstrucciones limpias de grandes partes de tu código base.
Personalmente, estoy a favor de usarlo (en proyectos más pequeños o en ciertos subdirectorios en proyectos más grandes) para evitar tener que ingresar cada archivo manualmente en los archivos de compilación. Editar: Mi preferencia ha cambiado y actualmente tiendo a evitarlo.