BASE_ADDR ?= 0xabba000

# TODO: somehow unify target tuples (for most linux distros binutils packages, -unknown is not part of the target triple)
# TODO: fix aarch64-amx for socket ... (sorry ...)

.PHONY: loongarch64_socket riscv64_socket aarch64_socket aarch64-vector_socket x86_64_socket

x86_64_socket: x86_64_setup_socket build
	@echo "built target x86_64_socket"

x86_64_setup_socket:
	$(eval PLATFORM := x86_64)
	$(eval CC := gcc)
	$(eval LD := ld)
	$(eval MINI_STD := ministd/alarm.c ministd/stdlib.c ministd/arch/x86_64/start_asm.S ministd/arch/x86_64/syscall_asm.S)
	$(eval C_FILES := runner_socket.c arch/x86_64/runner_asm.S arch/x86_64/arch_runner.c ${MINI_STD})
	$(eval LINKER_FILE := runner_x86_64.ld)
	$(eval OUT := runner_socket_${PLATFORM})


loongarch64_socket: loongarch64_setup_socket build
	@echo "built target loongarch64_socket"

loongarch64_enum: loongarch64_setup_enum build
	@echo "built target loongarch64_enum"

loongarch64_setup_socket:
	$(eval PLATFORM := loongarch64)
	$(eval CROSS_TOOLS_BIN := loongarch64/cross-tools/bin)
	$(eval CC := loongarch64-linux-gnu-gcc-14)
	$(eval LD := loongarch64-linux-gnu-ld)
	$(eval MINI_STD := ministd/alarm.c ministd/stdlib.c ministd/arch/loongarch64/start_asm.S ministd/arch/loongarch64/syscall_asm.S)
	$(eval C_FILES := runner_socket.c arch/loongarch64/runner_asm.S arch/loongarch64/arch_runner.c ${MINI_STD})
	$(eval LINKER_FILE := runner_loongarch64.ld)
	$(eval OUT := runner_socket_${PLATFORM})

loongarch64_setup_enum:
	$(eval PLATFORM := loongarch64)
	$(eval CROSS_TOOLS_BIN := loongarch64/cross-tools/bin)
	$(eval CC := loongarch64-linux-gnu-gcc-14)
	$(eval LD := loongarch64-linux-gnu-ld)
	$(eval MINI_STD := ministd/alarm.c ministd/stdlib.c ministd/arch/loongarch64/start_asm.S ministd/arch/loongarch64/syscall_asm.S)
	$(eval C_FILES := enum.c arch/loongarch64/runner_asm.S arch/loongarch64/arch_runner.c ${MINI_STD})
	$(eval LINKER_FILE := runner_loongarch64.ld)
	$(eval OUT := enum_${PLATFORM})

riscv64_socket: riscv64_setup_socket build
	@echo "built target riscv64_socket"

riscv64_setup_socket:
	$(eval PLATFORM := riscv64)
	$(eval CC := riscv64-linux-gnu-gcc)
	$(eval LD := riscv64-linux-gnu-ld)
	$(eval MINI_STD := ministd/alarm.c ministd/stdlib.c ministd/arch/riscv64/start_asm.S ministd/arch/riscv64/syscall_asm.S)
	$(eval C_FILES := runner_socket.c arch/riscv64/runner_asm.S arch/riscv64/arch_runner.c ${MINI_STD})
	$(eval LINKER_FILE := runner_riscv64.ld)
	$(eval OUT := runner_socket_${PLATFORM})

aarch64_socket: aarch64_setup_socket build
	@echo "built target aarch64_socket"

aarch64_setup_socket:
	$(eval PLATFORM := aarch64)
	$(eval CC := aarch64-linux-gnu-gcc)
	$(eval LD := aarch64-linux-gnu-ld)
	$(eval MINI_STD := ministd/alarm.c ministd/stdlib.c ministd/arch/aarch64/start_asm.S ministd/arch/aarch64/syscall_asm.S)
	$(eval C_FILES := runner_socket.c arch/aarch64/runner_asm.S arch/aarch64/arch_runner.c ${MINI_STD})
	$(eval LINKER_FILE := runner_aarch64.ld)
	$(eval OUT := runner_socket_${PLATFORM})

aarch64-vector_setup_socket:
	$(eval CC = aarch64-linux-gnu-gcc -DVECTOR)
	$(eval OUT = runner_socket_${PLATFORM}-vector)


aarch64-vector_socket: aarch64_setup_socket aarch64-vector_setup_socket build
	@echo "built target aarch64-vector_socket"

mips64_socket: mips64_setup_socket build
	@echo "built target mips64_socket"

mips64_setup_socket:
	$(eval PLATFORM := mips64)
	$(eval CC := mips64el-linux-gnuabi64-gcc -mno-abicalls -fno-pie)
	$(eval LD := mips64el-linux-gnuabi64-ld)
	$(eval MINI_STD := ministd/alarm.c ministd/stdlib.c ministd/arch/mips64/start_asm.S ministd/arch/mips64/syscall_asm.S)
	$(eval C_FILES := runner_socket.c arch/mips64/runner_asm.S arch/mips64/arch_runner.c ${MINI_STD})
	$(eval LINKER_FILE := runner_mips64.ld)
	$(eval OUT := runner_socket_${PLATFORM})

build:
	echo "BASE_ADDR = ${BASE_ADDR} ;">runner_vars.ld
	${CC} -g -c -O3 ${C_FILES} -I. -Iarch/${PLATFORM} -Iministd -Iministd/arch/${PLATFORM} -fno-builtin -nostdlib -static -fno-stack-protector
	${LD} -T ${LINKER_FILE} -o ${OUT} *.o -nostdlib
	rm *.o

clean:
	rm -f *.o runner_socket_* runner_vars.ld
