Al igual que make clean
elimina 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.cmake
y CMakeCache.txt
, y las CMakeFiles
carpetas.
¿Existe un comando cmake clean
para eliminar todos estos archivos automáticamente? Idealmente, esto debería seguir la estructura recursiva definida dentro del CMakeLists.txt
archivo 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
-x
embargo, esa opción. Ese es un excelente truco delgit
oficio. 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 bajogit
control, pero no es algo que quiera compartir con otros, así que no logit add
incluyo 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 sigit
tuviera un.gitcleanignore
archivo. :)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
find
utilidad: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 */*/*/CMakeFiles
y 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.txt
trabajos para mí también.fuente
cmake /build-path
nuevo.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 xyz
por supuesto puedes correr
cmake --build . --target clean
para ejecutar el
clean
objetivo 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
make
cuando no hayaMakefile
presente 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 ... clean
siMakefile
está 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
all
se llama escribiendomake
e invoca el objetivo./build/Makefile
.Lo primero que hace el objetivo
./build/Makefile
es crear elbuild
directorio usando$(MKDIR)
, que es una variable paramkdir -p
. El directoriobuild
es donde realizaremos nuestra compilación fuera de la fuente. Proporcionamos el argumento-p
para asegurarnos de quemkdir
no nos grite por intentar crear un directorio que ya puede existir.La segunda cosa que hace el objetivo
./build/Makefile
es cambiar los directorios albuild
directorio e invocarcmake
.Volvemos al
all
objetivo, invocamos$(MAKE) -C build
, donde$(MAKE)
se genera automáticamente una variable Makefile paramake
.make -C
cambia el directorio antes de hacer nada. Por lo tanto, usar$(MAKE) -C build
es equivalente a hacercd build; make
.Para resumir, llamar a este contenedor Makefile con
make all
omake
es equivalente a hacerlo:El destino
distclean
invocacmake ..
, luegomake -C build clean
, y finalmente, elimina todo el contenido delbuild
directorio. 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 abuild
antes 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 delbuild
directorio.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 usarm
como parte deldistclean
destino, el comando devolverá un error si los archivos no existen (es posible que ya se hayan eliminado con la línea de comandorm -rf build
o 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 proporcionandocmake
un 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
-D
pará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
build
directorio), utilizo el siguiente script:Cada vez que necesite limpiar, debe obtener este script del
build
directorio:fuente
cd .. ; rm ; mkdir ; cd
secuencia 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
cmake
vuelva 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 build
puedes 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 build
y luegomkdir build
y 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 build
para compilar:
cmake --build build
para limpiar:
rm -rf build
para recrear la carpeta de compilación: ni siquiera necesita
mkdir build
, simplemente configúrela concmake -B build
y cmake la crearáfuente
cmake
en su mayoría cocina aMakefile
, uno podría agregarrm
a 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-clean
desde 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