Makefile con Condicionales

Makefile Actualizado

El siguiente Makefile incluye soporte para múltiples arquitecturas con detección condicional de acuerdo con la variable ARCH. Las configuraciones predeterminadas están optimizadas para ensambladores y enlazadores.

Descripción modular

  1. bootloader.asm: Contiene la configuración básica del sistema y la lógica para cargar la segunda etapa del bootloader (Stage 2).
  2. x86.asm: Código optimizado para sistemas de 32 bits (x86) con configuración inicial de hardware y periféricos.
  3. x86_64.asm: Módulo preparado para sistemas de 64 bits (x86_64), incluyendo configuraciones avanzadas como GPIO, UART, y temporizadores.

 

Cambios implementados

  1. Punto de entrada (-e _start):
    • El enlazador usará la etiqueta _start como el punto inicial del programa.
  2. Objetivo principal (all):
    • Ahora incluye automáticamente todos los objetivos (bootloader, graphics, architecture, y link).
  3. Limpieza explícita (clean):
    • Elimina todos los archivos generados (*.o y el binario final system.bin).
  4. Compatibilidad con múltiples arquitecturas (ARCH):
    • Puedes cambiar entre las arquitecturas (x86, x86_64, arm, risc) usando el argumento ARCH.
  5. Uso de .PHONY:
    • Evita conflictos con nombres de archivos reales en el directorio.
     

Makefile

ASM=nasm
ARM_ASM=arm-none-eabi-as
RISC_ASM=riscv64-unknown-elf-as
LD=ld
ASM_FLAGS_32=-f elf32
ASM_FLAGS_64=-f elf64
LD_FLAGS=--oformat binary -Ttext 0x7C00

# Detectar la arquitectura especificada como variable (por defecto x86_64)
ARCH ?= x86_64

ifeq ($(ARCH), x86)
    ASM_FLAGS=$(ASM_FLAGS_32)
    ARCH_SRC=architecture/x86.asm
    LD_ARCH=architecture/x86.o
else ifeq ($(ARCH), x86_64)
    ASM_FLAGS=$(ASM_FLAGS_64)
    ARCH_SRC=architecture/x86_64.asm
    LD_ARCH=architecture/x86_64.o
else ifeq ($(ARCH), arm)
    ASM=$(ARM_ASM)
    ASM_FLAGS=
    ARCH_SRC=architecture/arm_support.asm
    LD_ARCH=architecture/arm_support.o
else ifeq ($(ARCH), risc)
    ASM=$(RISC_ASM)
    ASM_FLAGS=
    ARCH_SRC=architecture/risc_support.asm
    LD_ARCH=architecture/risc_support.o
else
    $(error "Arquitectura desconocida: $(ARCH)")
endif

# Marcamos los objetivos como phony para evitar conflictos
.PHONY: all bootloader graphics architecture link clean

# Objetivo principal
all: bootloader graphics architecture link

# Compilación del bootloader
bootloader:
    $(ASM) $(ASM_FLAGS) -o bootloader/bootloader.o bootloader/bootloader.asm

# Compilación del módulo de gráficos
graphics:
    $(ASM) $(ASM_FLAGS) -o graphics/graphics.o graphics/graphics.asm

# Compilación específica de la arquitectura
architecture:
    $(ASM) $(ASM_FLAGS) -o $(LD_ARCH) $(ARCH_SRC)

# Enlace final de los módulos
link:
    $(LD) $(LD_FLAGS) -e _start -o system.bin bootloader/bootloader.o $(LD_ARCH) graphics/graphics.o

# Limpieza de los archivos generados
clean:
    rm -f bootloader/*.o architecture/*.o graphics/*.o system.bin
    

Instrucciones paso a paso

Para compilar este Makefile, sigue los pasos a continuación:

1. Compilar para una arquitectura específica

# Para x86:
make ARCH=x86

# Para x86_64:
make ARCH=x86_64

# Para ARM:
make ARCH=arm

# Para RISC-V:
make ARCH=risc
    

2. Limpieza de archivos generados

Ejecuta el siguiente comando para eliminar los archivos objeto generados y el binario:

make clean
    

3. Depuración

Activa el modo de depuración para rastrear el proceso de compilación:

make ARCH=x86 --debug=v
    

 

Notas adicionales

  • Asegúrate de que los ensambladores nasm, arm-none-eabi-as, y riscv64-unknown-elf-as estén correctamente instalados y configurados en tu sistema.
  • Verifica que los archivos fuente (bootloader.asm, x86.asm, x86_64.asm, etc.) estén en las rutas especificadas en el Makefile.

 

 

 

 

Destacado

Bootloader Avanzado en Ensamblador

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