Al igual que make cleanelimina todos los archivos que ha producido un archivo MAKE, me gustaría hacer lo mismo con CMake. Con demasiada frecuencia, me encuentro revisando manualmente directorios que eliminan archivos como cmake_install.cmakey CMakeCache.txt, y las CMakeFilescarpetas.
¿Existe un comando cmake cleanpara eliminar todos estos archivos automáticamente? Idealmente, esto debería seguir la estructura recursiva definida dentro del CMakeLists.txtarchivo del directorio actual .

cd <location-of-cmakelists>/build && cmake ..Las preguntas frecuentes oficiales de CMake dicen :
fuente
En estos días de Git en todas partes, puede olvidarse de CMake y su uso
git clean -d -f -x, que eliminará todos los archivos que no estén bajo el control de la fuente.fuente
-xembargo, esa opción. Ese es un excelente truco delgitoficio. Aunque me gustaría personalmente todavía lo hacen a-seca ejecutar primero,git clean -d -f -x -n. De vez en cuando mantengo un archivo de conveniencia que uso para un proyecto con la carpeta del proyecto bajogitcontrol, pero no es algo que quiera compartir con otros, así que no logit addincluyo en el proyecto. Esto eliminaría ese tipo de archivo si no tuviera cuidado de agregar una-e <pattern>opción. En esa nota, sería bueno sigittuviera un.gitcleanignorearchivo. :)chattr +i $filename(necesita permisos de root, no permite modificar el archivo después de esto). De esta manera, git no podrá eliminar ese archivo, incluso si intenta hacerlo de la misma manerarm -f.git add?Lo busqué en Google durante media hora y lo único útil que se me ocurrió fue invocar la
findutilidad:Además, asegúrese de invocar
make clean(o cualquier generador CMake que esté usando) antes de eso.:)
fuente
rm -rf CMakeFiles ; rm -rf */CMakeFiles ; rm -rf */*/CMakeFiles ; rm -rf */*/*/CMakeFilesy aún no había terminado ...Puedes usar algo como:
Normalmente creo un comando "make clean-all" agregando una llamada a "make clean" al ejemplo anterior:
No intente agregar el objetivo "limpio" como una dependencia:
Porque "limpio" no es un objetivo real en CMake y esto no funciona.
Además, no debe usar este "clean-cmake-files" como dependencia de nada:
Porque, si hace eso, todos los archivos CMake se borrarán antes de que se complete la limpieza, y make le arrojará un error al buscar "CMakeFiles / clean-all.dir / build.make". En consecuencia, no puede usar el comando clean-all antes de "nada" en ningún contexto:
Eso tampoco funciona.
fuente
Simplemente emitir
rm CMakeCache.txttrabajos para mí también.fuente
cmake /build-pathnuevo.Tal vez esté un poco desactualizado, pero como este es el primer éxito cuando buscas en Google
cmake clean, agregaré esto:Como puede comenzar una compilación en el directorio de compilación con un objetivo especificado con
cmake --build . --target xyzpor supuesto puedes correr
cmake --build . --target cleanpara ejecutar el
cleanobjetivo en los archivos de compilación generados.fuente
Estoy de acuerdo en que la compilación fuera de la fuente es la mejor respuesta. Pero para los momentos en que solo debe hacer una compilación en el código fuente, he escrito un script de Python disponible aquí , que:
fuente
makecuando no hayaMakefilepresente debido a una limpieza previa (es decir, hace que este script sea idempotente). Simplemente agregue la línea (correctamente espaciada):if os.path.isfile(os.path.join(directory,'Makefile')):justo antes de la línea 24:args = [y, por supuesto, sangra el resto del cuerpo de la función después de la línea recién agregada. Esto solo realizará un amake ... cleansiMakefileestá presente en el directorio actual que se está limpiando. De lo contrario, el guión es perfecto!Una solución que encontré recientemente es combinar el concepto de compilación fuera del código fuente con un contenedor Makefile.
En mi archivo CMakeLists.txt de nivel superior, incluyo lo siguiente para evitar compilaciones en la fuente:
Luego, creo un Makefile de nivel superior e incluyo lo siguiente:
El objetivo predeterminado
allse llama escribiendomakee invoca el objetivo./build/Makefile.Lo primero que hace el objetivo
./build/Makefilees crear elbuilddirectorio usando$(MKDIR), que es una variable paramkdir -p. El directoriobuildes donde realizaremos nuestra compilación fuera de la fuente. Proporcionamos el argumento-ppara asegurarnos de quemkdirno nos grite por intentar crear un directorio que ya puede existir.La segunda cosa que hace el objetivo
./build/Makefilees cambiar los directorios albuilddirectorio e invocarcmake.Volvemos al
allobjetivo, invocamos$(MAKE) -C build, donde$(MAKE)se genera automáticamente una variable Makefile paramake.make -Ccambia el directorio antes de hacer nada. Por lo tanto, usar$(MAKE) -C buildes equivalente a hacercd build; make.Para resumir, llamar a este contenedor Makefile con
make allomakees equivalente a hacerlo:El destino
distcleaninvocacmake .., luegomake -C build clean, y finalmente, elimina todo el contenido delbuilddirectorio. Creo que esto es exactamente lo que solicitó en su pregunta.La última parte del Makefile evalúa si el objetivo proporcionado por el usuario es o no
distclean. Si no, cambiará los directorios abuildantes de invocarlo. Esto es muy poderoso porque el usuario puede escribir, por ejemplomake clean, y el Makefile lo transformará en un equivalente decd build; make clean.En conclusión, este contenedor Makefile, en combinación con una configuración de CMake de compilación obligatoria fuera de la fuente, hace que el usuario nunca tenga que interactuar con el comando
cmake. Esta solución también proporciona un método elegante para eliminar todos los archivos de salida CMake delbuilddirectorio.PD En el Makefile, usamos el prefijo
@para suprimir la salida de un comando de shell y el prefijo@-para ignorar los errores de un comando de shell. Cuando se usarmcomo parte deldistcleandestino, el comando devolverá un error si los archivos no existen (es posible que ya se hayan eliminado con la línea de comandorm -rf buildo que nunca se hayan generado). Este error de retorno obligará a nuestro Makefile a salir. Usamos el prefijo@-para evitar eso. Es aceptable si ya se eliminó un archivo; queremos que nuestro Makefile continúe y elimine el resto.Otra cosa a tener en cuenta: este Makefile puede no funcionar si usa un número variable de variables CMake para construir su proyecto, por ejemplo
cmake .. -DSOMEBUILDSUSETHIS:STRING="foo" -DSOMEOTHERBUILDSUSETHISTOO:STRING="bar",. Este Makefile asume que invocas CMake de manera consistente, ya sea escribiendocmake ..o proporcionandocmakeun número consistente de argumentos (que puedes incluir en tu Makefile).Finalmente, crédito donde se debe. Este contenedor Makefile se adaptó del Makefile proporcionado por la Plantilla de proyecto de aplicación C ++ .
fuente
Por supuesto, las compilaciones fuera de la fuente son el método de referencia para los Makefiles de Unix, pero si está utilizando otro generador como Eclipse CDT, prefiere que construya en la fuente. En ese caso, deberá purgar los archivos CMake manualmente. Prueba esto:
O si ha habilitado globstar con
shopt -s globstar, pruebe este enfoque menos desagradable:fuente
build. Tomó un poco más de tiempo que esos comandos, pero tuve que hacerlo solo una vez :)intente usar: cmake --clean-first path-of-CMakeLists.txt-file -B output-dir
--clean-first: Construye el objetivo limpio primero, luego construye.
(Para limpiar solamente, use --target clean.)
fuente
En el caso de que pase
-Dparámetros a CMake al generar los archivos de compilación y no desee eliminar todo el directorio build /:Simplemente elimine el directorio CMakeFiles / dentro de su directorio de compilación.
Esto hace que CMake se vuelva a ejecutar, y los archivos del sistema de construcción se regeneran. Su construcción también comenzará desde cero.
fuente
Para simplificar la limpieza al usar la compilación "fuera de la fuente" (es decir, compila en el
builddirectorio), utilizo el siguiente script:Cada vez que necesite limpiar, debe obtener este script del
builddirectorio:fuente
cd .. ; rm ; mkdir ; cdsecuencia concd .. ; rm -rf build/*.Si tiene definiciones personalizadas y desea guardarlas antes de limpiarlas, ejecute lo siguiente en su directorio de compilación:
Luego cree un nuevo directorio de compilación (o elimine el antiguo directorio de compilación y
cmakevuelva a crearlo) y finalmente ejecute con los argumentos que obtendrá con el script anterior.fuente
Si tu corres
regenerará los archivos CMake. Lo cual es necesario si agrega un nuevo archivo a una carpeta de origen seleccionada por * .cc, por ejemplo.
Si bien esto no es una "limpieza" per se, "limpia" los archivos CMake al regenerar los cachés.
fuente
Utilizo el siguiente script de shell para tales fines:
Si está utilizando Windows, use Cygwin para este script.
fuente
Es divertido ver que esta pregunta recibe tantas atenciones y soluciones complicadas, lo que de hecho muestra un dolor por no tener un método limpio con cmake.
Bueno, definitivamente
cd buildpuedes hacer tu trabajo, luego hacerrm -rf *cuando necesites limpiar. Sin embargo,rm -rf *es un comando peligroso dado que muchas personas a menudo no saben en qué directorio se encuentran.Si usted
cd ..,rm -rf buildy luegomkdir buildy luegocd build, eso es demasiado escribir.Entonces, una buena solución es permanecer fuera de la carpeta de compilación y decirle a cmake la ruta:
para configurar:
cmake -B buildpara compilar:
cmake --build buildpara limpiar:
rm -rf buildpara recrear la carpeta de compilación: ni siquiera necesita
mkdir build, simplemente configúrela concmake -B buildy cmake la crearáfuente
cmakeen su mayoría cocina aMakefile, uno podría agregarrma la PHONY limpia .Por ejemplo,
fuente
Tengo esto en mi archivo rc de shell (
.bashrc,.zshrc):Se supone que debe usarlo solo para compilaciones fuera de la fuente. Digamos que tiene un directorio llamado
build/para este propósito. Entonces solo tienes que corrert-cmake-cleandesde dentro.fuente
Solía respuesta de zsxwing éxito para resolver el siguiente problema:
Tengo una fuente que construyo en varios hosts (en una placa Raspberry Pi Linux, en una máquina virtual VMware Linux, etc.)
Tengo un script Bash que crea directorios temporales basados en el nombre de host de la máquina como este:
fuente
Cree un directorio de compilación temporal, por ejemplo,
build_cmake,. Por lo tanto, todos sus archivos de compilación estarán dentro de esta carpeta.Luego, en su archivo CMake principal, agregue el siguiente comando.
Por lo tanto, mientras compilamos
Y para limpiar hacer:
fuente