# binExp-benchmark Makefile
# Supports x86, x86_64, ARM32, MIPS32 cross-compilation

# === Toolchains ===
CC_x86_64 := gcc
CC_x86    := gcc
CC_arm32  := arm-linux-gnueabihf-gcc
CC_mips32 := mipsel-linux-gnu-gcc

# === Toolchain detection ===
HAS_x86_64 := $(shell command -v $(CC_x86_64) 2>/dev/null && echo 1)
HAS_x86    := $(shell echo 'int main(){return 0;}' | $(CC_x86) -m32 -x c -o /dev/null - 2>/dev/null && echo 1)
HAS_arm32  := $(shell command -v $(CC_arm32) 2>/dev/null && echo 1)
HAS_mips32 := $(shell command -v $(CC_mips32) 2>/dev/null && echo 1)

# === Base arch flags ===
ARCHFLAGS_x86_64 := -m64
ARCHFLAGS_x86    := -m32
ARCHFLAGS_arm32  := -static
ARCHFLAGS_mips32 := -static

# === Protection building blocks ===
P_NONE       := -fno-stack-protector -z execstack -no-pie -Wl,-z,norelro
P_PRELRO     := -Wl,-z,relro
P_FRELRO     := -Wl,-z,relro,-z,now
P_NX         := -z noexecstack
P_NO_NX      := -z execstack
P_CANARY     := -fstack-protector-all
P_NO_CANARY  := -fno-stack-protector
P_PIE        := -pie -fPIE
P_NO_PIE     := -no-pie
P_NO_RELRO   := -Wl,-z,norelro

# === Helper macros ===
# Build dir
define MKDIR
	@mkdir -p $(dir $@)
endef

# === Challenge compilation rules ===

# -- Injection (B001-B004, B058) --
challenges/B001/bin/B001_x86_64: challenges/B001/src/B001.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NONE) -o $@ $<

challenges/B002/bin/B002_x86: challenges/B002/src/B002.c
	$(MKDIR)
	$(CC_x86) $(ARCHFLAGS_x86) $(P_NO_CANARY) $(P_NO_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

ifdef HAS_arm32
challenges/B003/bin/B003_arm32: challenges/B003/src/B003.c
	$(MKDIR)
	$(CC_arm32) $(ARCHFLAGS_arm32) $(P_NONE) -o $@ $<
endif

ifdef HAS_mips32
challenges/B004/bin/B004_mips32: challenges/B004/src/B004.c
	$(MKDIR)
	$(CC_mips32) $(ARCHFLAGS_mips32) $(P_NONE) -o $@ $<
endif

# -- Info Leak (B005-B009, B052) --
challenges/B005/bin/B005_x86_64: challenges/B005/src/B005.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

challenges/B006/bin/B006_x86_64: challenges/B006/src/B006.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_NO_RELRO) -O0 -o $@ $<

challenges/B007/bin/B007_x86: challenges/B007/src/B007.c
	$(MKDIR)
	$(CC_x86) $(ARCHFLAGS_x86) $(P_NO_CANARY) $(P_NO_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

ifdef HAS_arm32
challenges/B008/bin/B008_arm32: challenges/B008/src/B008.c
	$(MKDIR)
	$(CC_arm32) $(ARCHFLAGS_arm32) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_NO_RELRO) -o $@ $<
endif

ifdef HAS_mips32
challenges/B009/bin/B009_mips32: challenges/B009/src/B009.c
	$(MKDIR)
	$(CC_mips32) $(ARCHFLAGS_mips32) $(P_NONE) -O0 -o $@ $<
endif

# -- Stack Corruption (B010-B018, B053, B056, B062-B066) --
challenges/B010/bin/B010_x86_64: challenges/B010/src/B010.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NONE) -o $@ $<

challenges/B011/bin/B011_x86: challenges/B011/src/B011.c
	$(MKDIR)
	$(CC_x86) $(ARCHFLAGS_x86) $(P_NONE) -o $@ $<

challenges/B012/bin/B012_x86_64: challenges/B012/src/B012.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NONE) -o $@ $<

challenges/B013/bin/B013_x86_64: challenges/B013/src/B013.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

challenges/B014/bin/B014_x86_64: challenges/B014/src/B014.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

challenges/B015/bin/B015_x86_64: challenges/B015/src/B015.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_PIE) $(P_PRELRO) -o $@ $<

ifdef HAS_arm32
challenges/B016/bin/B016_arm32: challenges/B016/src/B016.c
	$(MKDIR)
	$(CC_arm32) $(ARCHFLAGS_arm32) $(P_NONE) -o $@ $<
endif

ifdef HAS_mips32
challenges/B017/bin/B017_mips32: challenges/B017/src/B017.c
	$(MKDIR)
	$(CC_mips32) $(ARCHFLAGS_mips32) $(P_NONE) -o $@ $<
endif

challenges/B018/bin/B018_x86: challenges/B018/src/B018.c
	$(MKDIR)
	$(CC_x86) $(ARCHFLAGS_x86) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

# -- Format String Write (B019-B022, B051) --
challenges/B019/bin/B019_x86_64: challenges/B019/src/B019.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

challenges/B020/bin/B020_x86: challenges/B020/src/B020.c
	$(MKDIR)
	$(CC_x86) $(ARCHFLAGS_x86) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

challenges/B021/bin/B021_x86_64: challenges/B021/src/B021.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_PIE) $(P_PRELRO) -o $@ $<

ifdef HAS_arm32
challenges/B022/bin/B022_arm32: challenges/B022/src/B022.c
	$(MKDIR)
	$(CC_arm32) $(ARCHFLAGS_arm32) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<
endif

challenges/B023/bin/B023_x86_64: challenges/B023/src/B023.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_PIE) $(P_FRELRO) -o $@ $<

# -- Integer Bugs (B024-B027, B059) --
challenges/B024/bin/B024_x86_64: challenges/B024/src/B024.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_NO_RELRO) -o $@ $<

challenges/B025/bin/B025_x86_64: challenges/B025/src/B025.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

challenges/B026/bin/B026_x86: challenges/B026/src/B026.c
	$(MKDIR)
	$(CC_x86) $(ARCHFLAGS_x86) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_NO_RELRO) -o $@ $<

ifdef HAS_arm32
challenges/B027/bin/B027_arm32: challenges/B027/src/B027.c
	$(MKDIR)
	$(CC_arm32) $(ARCHFLAGS_arm32) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_NO_RELRO) -o $@ $<
endif

# -- Heap Corruption (B028-B037, B049, B054, B055, B057) --
challenges/B028/bin/B028_x86_64: challenges/B028/src/B028.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

challenges/B029/bin/B029_x86_64: challenges/B029/src/B029.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

challenges/B030/bin/B030_x86_64: challenges/B030/src/B030.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

challenges/B031/bin/B031_x86_64: challenges/B031/src/B031.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_PIE) $(P_FRELRO) -o $@ $<

ifdef HAS_arm32
challenges/B032/bin/B032_arm32: challenges/B032/src/B032.c
	$(MKDIR)
	$(CC_arm32) $(ARCHFLAGS_arm32) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<
endif

challenges/B033/bin/B033_x86_64: challenges/B033/src/B033.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_CANARY) $(P_NX) $(P_PIE) $(P_FRELRO) -o $@ $<

challenges/B034/bin/B034_x86_64: challenges/B034/src/B034.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_PIE) $(P_PRELRO) -o $@ $<

challenges/B035/bin/B035_x86: challenges/B035/src/B035.c
	$(MKDIR)
	$(CC_x86) $(ARCHFLAGS_x86) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

ifdef HAS_mips32
challenges/B036/bin/B036_mips32: challenges/B036/src/B036.c
	$(MKDIR)
	$(CC_mips32) $(ARCHFLAGS_mips32) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<
endif

challenges/B037/bin/B037_x86_64: challenges/B037/src/B037.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

# -- Logic Bugs (B038-B041, B050, B060) --
challenges/B038/bin/B038_x86_64: challenges/B038/src/B038.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_CANARY) $(P_NX) $(P_PIE) $(P_FRELRO) -o $@ $<

challenges/B039/bin/B039_x86_64: challenges/B039/src/B039.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_CANARY) $(P_NX) $(P_PIE) $(P_FRELRO) -o $@ $< -lpthread

challenges/B040/bin/B040_x86: challenges/B040/src/B040.c
	$(MKDIR)
	$(CC_x86) $(ARCHFLAGS_x86) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_NO_RELRO) -o $@ $<

ifdef HAS_arm32
challenges/B041/bin/B041_arm32: challenges/B041/src/B041.c
	$(MKDIR)
	$(CC_arm32) $(ARCHFLAGS_arm32) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_NO_RELRO) -o $@ $<
endif

# -- Multi-Vuln (B042-B048, B061) --
challenges/B042/bin/B042_x86_64: challenges/B042/src/B042.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

challenges/B043/bin/B043_x86_64: challenges/B043/src/B043.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_CANARY) $(P_NX) $(P_PIE) $(P_FRELRO) -o $@ $<

challenges/B044/bin/B044_x86_64: challenges/B044/src/B044.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

challenges/B045/bin/B045_x86_64: challenges/B045/src/B045.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_CANARY) $(P_NX) $(P_PIE) $(P_FRELRO) -o $@ $<

challenges/B046/bin/B046_x86_64: challenges/B046/src/B046.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_CANARY) $(P_NX) $(P_PIE) $(P_FRELRO) -o $@ $<

ifdef HAS_arm32
challenges/B047/bin/B047_arm32: challenges/B047/src/B047.c
	$(MKDIR)
	$(CC_arm32) $(ARCHFLAGS_arm32) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_NO_RELRO) -o $@ $<
endif

challenges/B048/bin/B048_x86: challenges/B048/src/B048.c
	$(MKDIR)
	$(CC_x86) $(ARCHFLAGS_x86) $(P_CANARY) $(P_NX) $(P_NO_PIE) $(P_NO_RELRO) -o $@ $<

# -- CVE-based (B049-B058) --
challenges/B049/bin/B049_x86_64: challenges/B049/src/B049.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

challenges/B050/bin/B050_x86_64: challenges/B050/src/B050.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_PIE) $(P_PRELRO) -o $@ $<

ifdef HAS_mips32
challenges/B051/bin/B051_mips32: challenges/B051/src/B051.c
	$(MKDIR)
	$(CC_mips32) $(ARCHFLAGS_mips32) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<
endif

ifdef HAS_arm32
challenges/B052/bin/B052_arm32: challenges/B052/src/B052.c
	$(MKDIR)
	$(CC_arm32) $(ARCHFLAGS_arm32) $(P_NONE) -o $@ $<
endif

challenges/B053/bin/B053_x86_64: challenges/B053/src/B053.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

challenges/B054/bin/B054_x86_64: challenges/B054/src/B054.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

ifdef HAS_mips32
challenges/B055/bin/B055_mips32: challenges/B055/src/B055.c
	$(MKDIR)
	$(CC_mips32) $(ARCHFLAGS_mips32) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<
endif

challenges/B056/bin/B056_x86: challenges/B056/src/B056.c
	$(MKDIR)
	$(CC_x86) $(ARCHFLAGS_x86) $(P_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

ifdef HAS_arm32
challenges/B057/bin/B057_arm32: challenges/B057/src/B057.c
	$(MKDIR)
	$(CC_arm32) $(ARCHFLAGS_arm32) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<
endif

ifdef HAS_mips32
challenges/B058/bin/B058_mips32: challenges/B058/src/B058.c
	$(MKDIR)
	$(CC_mips32) $(ARCHFLAGS_mips32) $(P_NONE) -o $@ $<
endif

# -- Gap-fill challenges (B059-B066) --
ifdef HAS_mips32
challenges/B059/bin/B059_mips32: challenges/B059/src/B059.c
	$(MKDIR)
	$(CC_mips32) $(ARCHFLAGS_mips32) $(P_NONE) -o $@ $<
endif

ifdef HAS_mips32
challenges/B060/bin/B060_mips32: challenges/B060/src/B060.c
	$(MKDIR)
	$(CC_mips32) $(ARCHFLAGS_mips32) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<
endif

ifdef HAS_mips32
challenges/B061/bin/B061_mips32: challenges/B061/src/B061.c
	$(MKDIR)
	$(CC_mips32) $(ARCHFLAGS_mips32) $(P_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<
endif

challenges/B062/bin/B062_x86_64: challenges/B062/src/B062.c
	$(MKDIR)
	$(CC_x86_64) $(ARCHFLAGS_x86_64) $(P_CANARY) $(P_NO_NX) $(P_NO_PIE) $(P_NO_RELRO) -o $@ $<

challenges/B063/bin/B063_x86: challenges/B063/src/B063.c
	$(MKDIR)
	$(CC_x86) $(ARCHFLAGS_x86) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<

ifdef HAS_arm32
challenges/B064/bin/B064_arm32: challenges/B064/src/B064.c
	$(MKDIR)
	$(CC_arm32) $(ARCHFLAGS_arm32) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<
endif

ifdef HAS_mips32
challenges/B065/bin/B065_mips32: challenges/B065/src/B065.c
	$(MKDIR)
	$(CC_mips32) $(ARCHFLAGS_mips32) $(P_NO_CANARY) $(P_NX) $(P_NO_PIE) $(P_PRELRO) -o $@ $<
endif

ifdef HAS_mips32
challenges/B066/bin/B066_mips32: challenges/B066/src/B066.c
	$(MKDIR)
	$(CC_mips32) $(ARCHFLAGS_mips32) $(P_NONE) -o $@ $<
endif

# === Aggregate targets ===
ALL_x86_64 := \
	challenges/B001/bin/B001_x86_64 \
	challenges/B005/bin/B005_x86_64 \
	challenges/B006/bin/B006_x86_64 \
	challenges/B010/bin/B010_x86_64 \
	challenges/B012/bin/B012_x86_64 \
	challenges/B013/bin/B013_x86_64 \
	challenges/B014/bin/B014_x86_64 \
	challenges/B015/bin/B015_x86_64 \
	challenges/B019/bin/B019_x86_64 \
	challenges/B021/bin/B021_x86_64 \
	challenges/B023/bin/B023_x86_64 \
	challenges/B024/bin/B024_x86_64 \
	challenges/B025/bin/B025_x86_64 \
	challenges/B028/bin/B028_x86_64 \
	challenges/B029/bin/B029_x86_64 \
	challenges/B030/bin/B030_x86_64 \
	challenges/B031/bin/B031_x86_64 \
	challenges/B033/bin/B033_x86_64 \
	challenges/B034/bin/B034_x86_64 \
	challenges/B037/bin/B037_x86_64 \
	challenges/B038/bin/B038_x86_64 \
	challenges/B039/bin/B039_x86_64 \
	challenges/B042/bin/B042_x86_64 \
	challenges/B043/bin/B043_x86_64 \
	challenges/B044/bin/B044_x86_64 \
	challenges/B045/bin/B045_x86_64 \
	challenges/B046/bin/B046_x86_64 \
	challenges/B049/bin/B049_x86_64 \
	challenges/B050/bin/B050_x86_64 \
	challenges/B053/bin/B053_x86_64 \
	challenges/B054/bin/B054_x86_64 \
	challenges/B062/bin/B062_x86_64

ALL_x86 := \
	challenges/B002/bin/B002_x86 \
	challenges/B007/bin/B007_x86 \
	challenges/B011/bin/B011_x86 \
	challenges/B018/bin/B018_x86 \
	challenges/B020/bin/B020_x86 \
	challenges/B026/bin/B026_x86 \
	challenges/B035/bin/B035_x86 \
	challenges/B040/bin/B040_x86 \
	challenges/B048/bin/B048_x86 \
	challenges/B056/bin/B056_x86 \
	challenges/B063/bin/B063_x86

ALL_arm32 :=
ifdef HAS_arm32
ALL_arm32 := \
	challenges/B003/bin/B003_arm32 \
	challenges/B008/bin/B008_arm32 \
	challenges/B016/bin/B016_arm32 \
	challenges/B022/bin/B022_arm32 \
	challenges/B027/bin/B027_arm32 \
	challenges/B032/bin/B032_arm32 \
	challenges/B041/bin/B041_arm32 \
	challenges/B047/bin/B047_arm32 \
	challenges/B052/bin/B052_arm32 \
	challenges/B057/bin/B057_arm32 \
	challenges/B064/bin/B064_arm32
endif

ALL_mips32 :=
ifdef HAS_mips32
ALL_mips32 := \
	challenges/B004/bin/B004_mips32 \
	challenges/B009/bin/B009_mips32 \
	challenges/B017/bin/B017_mips32 \
	challenges/B036/bin/B036_mips32 \
	challenges/B051/bin/B051_mips32 \
	challenges/B055/bin/B055_mips32 \
	challenges/B058/bin/B058_mips32 \
	challenges/B059/bin/B059_mips32 \
	challenges/B060/bin/B060_mips32 \
	challenges/B061/bin/B061_mips32 \
	challenges/B065/bin/B065_mips32 \
	challenges/B066/bin/B066_mips32
endif

ALL_TARGETS := $(ALL_x86_64) $(ALL_x86) $(ALL_arm32) $(ALL_mips32)

.PHONY: all clean check-toolchains x86_64 x86 arm32 mips32

all: check-toolchains $(ALL_TARGETS)
	@echo ""
	@echo "=== Build complete ==="
	@echo "Total binaries built: $$(ls challenges/*/bin/* 2>/dev/null | wc -l)"

x86_64: $(ALL_x86_64)
x86: $(ALL_x86)
arm32: $(ALL_arm32)
mips32: $(ALL_mips32)

check-toolchains:
	@echo "=== Toolchain Status ==="
	@echo "  x86_64: $(if $(HAS_x86_64),OK,MISSING)"
	@echo "  x86:    $(if $(HAS_x86),OK,MISSING - install gcc-multilib)"
	@echo "  arm32:  $(if $(HAS_arm32),OK,MISSING - install gcc-arm-linux-gnueabihf)"
	@echo "  mips32: $(if $(HAS_mips32),OK,MISSING - install gcc-mipsel-linux-gnu)"
	@echo ""

clean:
	@find challenges -name 'bin' -type d -exec rm -rf {} + 2>/dev/null || true
	@echo "Cleaned all binaries"
