.SUFFIXES: .bin .bin16 .bin32 .bin64 .o .o64 .aout .aoutb .obj .obj64 \
	   .mo32 .mo64 .dbg .i .od .ox .ith .srec .exe .lst \
	   .asm .pl

# Binary suffixes
O		= @OBJEXT@
X		= @EXEEXT@
A		= @LIBEXT@

NASM	= ../nasm$(X)
NDISASM	= ../ndisasm$(X)
OMFDUMP = ../misc/omfdump$(X)
LISTOPT = -L+
NASMOPT = -DSRC -Ox -I../misc -I../travis/pushimm -I../travis/macroerr -I../travis/incbin $(LISTOPT) $(OPT)
PERL	= perl
TESTS	= $(wildcard *.asm)
RM_F	= rm -f
RM_RF	= rm -rf

.PHONY: tools nasm ndisasm ffmpegtest x264test dav1dtest intel-ipsec-mbtest isa-ltest isa-l_cryptotest cryptography-primitivestest
tools:
	$(MAKE) -C .. all

nasm ndisasm:
	$(MAKE) -C .. $(@F)

$(NASM) $(NDISASM):
	$(MAKE) -C .. $(@F)

ffmpegtest:
	bash projtest.sh '$(NASM)' $@

x264test:
	bash projtest.sh '$(NASM)' $@

dav1dtest:
	bash projtest.sh '$(NASM)' $@

intel-ipsec-mbtest:
	bash projtest.sh '$(NASM)' $@

isa-ltest:
	bash projtest.sh '$(NASM)' $@

isa-l_cryptotest:
	bash projtest.sh '$(NASM)' $@

cryptography-primitivestest:
	bash projtest.sh '$(NASM)' $@

%.bin: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f bin -o $@ -MD $@.dep -l $@.lst $<

%.bin16: %.asm $(NASM)
	$(NASM) --bits 16 $(NASMOPT) -f bin -o $@ -MD $@.dep -l $@.lst $<

%.bin32: %.asm $(NASM)
	$(NASM) --bits 32 $(NASMOPT) -f bin -o $@ -MD $@.dep -l $@.lst $<

%.bin64: %.asm $(NASM)
	$(NASM) --bits 64 $(NASMOPT) -f bin -o $@ -MD $@.dep -l $@.lst $<

%.ith: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f ith -o $@ -MD $@.dep -l $@.lst $<

%.srec: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f srec -o $@ -MD $@.dep -l $@.lst $<

%.o: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f elf32 -gdwarf -o $@ -MD $@.dep -l $@.lst $<

%.ox: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f elfx32 -gdwarf -o $@ -MD $@.dep -l $@.lst $<

%.o64: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f elf64 -gdwarf -o $@ -MD $@.dep -l $@.lst $<

%.aout: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f aout -o $@ -MD $@.dep -l $@.lst $<

%.aoutb: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f aoutb -o $@ -MD $@.dep -l $@.lst $<

%.obj: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f obj -gborland -o $@ -MD $@.dep -l $@.lst $<

%.rdf: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f rdf -o $@ -MD $@.dep -l $@.lst $<

%.od: %.obj $(OMFDUMP)
	$(OMFDUMP) $< > $@

%.coff: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f coff -o $@ -MD $@.dep -l $@.lst $<

%.win32: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f win32 -gcv8 -o $@ -MD $@.dep -l $@.lst $<

%.win64: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f win64 -gcv8 -o $@ -MD $@.dep -l $@.lst $<

%.mo32: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f macho32 -gdwarf -o $@ -MD $@.dep -l $@.lst $<

%.mo64: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f macho64 -gdwarf -o $@ -MD $@.dep -l $@.lst $<

%.dbg: %.asm $(NASM)
	$(NASM) $(NASMOPT) -f dbg -gdebug -o $@ -MD $@.dep -l $@.lst $<

%.asm: %.pl
	$(PERL) $< > $@

%.i: %.asm $(NASM)
	$(NASM) $(NASMOPT) -E -o $@ -MD $@.dep $<

all:

clean:
	$(RM_F) *.com *.o *.o64 *.aout *.obj *.win32 *.win64 *.exe *.lst *.bin
	$(RM_F) *.bin *.bin16 *.bin32 *.bin64
	$(RM_F) *.dbg *.coff *.ith *.srec *.mo32 *.mo64 *.i *.dep *.rdf
	$(RM_F) *.aoutb
	$(RM_RF) testresults
	$(RM_F) elftest elftest64
	$(RM_RF) ffmpegtest x264test dav1dtest
	$(RM_RF) intel-ipsec-mbtest isa-ltest isa-l_cryptotest cryptography-primitivestest

spotless: clean
	$(RM_RF) golden

#
# Test for ELF32 shared libraries; assumes an x86 Linux system
#
elfso.o: elfso.asm $(NASM)
	$(NASM) $(NASMOPT) -f elf32 -F stabs -o $@ -MD $@.dep -l $@.lst $<

elfso.so: elfso.o
	$(LD) -m elf_i386 -shared -o $@ -MD $@.dep $<

elftest: elftest.c elfso.so
	$(CC) -g -m32 -o $@ -MD $@.dep $^
	-env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH ./elftest

#
# Test for ELF64 shared libraries; assumes an x86-64 Linux system
#
elf64so.o: elf64so.asm $(NASM)
	$(NASM) $(NASMOPT) -f elf64 -F dwarf -o $@ -MD $@.dep -l $@.lst $<

elf64so.so: elf64so.o
	$(LD) -shared -o $@ -MD $@.dep $<

elftest64: elftest64.c elf64so.so
	$(CC) -g -o $@ -MD $@.dep $^
	-env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH ./elftest64
