Makefile Avanzado con Soporte Multiplataforma

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

  1. Definir la plataforma: Usa ifdef ARM_PLATFORM para configurar el compilador y las banderas de compilación.
  2. Comodines (wildcard): Busca automáticamente todos los archivos .c y .asm en src/.
  3. Reglas generales: Se crean automáticamente archivos .o y se vinculan en un binario .bin.
  4. 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.

 

 

 

 

Destacado

Bootloader Avanzado en Ensamblador

Bootloader Avanzado en Ensamblador Características del Bootloader Se carga en la dirección 0x7C00 (BIOS). ...