Interpretación de Makefile con SUBDIRS y BINARIES

Este fragmento del makefile está configurado para gestionar la compilación de varios subdirectorios (relacionado con diferentes bootloaders para arquitecturas como ARM, RISC-V, x64, y x86).
# Makefile para gestionar la compilación de bootloaders en varios subdirectorios

# Variables
SUBDIRS := bootloader_arm bootloader_riscv bootloader_x64 bootloader_x86
# Si se define la variable 'PLATFORM', se compila solo ese bootloader
PLATFORM ?= all

# Target principal
all: $(SUBDIRS)
	@echo "Compilación de bootloaders completada."

# Regla para cada subdirectorio
$(SUBDIRS):
ifeq ($(PLATFORM),all)
	@echo "Entrando al directorio: $@"
	$(MAKE) -C $@  # Ejecuta el 'make' en el subdirectorio
	@echo "Saliedo del directorio $@ "
else
ifeq ($(PLATFORM),$@)
	@echo "Entrando al directorio: $@"
	$(MAKE) -C $@ # Ejecuta el 'make' en el subdirectorio
	@echo "Saliedo del directorio $@ "
endif
endif

# Limpieza recursiva
clean:
	@echo "Limpiando todos los subdirectorios..."
	for dir in $(SUBDIRS); do \
	$(MAKE) -C $$dir clean; \
 	done
	@echo "Limpieza completada."

.PHONY: all clean $(SUBDIRS) # Declara objetivos que no son archivos

Interpretación del Código Makefile

1. Declaración de Variables

SUBDIRS: Define una lista de subdirectorios que contienen los códigos fuente para los bootloaders de diferentes arquitecturas (ARM, RISC-V, x64 y x86).
PLATFORM: Es una variable que permite seleccionar un subdirectorio específico. Si no se define, el valor predeterminado será all, lo que significa que se procesarán todos los subdirectorios.

2. Target Principal: all

Este es el objetivo principal que se ejecuta al invocar make sin parámetros.

  • Depende de todos los elementos en $(SUBDIRS), por lo que se asegura de que todos los subdirectorios sean procesados.
  • Al completarse, muestra el mensaje: Compilación de bootloaders completada.

3. Reglas para los Subdirectorios

Define reglas para cada subdirectorio incluido en $(SUBDIRS).

$(SUBDIRS):
ifeq ($(PLATFORM),all)
    @echo "Entrando al directorio: $@"
    $(MAKE) -C $@  # Ejecuta 'make' en el subdirectorio
    @echo "Saliendo del directorio: $@"
else
ifeq ($(PLATFORM),$@)
    @echo "Entrando al directorio: $@"
    $(MAKE) -C $@  # Ejecuta 'make' en el subdirectorio
    @echo "Saliendo del directorio: $@"
endif
endif
    

Flujo según PLATFORM:

  • Si PLATFORM es all:
    • Recorre cada subdirectorio listado en $(SUBDIRS).
    • Ejecuta make dentro de cada uno.
  • Si PLATFORM tiene un valor específico (como bootloader_arm):
    • Solo el subdirectorio que coincida con el valor de PLATFORM será procesado.
Mensajes: Muestra mensajes indicando cuándo entra y sale de cada subdirectorio.

4. Target clean: Limpieza Recursiva

Este objetivo elimina los archivos generados en todos los subdirectorios.

clean:
    @echo "Limpiando todos los subdirectorios..."
    for dir in $(SUBDIRS); do \
        $(MAKE) -C $$dir clean; \
    done
    @echo "Limpieza completada."
    
  • Recorre cada subdirectorio en $(SUBDIRS) y ejecuta make clean dentro de ellos.
  • Finalmente, muestra: Limpieza completada.

5. .PHONY

Declara los objetivos all, clean y los nombres de los subdirectorios como objetivos "falsos".
Esto evita conflictos si en el directorio de trabajo existen archivos con los mismos nombres.

Interpretación General

Este Makefile organiza eficientemente la compilación de bootloaders para múltiples arquitecturas, permitiendo:

  • Procesar todos los subdirectorios (PLATFORM=all).
  • Procesar un único subdirectorio específico (PLATFORM=bootloader_arm, por ejemplo).
  • Realizar una limpieza modular recursiva para eliminar los archivos generados.
# Makefile para crear el ejecutable final de la compilación de varios bootloaders de subdirectorios
# Variables
SUBDIRS = bootloader_arm bootloader_riscv bootloader_x64 bootloader_x86
BINARIES = bootloader_arm/bootloader_arm.bin bootloader_riscv/bootloader_riscv.bin \
 bootloader_x64/bootloader_x64.bin bootloader_x86/bootloader_x86.bin

all: $(SUBDIRS) final_executable

$(SUBDIRS):
 $(MAKE) -C $@

final_executable: $(BINARIES)
 cat $(BINARIES) > bootloader_final.img

clean:
 for dir in $(SUBDIRS); do $(MAKE) -C $$dir clean; done
 rm -f bootloader_final.img

Interpretación de Makefile

1. SUBDIRS y BINARIES

SUBDIRS:

  • Lista de subdirectorios que contienen los códigos fuente de los bootloaders para diferentes arquitecturas: ARM, RISC-V, x64, y x86.

BINARIES:

  • Lista de rutas hacia los binarios generados en cada subdirectorio (por ejemplo, bootloader_arm/bootloader_arm.bin).

2. Target principal: all

El target principal que se ejecuta al invocar make. Depende de dos elementos:

  1. $(SUBDIRS): Procesa los subdirectorios.
  2. final_executable: Genera el archivo final combinando los binarios.

3. Target SUBDIRS

Procesa cada subdirectorio utilizando:

$(MAKE) -C $@
  • $(MAKE): Invoca una nueva instancia de make.
  • -C $@: Cambia al subdirectorio actual ($@) y ejecuta make.

4. Target final_executable

Combina todos los binarios en un archivo único utilizando el comando cat:

cat $(BINARIES) > bootloader_final.img

5. Target clean

Elimina archivos generados y limpia el proyecto:

  • Recorre cada subdirectorio y ejecuta make clean.
  • Elimina el archivo final bootloader_final.img.

    clean:
        for dir in $(SUBDIRS); do $(MAKE) -C $$dir clean; done
        rm -f bootloader_final.img
    

Interpretación General

Este makefile organiza y automatiza la compilación de bootloaders para diferentes arquitecturas de CPU:

  • Cada subdirectorio contiene archivos específicos para una arquitectura.
  • Los binarios generados se combinan en un archivo final bootloader_final.img.
  • La limpieza del proyecto se realiza de forma modular.

 

Destacado

Bootloader Avanzado en Ensamblador

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