2010-01-26 12 views
20

Busqué la respuesta a esta pregunta pero no pude encontrar ningún bien. Quizás son viejos y algo ha cambiado, así que vuelvo a preguntar.Automake generando binarios en bin/en lugar de en src/

que tienen una estructura de directorios como:

mi_proyecto

  • src

  • bin

Quiero que, cuando yo hago en el directorio raíz, los binarios se ponen en ./bin, en lugar de saturar ./src. ¿Pero cómo?

EDITAR: Estoy usando C++. My Makefile.am no tiene nada de especial. Solo las variables bin_PROGRAM y _SOURCES.

Cuando ejecuto make, los binarios generados se ponen en ./src. Simplemente los quiero en ./bin.

+0

publique lo que ha hecho (su archivo MAKE), aclare la estructura de su directorio anterior, entonces será mucho más fácil ayudarlo (también, el lenguaje de programación que está utilizando podría ser relevante) – KevinDTimm

+0

¿Está utilizando la pila completa de Autotools? Si es así, como se menciona @Braden, solo usa el script de shell 'configure' generado por Autoconf. – Plamen

+0

http: // stackoverflow.com/questions/1015700/autotools-library-and-object-file-output-control –

Respuesta

29

Aquí tienes una idea equivocada.

Su árbol de compilación es dondequiera que ejecute configure. Así es como autoconf está diseñado para funcionar. Los usuarios de su paquete (que no desean saturar su árbol fuente) esperarán que funcione de esta manera.

Este enfoque es una solución más general con mucha más flexibilidad que la organización que está imaginando. Por ejemplo, no es terriblemente inusual querer mantener fuentes y crear archivos en sistemas de archivos separados.

18

Automake no funciona muy bien si intenta configurar sus directorios de una manera diferente a lo esperado. Lo que desea implicaría escribir reglas adicionales para mover los binarios al ../bin después de compilarlos, lo cual es innecesariamente complicado.

Si no quiere saturar su directorio de origen, intente esto:

cd my_project 
mkdir build 
cd build 
../configure 
make 

que pondrá todos los archivos generados (como archivos make, binarios, archivos de objeto) en los subdirectorios de my_project/build.

+0

Funciona, pero es un poco clúster. Podría hacerlo, pero ¿y si otros usan mi software? Ellos tendrán su ./src abarrotado. ¿Tal vez podría simplemente agregar estos comandos a Makefile's all rule? –

+1

'configure' es lo que genera los makefiles, por lo que no puede poner ese comando en el archivo MAKE. Puedo decir con seguridad que a la mayoría de las personas no les importa tener su ./src abarrotado, porque Automake siempre funciona de esa manera. Esta es la solución estándar para aquellos a quienes les importa. ¿Y si prefieren tener los binarios en el mismo directorio? Si aún desea configurarlo, no creo que haya forma de hacerlo sin renunciar a Automake (aunque aún puede usar Autoconf.) – ptomato

+2

Plus, si otras personas usan su software y lo ven así. usa autoconf/automake, no esperan que construya cosas en un directorio separado (a menos que lo arreglen ejecutando configure else como lo ha mostrado ptomato). Es solo la filosofía del GNU Build System, y Autoconf/Automake son herramientas para implementar el Sistema de compilación GNU y no otra cosa. Es posible que desee consultar el capítulo introductorio de Automake para casos de uso típicos del usuario del GNU Build System: http://sources.redhat.com/automake/automake.html#Use-Cases – adl

14

Una forma de decirle a Automake que cree binarios en un directorio determinado es agregar este directorio directamente al nombre en la variable "bin_PROGRAMS".

Considere lo siguiente src/Makefile.am:

bin_PROGRAMS = foo 
foo_SOURCES = ... 
foo_CPPFLAGS = ... 
foo_LDFLAGS = ... 

Se crea un binario "src/foo", pero se puede decir Automake utilizar las fuentes en src para crear un binario "bin/foo" :

bin_PROGRAMS = $(top_builddir)/bin/foo 
__top_builddir__bin_foo_SOURCES = ... 
__top_builddir__bin_foo_CPPFLAGS = ... 
__top_builddir__bin_foo_LDFLAGS = ... 

Lo probé con algunos paquetes e incluso "make distcheck" lo traga. Sin embargo, no puede ser tan hack ...

+0

Es la mejor solución, creo. No es perfecto, porque todos los archivos .o y creados por el proceso de compilación todavía están en src, pero ... –

+1

¿Hay alguna forma de mover * todo * compilación relacionada con una subcarpeta como compilación/(incluidos archivos de objetos, archivos de texto generados? , .desktop archivos, etc.), similar a lo que soy común en el mundo de Java con, por ejemplo, Maven. – lanoxx

+2

Puede intentar ejecutar el script de configuración desde otra carpeta; por ejemplo, puede crear una subcarpeta "compilar", ejecutar "cd build; ../configure; make". Esto dejará intacto todo lo que está fuera de "compilación" y generará todos los archivos dentro de "compilación", incluidos objetos y binarios. –

Cuestiones relacionadas