CC_x64=gcc
CC_X86=gcc
CC_ARM=arm-linux-gnueabi-gcc-7
CC_MIPS=mips-linux-gnu-gcc-7
CC_PPC=powerpc-linux-gnu-gcc-7

CFLAGS_X64=-O0 -g -fno-stack-protector
CFLAGS_X86=-O0 -g -m32 -fno-stack-protector
CFLAGS_ARM=-O0 -g -fno-stack-protector 
CFLAGS_MIPS=-O0 -g -fno-stack-protector
CFLAGS_PPC=-O0 -g -fno-stack-protector

define compile_x64
	@echo "Compiling x64 target:" $(1)
	$(CC_x64) $(CFLAGS_X64) -o build/$(1)_x64.out $(1).c
	execstack -s build/$(1)_x64.out
endef

define compile_x86
	@echo "Compiling x86 target:" $(1)
	$(CC_X86) $(CFLAGS_X86) -o build/$(1)_x86.out $(1).c
	execstack -s build/$(1)_x86.out
endef

define compile_mips
	@echo "Compiling mips target:" $(1)
	$(CC_MIPS) $(CFLAGS_MIPS) -o build/$(1)_mips.out $(1).c
	execstack -s build/$(1)_mips.out
endef

define compile_arm
	@echo "Compiling arm target:" $(1)
	$(CC_ARM) $(CFLAGS_ARM) -o build/$(1)_arm.out $(1).c
	execstack -s build/$(1)_arm.out
endef

define compile_ppc
	@echo "Compiling ppc target:" $(1)
	$(CC_PPC) $(CFLAGS_PPC) -o build/$(1)_ppc.out $(1).c
	execstack -s build/$(1)_ppc.out
endef

define compile_all
	$(shell mkdir -p "build")
	$(call compile_x64,$(1))
	$(call compile_x86,$(1))
	$(call compile_arm,$(1))
	$(call compile_mips,$(1))
	$(call compile_ppc,$(1))
endef

all:
	$(call compile_all,c_constructs)
	$(call compile_all,cwe_190)
	$(call compile_all,cwe_243)
	$(call compile_all,cwe_243_clean)
	$(call compile_all,cwe_332)
	$(call compile_all,cwe_367)
	$(call compile_all,cwe_415)
	$(call compile_all,cwe_426)
	$(call compile_all,cwe_457)			
	$(call compile_all,cwe_467)
	$(call compile_all,cwe_476)
	$(call compile_all,cwe_478)
	$(call compile_x64,cwe_782)	
	$(call compile_all,arrays)
	$(call compile_all,memory_access)	

clean:
	rm -rf build