# Copyright (C) Teemu Suutari

BITS	:= 32
VERSION	= 1.0

CC	= clang
CXX	= clang++
COMMONFLAGS = -Os -Wall -Wsign-compare -Wshorten-64-to-32 -Wno-shift-op-parentheses -DONEKPAQ_VERSION="\"$(VERSION)\""
CFLAGS	= $(COMMONFLAGS)
CXXFLAGS = $(COMMONFLAGS) -std=c++14
AFLAGS	= -O2

# debugging...
#COMMONFLAGS += -DDEBUG_BUILD -g
#AFLAGS	+= -DDEBUG_BUILD -g

ifeq ($(BITS),64)
COMMONFLAGS += -m64
AFLAGS	+= -fmacho64
else
COMMONFLAGS += -m32
AFLAGS	+= -fmacho32
endif

PROG	= onekpaq
SLINKS	= onekpaq_encode onekpaq_decode
OBJS	= ArithEncoder.o ArithDecoder.o BlockCodec.o StreamCodec.o AsmDecode.o CacheFile.o \
	onekpaq_main.o log.o \
	onekpaq_cfunc_1.o onekpaq_cfunc_2.o onekpaq_cfunc_3.o \
	onekpaq_cfunc_4.o
RELEASE	= onekpaq_source_release_v$(VERSION).tar.gz

all: $(SLINKS)

.asm.o:
	nasm $(AFLAGS) $<

.cpp.o:
	$(CXX) $(CXXFLAGS) -c $<

.c.o:
	$(CC) $(CFLAGS) -c $<

define decompressors
onekpaq_cfunc_$(1).o: onekpaq_decompressor$(BITS).asm onekpaq_cfunc$(BITS).asm
	nasm $(AFLAGS) -DONEKPAQ_DECOMPRESSOR_MODE=$(1) onekpaq_cfunc$(BITS).asm -o onekpaq_cfunc_$(1).o
endef

$(foreach decompr,1 2 3 4,$(eval $(call decompressors,$(decompr))))

$(PROG): $(OBJS)
	$(CXX) $(CFLAGS) -o $(PROG) $(OBJS) 

$(SLINKS): $(PROG)
	ln -sf $< $@

clean:
	rm -f $(OBJS) $(PROG) $(SLINKS) $(RELEASE) *~

.PHONY:

define reporting
report$(1): .PHONY
	@rm -f tmp_out
	@nasm -O2 -DONEKPAQ_DECOMPRESSOR_MODE=$(1) onekpaq_decompressor$(BITS).asm -o tmp_out
	@stat -f "onekpaq decompressor mode$(1) size: %z" tmp_out
	@rm -f tmp_out
endef

$(foreach decompr,1 2 3 4,$(eval $(call reporting,$(decompr))))

report: report1 report2 report3 report4

release: .PHONY
	@tar --disable-copyfile -s %.*%onekpaq_v$(VERSION)/~% -zcvf $(RELEASE) \
	Makefile LICENSE.txt README.txt \
	ArithDecoder.cpp ArithDecoder.hpp ArithEncoder.cpp ArithEncoder.hpp \
	AsmDecode.cpp AsmDecode.hpp BlockCodec.cpp BlockCodec.hpp \
	CacheFile.cpp CacheFile.hpp log.c SimpleDispatch.hpp StreamCodec.cpp \
	StreamCodec.hpp Timer.hpp onekpaq_common.h onekpaq_main.cpp \
	debug32.asm onekpaq_decompressor32.asm onekpaq_cfunc32.asm \
	testbench/recede?.data testbench/recede.onekpaq testbench/test.sh \
	testbench/recede.raw testbench/onekpaq_context.cache
