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
esall
:- Recorre cada subdirectorio listado en
$(SUBDIRS)
. - Ejecuta
make
dentro de cada uno.
- Recorre cada subdirectorio listado en
- Si
PLATFORM
tiene un valor específico (comobootloader_arm
):- Solo el subdirectorio que coincida con el valor de
PLATFORM
será procesado.
- Solo el subdirectorio que coincida con el valor de
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 ejecutamake 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:
$(SUBDIRS)
: Procesa los subdirectorios.final_executable
: Genera el archivo final combinando los binarios.
3. Target SUBDIRS
Procesa cada subdirectorio utilizando:
$(MAKE) -C $@
$(MAKE)
: Invoca una nueva instancia demake
.-C $@
: Cambia al subdirectorio actual ($@
) y ejecutamake
.
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.