tag - Hacer que cmake se ejecute antes de construir después de sacar de git
qué tipos de etiquetas existen en git (1)
Hay este proyecto guardado en un repositorio git, que creamos con cmake y ninja. Estamos utilizando expresiones / funciones globbing para recopilar todos los archivos fuente que se compilarán. Esto significa que cada vez que se agrega / elimina un archivo, se debe llamar a cmake para volver a analizar los directorios.
Hemos visto que esto está causando una pérdida de tiempo cuando alguien tira después de que alguien haya insertado algún archivo nuevo, sin modificaciones en ninguno de los archivos de cmake. Digo esto último porque una modificación a cualquiera de los archivos cmake desencadenaría una llamada a cmake (por ninja), y todo estaría bien.
¿Cómo puedo obtener que se llame cmake antes / cuando empiece a construir nuevamente mi proyecto después de tirar? (Nota: no importa si cmake se ejecuta un poco más de lo necesario, siempre y cuando no siempre)
Estoy construyendo fuera de la fuente, además de utilizar varios directorios de compilación donde, por ejemplo, pruebo diferentes compiladores.
Estoy explorando algunas soluciones. Uno que usa script de git hooks, es decir, post-merge (pero ¿cómo puedo garantizar que recuperaré la ruta a source / CMakeLists.txt para tocarlo ? ¿Puedo enviar el script para que funcione para todo el mundo? No es un proyecto público) . No sé si es relevante, utilizamos principalmente git a través de la interfaz gráfica (TortoiseGit).
La otra solución posible sería utilizar en c un objetivo personalizado que dependa del contenido del directorio .git / refs / heads, pero no puedo pensar en una combinación que realmente funcione ...
Algunos enlaces:
- http://git-scm.com/book/es/Customizing-Git-Git-Hooks
- https://www.kernel.org/pub/software/scm/git/docs/githooks.html
Comandos CMake: http://www.cmake.org/cmake/help/v2.8.11/cmake.html
Poner un archivo de script post-merge
en .git/hooks
parece ser el truco:
#!/bin/sh
#
touch source/CMakeLists.txt
La ruta de ejecución aparentemente es el directorio raíz del proyecto, que es ideal para este tipo de operación. Probé esto llamando "pull" en el menú contextual de TartoiseGit desde una subcarpeta "aleatoria" del proyecto. Aquí hay algunas instrucciones sobre cómo se puede probar el guión .
Drawback: si alguien está modificando el CMakeLists.txt en su editor, con algunas modificaciones no guardadas, podría perder algo de trabajo si responde demasiado rápido al mensaje "el archivo ha cambiado en el disco ..."
Luego, para hacer de este script parte del repositorio, encontré la siguiente solución que parece ser buena para nuestro proyecto (no público).
1) Cree una carpeta (por ejemplo, zz_gitHookScripts) para los scripts de git hook y coloque los archivos que todos deberían usar. Agrégalo al repositorio.
2) Agregue algo así a CMakeLists.txt, para que los archivos se coloquen en el directorio efectivo la primera vez que se ejecute cmake (y, dado lo anterior, esto sucederá la primera vez que compilamos después de tirar, también el primero tiempo porque CMakeLists.txt se modifica a través de esta edición):
file(GLOB HOOK_SCRIPTS zz_gitHookScripts/*)
if (HOOK_SCRIPTS)
file(COPY ${HOOK_SCRIPTS} DESTINATION ${CMAKE_SOURCE_DIR}/../.git/hooks)
endif (HOOK_SCRIPTS)
En el caso de los parches, se puede usar un gancho de post-applypatch
equivalente.
Inconvenientes:
- no se activa en caso de ocultación (un usuario ocultando un cambio que agrega / elimina archivos, aún debe recordar ejecutar manualmente cmake) , o en el caso de un parche
- los usuarios no pueden personalizar los scripts de gancho
- eliminar algún script de enlace que ya no queremos usar puede ser complicado
- en general, todas las ramas deberán compartir los mismos ganchos
De todos modos, así es bueno para nuestras necesidades.