Automake: ¿cómo mantener limpio el árbol de origen?

10

Tengo un proyecto que usa herramientas automáticas GNU para construirse. Estoy tratando de modificar para que las herramientas automáticas generen todos los archivos de control no versionados en un directorio separado para que pueda mantener el árbol de origen limpio de archivos temporales. Alguien tiene alguna idea de cómo hacer esto?

vorad
fuente
66
Simplemente haga una compilación fuera del árbol: stackoverflow.com/questions/1311231/ ... todavía deja algunos residuos, desafortunadamente. Prueba CMake algún día.
Vitor Py
3
Ese día ha llegado, me llevó menos de una hora cambiar de esa fea configuración automática a cmake, que parece mucho más limpia.
vorad 01 de
1
CMake es mucho más limpio que la configuración automática: de hecho, una compilación fuera del árbol es la forma más común de hacer una compilación CMake. Buena elección :)
Vitor Py
¿Qué tan usual es tener un Makefile en la parte superior del árbol fuente que controla el proceso de compilación con cmake? Digamos que make ejecutará mkdir -p build && cd build && cmake .. && make y así sucesivamente (diferentes objetivos pueden ser make test, etc.).
vorad 01 de
Poco común. ¡CMake debería generar archivos MAKE, no al revés! Busque un libro llamado Mastering CMake o en los procesos de creación de VTK o KDE para ver ejemplos de palabras reales. Una gran ventaja de CMake es estar al tanto de make: también puede compilar su software usando Visual Studio vcproj, nmake Makefiles, XCode, etc. KDE usa un script de shell ('kdebuild') para iniciar los procesos de compilación; tal vez quiera tomar Un vistazo a ello.
Vitor Py

Respuestas:

2

El paquete de herramientas automáticas tiene muchas rutas y nombres relativos codificados por una buena razón. Su mejor opción es resumir el resultado y etiquetarlos como ignorados en su control de revisión, por ejemplo .cvsignore, en , .hgignoreo como un svn:ignoreatributo. Algunos RCS le permiten incluso especificar comodines de forma recursiva.

aquaherd
fuente
44
No hay una sola buena razón para tener estos caminos relativos codificados, aparte de este es el estilo de programación Unix de los años 70.
Lothar
2

Solución: hacer una compilación fuera de la fuente

  • Como se sugiere en los comentarios, puede hacer una compilación fuera de la fuente.
  • El principio es: crear otro directorio, un "árbol de compilación", ejecutar el script de configuración desde ese directorio (con ruta relativa o absoluta).

Ejemplo con verificación automatizada

Por ejemplo, esto buscará y creará GNU hello y comprobará que el árbol de origen no se modifique un poco.

Preparación del árbol fuente

Esta parte recupera y prepara los directorios.

{
wget -S http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
tar zxvf hello-2.10.tar.gz
mv hello-2.10 hello-2.10-pristine
tar zxvf hello-2.10.tar.gz
diff -urq hello-2.10 hello-2.10-pristine && echo "Before build, directories are identical."
cd hello-2.10
}

Parte genérica: reutilícela en su proyecto

Esta parte se puede usar con otros proyectos basados ​​en autoconf. Simplemente cd en su proyecto antes de ejecutar. Cuidado: esto funciona rm, si juegas con variantes ten cuidado, eres responsable en cualquier caso.

export MYPREFIX="${PWD}.installtree"
(
set -eu # abort on error
ls configure # make sure it aborts if not in correct directory
export SRCTREE="${PWD}"
export BUILDTREE="${PWD}.buildtree"
rm -rf "$BUILDTREE" "$MYPREFIX"
mkdir "$BUILDTREE" "$MYPREFIX"
cd "$BUILDTREE"
"${SRCTREE}"/configure --prefix="${MYPREFIX?}"
time make -k || time make
time make install
)

Comprobar parte

Esto comprueba si la compilación está perfectamente fuera de la fuente.

{
ls "$MYPREFIX"/bin/hello && echo "Okay, build generated the target."
cd "$MYPREFIX"/..
diff -urq hello-2.10 hello-2.10-pristine && echo "No change at all. Perfect out-of-source build success."
}

Aquí da salida a esto:

/tmp/hello-2.10.installtree/bin/hello
Okay, build generated the target.
No change at all. Perfect out-of-source build success.

Bonificación: instalación no root

La --prefix="${MYPREFIX?}"parte de arriba es opcional. Permite hacer una "instalación de instalación" que es local para su cuenta. Si desea la tradicional "sudo make install" en una ubicación de todo el sistema, puede eliminarla --prefix="${MYPREFIX?}".

Stéphane Gourichon
fuente