.PHONY: all
all: setup
	$(MAKE) -f scripts/makefile

.PHONY: examples
examples: setup
	$(MAKE) -f scripts/makefile examples

.PHONY: check
check: all
	@echo -n > tests.mk
	@./scripts/gen-tests $$(echo tests/*.c)
	$(MAKE) -f tests/makefile check

# supported by jit
.PHONY: check_linux_amd64
check_linux_amd64:
	$(MAKE) clean
	QEMU_LD_PREFIX=/usr/x86_64-linux-gnu \
	$(MAKE) ARCH=amd64 CROSS_COMPILE=x86_64-linux-gnu- check

.PHONY: check_linux_x86
check_linux_x86:
	$(MAKE) clean
	QEMU_LD_PREFIX=/usr/i686-linux-gnu \
	$(MAKE) ARCH=x86 CROSS_COMPILE=i686-linux-gnu- check

.PHONY: check_linux_aarch64
check_linux_aarch64:
	$(MAKE) clean
	QEMU_LD_PREFIX=/usr/aarch64-linux-gnu \
	$(MAKE) ARCH=aarch64 CROSS_COMPILE=aarch64-linux-gnu- check

.PHONY: check_linux_armhf
check_linux_armhf:
	$(MAKE) clean
	QEMU_LD_PREFIX=/usr/arm-linux-gnueabihf \
	$(MAKE) ARCH=armhf CROSS_COMPILE=arm-linux-gnueabihf- check

.PHONY: check_linux_powerpc64le
check_linux_powerpc64le:
	$(MAKE) clean
	QEMU_LD_PREFIX=/usr/powerpc64le-linux-gnu \
	$(MAKE) ARCH=powerpc64le CROSS_COMPILE=powerpc64le-linux-gnu- check

# note: older than revision 6
.PHONY: check_linux_mips64el
check_linux_mips64el:
	$(MAKE) clean
	QEMU_LD_PREFIX=/usr/mips64el-linux-gnuabi64 \
	$(MAKE) ARCH=mips64el CROSS_COMPILE=mips64el-linux-gnuabi64- check

.PHONY: check_linux_mipsel
check_linux_mipsel:
	$(MAKE) clean
	QEMU_LD_PREFIX=/usr/mipsel-linux-gnu \
	$(MAKE) ARCH=mipsel CROSS_COMPILE=mipsel-linux-gnu- check

# not supported by jit atm
.PHONY: check_linux_powerpc64
check_linux_powerpc64:
	$(MAKE) clean
	QEMU_LD_PREFIX=/usr/powerpc64-linux-gnu \
	$(MAKE) ARCH=powerpc64 CROSS_COMPILE=powerpc64-linux-gnu- check

.PHONY: check_linux_powerpc
check_linux_powerpc:
	$(MAKE) clean
	QEMU_LD_PREFIX=/usr/powerpc-linux-gnu \
	$(MAKE) ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- check

.PHONY: check_linux_sparc64
check_linux_sparc64:
	$(MAKE) clean
	QEMU_LD_PREFIX=/usr/sparc64-linux-gnu \
	$(MAKE) ARCH=sparc64 CROSS_COMPILE=sparc64-linux-gnu- check

.PHONY: check_linux_riscv64
check_linux_riscv64:
	$(MAKE) clean
	QEMU_LD_PREFIX=/usr/riscv64-linux-gnu \
	$(MAKE) ARCH=riscv64 CROSS_COMPILE=riscv64-linux-gnu- check

.PHONY: check_linux_s390x
check_linux_s390x:
	$(MAKE) clean
	QEMU_LD_PREFIX=/usr/s390x-linux-gnu \
	$(MAKE) ARCH=s390x CROSS_COMPILE=s390x-linux-gnu- check

.PHONY: check_linux_alpha
check_linux_alpha:
	$(MAKE) clean
	QEMU_LD_PREFIX=/usr/alpha-linux-gnu \
	$(MAKE) ARCH=alpha CROSS_COMPILE=alpha-linux-gnu- check

.PHONY: check_linux_hppa
check_linux_hppa:
	$(MAKE) clean
	QEMU_LD_PREFIX=/usr/hppa-linux-gnu \
	$(MAKE) ARCH=hppa CROSS_COMPILE=hppa-linux-gnu- check

.PHONY: check_linux_m68k
check_linux_m68k:
	$(MAKE) clean
	QEMU_LD_PREFIX=/usr/m68k-linux-gnu \
	$(MAKE) ARCH=m68k CROSS_COMPILE=m68k-linux-gnu- check

.PHONY: check_linux
check_linux:
	$(MAKE) check_linux_amd64
	$(MAKE) check_linux_x86
	$(MAKE) check_linux_aarch64
	$(MAKE) check_linux_armhf
	$(MAKE) check_linux_powerpc64le
	$(MAKE) check_linux_mips64el
	$(MAKE) check_linux_mipsel
	$(MAKE) check_linux_powerpc64
	$(MAKE) check_linux_powerpc
	$(MAKE) check_linux_sparc64
	$(MAKE) check_linux_riscv64
	$(MAKE) check_linux_s390x
	$(MAKE) check_linux_alpha
	$(MAKE) check_linux_hppa
	$(MAKE) check_linux_m68k
	# compiler+emulator not available or broken
	#$(MAKE) check_linux_hppa64
	#$(MAKE) check_linux_arc
	#$(MAKE) check_linux_sh4

.DEFAULT: setup
	$(MAKE) -f scripts/makefile $<

.PHONY:
setup:
	@echo -n > deps.mk
	@./scripts/gen-deps -p EJIT -c COMPILE_EJIT -b ejit "$(EJIT_SOURCES)"

CLEANUP		:= build deps.mk tests.md libejit.a examples/fib examples/loop \
			examples/*.d tests/test-*
CLEANUP_CMD	:=
EJIT_SOURCES	:=

include src/source.mk

.PHONY: format
format:
	find src include tests -iname '*.[ch]' |\
		xargs uncrustify -c uncrustify.conf --no-backup -F -

.PHONY: license
license:
	find src include -iname '*.[ch]' |\
		xargs ./scripts/license

.PHONY: docs
docs:
	find src include -iname '*.[ch]' -not -path */gen/* |\
		xargs ./scripts/warn-undocumented
	doxygen docs/doxygen.conf

RM	= rm

.PHONY: clean
clean:
	$(RM) -rf $(CLEANUP)

.PHONY: clean_docs
clean_docs:
	$(RM) -rf docs/output

.PHONY: clean_all
clean_all: clean clean_docs