Makefile Avanzado con Soporte Multiplataforma
¿Qué es ifdef y cómo usarlo?
En un Makefile, ifdef es una directiva que permite incluir o excluir partes del código del Makefile condicionalmente, en función de si una variable está definida o no.
ifdef VARIABLE
# Instrucciones si VARIABLE está definida
else
# Instrucciones si VARIABLE no está definida
endif
Ejemplo:
ifdef ARM_PLATFORM
CC = arm-none-eabi-gcc
CFLAGS = -march=armv7
else
CC = gcc
CFLAGS = -march=x86-64
endif
¿Qué es gcc-arm y cómo usarlo?
gcc-arm es una herramienta de compilación cruzada para generar binarios para arquitecturas ARM desde un sistema que no necesariamente sea ARM. Esto es útil para sistemas embebidos o dispositivos ARM.
Instalación: Instala el toolchain para ARM (por ejemplo, gcc-arm-none-eabi) y úsalo en tu Makefile.
Makefile Avanzado con Soporte Multiplataforma
# Variables generales
SRCS_C = $(wildcard src/*.c)
SRCS_ASM = $(wildcard src/*.asm)
OBJS = $(SRCS_C:src/%.c=obj/%.o) $(SRCS_ASM:src/%.asm=obj/%.o)
BIN = bin/ejecutable.bin
IMG = img/imagen.img
# Definición de plataforma
ifdef ARM_PLATFORM
CC = arm-none-eabi-gcc
AS = arm-none-eabi-as
LD = arm-none-eabi-ld
CFLAGS = -Wall -Iinclude -march=armv7
ASMFLAGS = --warn --fatal-warnings
else
CC = gcc
AS = nasm
LD = ld
CFLAGS = -Wall -Iinclude -march=x86-64
ASMFLAGS = -f elf64
endif
# Reglas principales
all: $(IMG)
$(IMG): $(BIN)
dd if=$< of=$@ bs=512 count=1
$(BIN): obj/ejecutable.elf
objcopy -O binary $< $@
obj/ejecutable.elf: $(OBJS)
$(LD) -o $@ $^
obj/%.o: src/%.asm
$(AS) $(ASMFLAGS) $< -o $@
obj/%.o: src/%.c
$(CC) $(CFLAGS) -c $< -o $@
# Limpieza del proyecto
clean:
rm -f obj/*.o obj/*.elf bin/*.bin img/*.img
.PHONY: all clean
Estructura del Proyecto
src/: Archivos fuente (.c,.asm).include/: Archivos de cabecera (.h).obj/: Archivos objeto (.o).bin/: Binarios finales (.bin,.elf).img/: Imágenes finales (.img).
Cómo usar el soporte multiplataforma
Para compilar para ARM:
make ARM_PLATFORM=1
Para compilar para x86:
make
Explicación paso a paso
- Definir la plataforma: Usa
ifdef ARM_PLATFORMpara configurar el compilador y las banderas de compilación. - Comodines (
wildcard): Busca automáticamente todos los archivos.cy.asmensrc/. - Reglas generales: Se crean automáticamente archivos
.oy se vinculan en un binario.bin. - Soporte de imagen: Convierte el binario final en un archivo
.img.
Con este Makefile, tienes un sistema adaptable para compilar y empaquetar proyectos multiplataforma, gestionado de forma ordenada en subdirectorios.
