architecture - ¿Cómo creo un único makefile para 32 y 64 bits?
gcc powerpc (5)
Tengo un makefile
que funciona de forma transparente para Linux ( x86_64
) y OS X Intel ( x86_64
). Esto utiliza opciones de GCC específicas de 64 bits.
¿Hay alguna manera de ajustar el archivo MAKE de modo que pueda compilar para OS X PPC de 32 bits y 64 bits ( ppc
, ppc64
) sin tener que mantener ppc64
separados, específicos del arco, tal vez algo como una directiva de preprocesador que puede ¿Determinar la arquitectura antes de construir?
Creo que lograría sus objetivos con menos trabajo (y dolor) si empleara algún tipo de sistema de construcción como cmake o GNU autotools.
Echa un vistazo a esto:
http://mad-scientist.net/make/multi-arch.html
Es algo anticuado, pero tiene buena información que podría ser útil para ti, supongo.
Intente la inclusión de archivos. Esto no es parte de la sintaxis estándar de Makefile (la de la especificación Single Unix v3) pero es ampliamente compatible. Con GNU make, esto se ve así:
include otherfile
Con esto, podrías tener un Makefile x86 como este:
ARCHFLAGS = -m64 -mtune=core2
include common.mk
y un Makefile de PowerPC:
ARCHFLAGS = -mcpu=g3
include common.mk
y la mayor parte de sus reglas de compilación estarán en un archivo ( common.mk
), usando $(ARCHFLAGS)
cuando sea necesario.
Una forma de trabajar esto es:
- tener fragmentos de makefile para cada arquitectura (posiblemente acumulativos):
posix
,win32
,win32-gcc
, etc. - tener un script que se ejecute y determine por qué los fragmentos son adecuados para el host
- incluir esos fragmentos de makefile en el makefile principal
- permitir la anulación manual utilizando variables de entorno (porque a veces las cosas pueden ser complicadas; por ejemplo, pensar en compiladores cruzados)
He usado esto en proyectos de tamaño pequeño a mediano (2 o 3 personas trabajando en código durante algunos años), y se ajusta bien a la cuenta.
ARCH := $(shell getconf LONG_BIT)
CPP_FLAGS_32 := -D32_BIT ... Some 32 specific compiler flags ...
CPP_FLAGS_64 := -D64_BIT
CPP_FLAGS := $(CPP_FLAGS_$(ARCH)) ... all the other flags ...