TOPDIR=$(shell pwd)
BUILDDIR=$(TOPDIR)
obj=$(BUILDDIR)
src=$(TOPDIR)
bld=$(BUILDDIR)

export TOPDIR BUILDDIR obj src bld
export ISLA = $(shell echo __loongarch__|$(CROSS_COMPILE)gcc  -E  - |grep -q '^1$$' && echo 1)
export ISLA32 = $(shell echo __loongarch32|$(CROSS_COMPILE)gcc  -E  - |grep -q '^1$$' && echo 1)
ifeq ($(ISLA),1)
export CROSS_COMPILE?=loongarch64-linux-gnu-
export EXTRA_CFLAGS := -I$(TOPDIR)/include/loongarch $(call cc-option,-mlvz,-mlcsr) $(call cc-option,-mstrict-align,) $(EXTRA_CFLAGS) -Og -D_loongarchjtag -fno-jump-tables
ifeq ($(shell $(CROSS_COMPILE)gcc --print-file include/larchintrin.h),include/larchintrin.h)
export EXTRA_CFLAGS += -I$(TOPDIR)/include/loongarch32
endif

#affix = -la
obj=$(TOPDIR)/labin
ifeq ($(ISLA32),1)
export EXTRA_CFLAGS := $(EXTRA_CFLAGS) -D_loongarch32jtag=1
obj=$(TOPDIR)/la32bin
all: clean labins
	make LOADADDR=0 clean  laelfs
	make clean
else
all: clean labin64s
	make LOADADDR=0 clean  laelf64s
	make clean
endif
else
export CROSS_COMPILE?=mipsel-linux-
export EXTRA_CFLAGS := -I$(TOPDIR)/include/mips  $(EXTRA_CFLAGS) -Og
obj=$(TOPDIR)/mipsbin
all:
	make clean bin32s ARCH_FLAGS=-march=mips32\ -mno-branch-likely
	make clean bin64s
	make LOADADDR=0 clean  elfs ARCH_FLAGS=-march=mips32\ -mno-branch-likely
	make LOADADDR=0 clean  elf64s
	make clean
endif

testbin:
	gcc -o testbin testbin.c
clean:
	rm -f *.lds
	cd $(obj);rm -f *.o *.s *.a testbin *.o64 *.s64 *.O *.O64
	cd $(obj);for i in libm libm64 libtinyc libtinyc64;do rm -f $$i/*.o  $$i/*.o64 $$i/mips/*.o $$i/mips/*.o64 $$i/loongarch/*.o64 $$i/*.o64;rmdir $$i/mips $$i/loongarch $$i;done;true
clean1:
	cd $(obj);rm -f *.elf *.elf64 *.ELF *.ELF64
	make clean
cleanall:
	cd $(obj);rm -f *.bin* *.bin64* *.BIN *.BIN64 *.bin-* *.BIN-* *.bin64-* *.BIN64-*
	make clean1

export CROSS_COMPILE
OBJCOPY = $(CROSS_COMPILE)objcopy
srcs := $(shell echo *.c|sed 's/\stest[^.]*\.c/ /g' ) test.c
bins := $(addprefix $(obj)/, $(patsubst %.c,%.bin$(affix),$(srcs)) $(patsubst %.c,%.bin64$(affix),$(srcs)) $(shell echo *.S|sed 's/bin.lds.S//;s/bin64.lds.S//;s/start.*[.]S//;'|sed 's/[.]S/.BIN64/g') $(shell echo *.S|sed 's/bin.lds.S//;s/bin64.lds.S//;s/start.*[.]S//;s/loongson3\S*.S//g;'|sed 's/[.]S/.BIN/g'))

export CFLAGS LOADADDR

labin64s: $(patsubst %.c,$(obj)/%.bin64$(affix),$(filter-out cache%.c %cache.c dumptlb.c tlb%.c guess.c guess1.c guess2.c memtest.c $(wildcard *-mips.c), $(srcs)))
laelf64s: $(patsubst %.c,$(obj)/%.elf64,$(filter-out cache%.c %cache.c dumptlb.c tlb%.c guess.c guess1.c guess2.c memtest.c, $(srcs)))
labins: $(patsubst %.c,$(obj)/%.bin$(affix),$(filter-out cache%.c %cache.c %tlb.c tlb%.c guess.c guess1.c guess2.c memtest.c, $(srcs)))
laelfs: $(patsubst %.c,$(obj)/%.elf,$(filter-out cache%.c %cache.c %tlb.c tlb%.c guess.c guess1.c guess2.c memtest.c, $(srcs)))
#$(error $(bin64s))

bin32s: $(addprefix $(obj)/, $(patsubst %.c,%.bin$(affix),$(filter-out drdtime.c dump_tlb.c $(wildcard *-la.c),$(srcs))) $(shell echo *.S|sed 's/bin.lds.S//;s/bin64.lds.S//;s/start.*[.]S//;s/loongson3\S*.S//g;'|sed 's/[.]S/.BIN/g'))
bin64s: $(addprefix $(obj)/, $(patsubst %.c,%.bin64$(affix),$(filter-out drdtime.c dump_tlb.c $(wildcard *-la.c),$(srcs))) $(shell echo *.S|sed 's/bin.lds.S//;s/bin64.lds.S//;s/start[^ ]*[.]S//g;'|sed 's/[.]S/.BIN64/g'))
elfs : $(patsubst %.c,$(obj)/%.elf,$(filter-out drdtime.c dump_tlb.c $(wildcard *-la.c),$(srcs)))
elf64s : $(patsubst %.c,$(obj)/%.elf64,$(filter-out drdtime.c dump_tlb.c $(wildcard *-la.c),$(srcs)))

ifneq ($(ISLA),1)
%.elf: export ARCH_FLAGS=-march=mips32 -mno-branch-likely
%.ELF: export ARCH_FLAGS=-march=mips32 -mno-branch-likely
endif

.SUFFIXES: .elf .o64 .elf64 .bin64 .BIN .i .O .O64 .BIN .BIN64 .ELF .BIN64
$(obj):
	mkdir -p $@

$(obj)/libtinyc.a $(obj)/libtinyc64.a $(obj)/libm.a $(obj)/libm64.a: FORCE
	make -f $(TOPDIR)/rules.make $@

%.bin: %.elf
	$(OBJCOPY) -O binary $< $@ 

%.bin64: %.elf64
	$(OBJCOPY) -O binary $< $@ 

%.BIN$(affix):%.ELF
	$(OBJCOPY) -O binary  $< $@

%.BIN64$(affix):%.ELF64
	$(OBJCOPY) -O binary  $< $@

%.elf %.elf64 %.ELF %.ELF64: FORCE
	make -f $(TOPDIR)/rules.make $@

FORCE: ;
