# 
# Copyright (C) 2021,  Paul Sheer. All rights reserved.
# 
# This software is provided without warranty. The author(s) disclaim liability for damages
# related to this software. All risk is assumed by you.
# 
# 

.PHONY: clean all package tests

DBGOPTS = -Og -g
PERFOPTS = -O3 -m64 -march=nocona -mtune=generic -fomit-frame-pointer -s -fno-builtin
# STD = -ansi -pedantic -Wno-long-long
# STD = -std=gnu++17
# STD = -std=c++98
WARN = -Wall -Wextra $(STD)
LIBS := `cat link-libs`

DEFS = -DHAVE_PTHREAD
DEFS += -DUSE_TLS
DEFS += -DNO_ASSERT_CHECKS 

DEFSDBG = $(DEFS)
DEFSDBG += -DWITH_BTANDCHECK
DEFSDBG += -DWITH_ACCOUNTS
DEFSDBG += -DNO_CB_HEAPS

DEFSCOMPACT = $(DEFS)
DEFSCOMPACT += -DCOMPACT_MODE

ENTERPRISEGENERIC = -DMIN_ALIGN=5 -DCB_SIZE_BITS=2 -DCHUNK_POWER=2 -DESTIMATED_MIN_BLOCKS=4 -DCB_START_BITS=16

DEFSENTERPRISE = $(DEFS)
DEFSENTERPRISE += $(ENTERPRISEGENERIC)

DEFSFRAGTOOL = $(DEFS)
DEFSFRAGTOOL += $(ENTERPRISEGENERIC) -DWITH_FRAGTOOL

DEFSCRYPTO = $(DEFS)
DEFSCRYPTO += $(ENTERPRISEGENERIC) -DWITH_CRYPTO -DNO_BLOCK_ORDERING

SHARED = -fpic -shared


# CC=g++
CC=gcc

# DEFS += -DSTARTUP_MESSAGE=\"compiled\ with\ dfwmalloc\"


# DEFS += -DN_ARENAS_BITS=16
# DEFS += -DWANT_PRINTFSIMPLE
# DEFS += -DWITH_BTANDCHECK
# DEFS += -DWITH_ACCOUNTS
# DEFS += -DLIGHT
# DEFS += -DWANT_PRINTFSIMPLE
# DEFS += -DCALLTRACE_DEPTH=40
# DEFS += -DWITH_UNITTESTS
# DEFS += -DNO_HEAP_TRUNCATION
# DEFS += -DNO_CB_HEAPS
# DEFS += -DTHRASH
# DEFS += -DFOR_VALGRIND
# DEFS += -DNO_RANKHEAP
# DEFS += -DFEATHERWEIGHT
# DEFS += -DNO_OVERRIDE_EXIT_FUNCTIONS

DEPS = dfwmalloc.c Makefile link-libs


all: libdfwmalloc.a libdfwmalloc-compact.a libdfwmalloc-enterprise.a libdfwmalloc.so libdfwmalloc-debug.so libdfwmalloc-compact.so libdfwmalloc-enterprise.so libdfwmalloc-fragtool.so libdfwmalloc-crypto.so dfwmalloc-dll-test dfwmalloc.h dfwmalloc_inline.h dfwmalloc-fragtool dfwmalloc-svg

tests:
	@echo 'No such target: tests'
	@echo 'Try: make test'
	@false

test: $(DEPS)
	cd tests && ./run-combination.sh
	touch test

link-libs:
	if uname | grep -q FreeBSD ; then echo " -ldl -lpthread -lexecinfo" ; else echo " -ldl -lpthread" ; fi > link-libs

dfwmalloc-fragtool: dfwmalloc-fragtool.c
	$(CC) -Wall -Wextra -o dfwmalloc-fragtool dfwmalloc-fragtool.c

dfwmalloc-svg: dfwmalloc-svg.c
	$(CC) -Wall -Wextra -o dfwmalloc-svg dfwmalloc-svg.c

clean:
	rm -f libdfwmalloc.so libdfwmalloc-debug.so libdfwmalloc-compact.so libdfwmalloc-enterprise.so dfwmalloc-dll-test staticdata.c staticdata-debug.c staticdata-compact.c staticdata-enterprise.c staticdata staticdata-debug staticdata-compact staticdata-enterprise
	rm -f dfwmalloc-build-test.o libdfwmalloc-fragtool.so libdfwmalloc-crypto.so dfwmalloc-fragtool dfwmalloc-svg staticdata-fragtool.c staticdata-enterprise staticdata-crypto.c staticdata-crypto
	rm -f libdfwmalloc.a dfwmalloc.o libdfwmalloc-compact.a libdfwmalloc-enterprise.a dfwmalloc-compact.o dfwmalloc-enterprise.o
	rm -f dfwmalloc.h dfwmalloc_inline.h link-libs
	rm -f test RESUME dfwmalloc_cxx
	( cd tests && rm -f cb_int_t.h cb_page_info.h cb_size_t_to_ulong.h dfwmalloc.h dfwmalloc.o gdb-cmds staticdata staticdata-view.c staticdata.c test vecheap.h ; )

dfwmalloc.h: $(DEPS) make-dfwmalloc-header.sh
	./make-dfwmalloc-header.sh

dfwmalloc_inline.h: $(DEPS) dfwmalloc_inline_.h make-inline.sh
	./make-inline.sh

dfwmalloc.o: $(DEPS) staticdata.c
	$(CC) $(PERFOPTS) $(WARN) -DUSE_PRECOMPILED_STATIC_DATA $(DEFS) -c -o dfwmalloc.o dfwmalloc.c

dfwmalloc-compact.o: $(DEPS) staticdata-compact.c
	$(CC) $(PERFOPTS) $(WARN) -DUSE_PRECOMPILED_STATIC_DATA_COMPACT $(DEFSCOMPACT) -c -o dfwmalloc-compact.o dfwmalloc.c

dfwmalloc-enterprise.o: $(DEPS) staticdata-enterprise.c
	$(CC) $(PERFOPTS) $(WARN) -DUSE_PRECOMPILED_STATIC_DATA_ENTERPRISE $(DEFSENTERPRISE) -c -o dfwmalloc-enterprise.o dfwmalloc.c

libdfwmalloc.a: dfwmalloc.o
	rm -f libdfwmalloc.a
	ar -crs libdfwmalloc.a dfwmalloc.o

libdfwmalloc-compact.a: dfwmalloc-compact.o
	rm -f libdfwmalloc-compact.a
	ar -crs libdfwmalloc-compact.a dfwmalloc-compact.o

libdfwmalloc-enterprise.a: dfwmalloc-enterprise.o
	rm -f libdfwmalloc-enterprise.a
	ar -crs libdfwmalloc-enterprise.a dfwmalloc-enterprise.o

libdfwmalloc.so: $(DEPS) staticdata.c
	$(CC) $(PERFOPTS) $(WARN) -DUSE_PRECOMPILED_STATIC_DATA $(DEFS) $(SHARED) -o libdfwmalloc.so -fPIC dfwmalloc.c $(LIBS)

libdfwmalloc-debug.so: $(DEPS) staticdata-debug.c
	$(CC) $(DBGOPTS)  $(WARN) -DUSE_PRECOMPILED_STATIC_DATA_DEBUG $(DEFSDBG) $(SHARED) -o libdfwmalloc-debug.so -fPIC dfwmalloc.c $(LIBS)

libdfwmalloc-compact.so: $(DEPS) staticdata-compact.c
	$(CC) $(PERFOPTS) $(WARN) -DUSE_PRECOMPILED_STATIC_DATA_COMPACT $(DEFSCOMPACT) $(SHARED) -o libdfwmalloc-compact.so -fPIC dfwmalloc.c $(LIBS)

libdfwmalloc-enterprise.so: $(DEPS) staticdata-enterprise.c
	$(CC) $(PERFOPTS) $(WARN) -DUSE_PRECOMPILED_STATIC_DATA_ENTERPRISE $(DEFSENTERPRISE) $(SHARED) -o libdfwmalloc-enterprise.so -fPIC dfwmalloc.c $(LIBS)

libdfwmalloc-fragtool.so: $(DEPS) staticdata-fragtool.c
	$(CC) $(PERFOPTS) $(WARN) -DUSE_PRECOMPILED_STATIC_DATA_FRAGTOOL $(DEFSFRAGTOOL) $(SHARED) -o libdfwmalloc-fragtool.so -fPIC dfwmalloc.c $(LIBS)

libdfwmalloc-crypto.so: $(DEPS) staticdata-crypto.c
	$(CC) $(PERFOPTS) $(WARN) -DUSE_PRECOMPILED_STATIC_DATA_CRYPTO $(DEFSCRYPTO) $(SHARED) -o libdfwmalloc-crypto.so -fPIC dfwmalloc.c $(LIBS)

dfwmalloc-dll-test: dfwmalloc-dll-test.c Makefile
	$(CC) -o dfwmalloc-dll-test dfwmalloc-dll-test.c -L. -ldfwmalloc

staticdata.c: $(DEPS)
	rm -f staticdata
	$(CC) -O0 -g $(WARN) $(DEFS) -DPRECOMPILE_STATIC_DATA -DWANT_PRINTFSIMPLE -o staticdata dfwmalloc.c $(LIBS)
	./staticdata > staticdata.c

staticdata-debug.c: $(DEPS)
	rm -f staticdata-debug
	$(CC) -O0 -g $(WARN) $(DEFSDBG) -DPRECOMPILE_STATIC_DATA -DWANT_PRINTFSIMPLE -o staticdata-debug dfwmalloc.c $(LIBS)
	./staticdata-debug > staticdata-debug.c

staticdata-compact.c: $(DEPS)
	rm -f staticdata-compact
	$(CC) -O0 -g $(WARN) $(DEFSCOMPACT) -DPRECOMPILE_STATIC_DATA -DWANT_PRINTFSIMPLE -o staticdata-compact dfwmalloc.c $(LIBS)
	./staticdata-compact > staticdata-compact.c

staticdata-enterprise.c: $(DEPS)
	rm -f staticdata-enterprise
	$(CC) -O0 -g $(WARN) $(DEFSENTERPRISE) -DPRECOMPILE_STATIC_DATA -DWANT_PRINTFSIMPLE -o staticdata-enterprise dfwmalloc.c $(LIBS)
	./staticdata-enterprise > staticdata-enterprise.c

staticdata-fragtool.c: $(DEPS)
	rm -f staticdata-fragtool
	$(CC) -O0 -g $(WARN) $(DEFSFRAGTOOL) -DPRECOMPILE_STATIC_DATA -DWANT_PRINTFSIMPLE -o staticdata-fragtool dfwmalloc.c $(LIBS)
	./staticdata-fragtool > staticdata-fragtool.c

staticdata-crypto.c: $(DEPS)
	rm -f staticdata-crypto
	$(CC) -O0 -g $(WARN) $(DEFSCRYPTO) -DPRECOMPILE_STATIC_DATA -DWANT_PRINTFSIMPLE -o staticdata-crypto dfwmalloc.c $(LIBS)
	./staticdata-crypto > staticdata-crypto.c

package:
	rm -rf package
	mkdir package
	tar -cf - `cat FILES` | ( cd ./package/ && tar -xf - ; )
	mkdir ./package/old
	cp dfwmalloc.c.BAK[0-9][0-9][0-9] ./package/old/
	tar -czf dfwmalloc.tgz package
	echo ; echo "Counting files:" `tar -tzvf dfwmalloc.tgz | wc -l` "files" ; ls -la dfwmalloc.tgz ; echo
	@echo '============================================================'
	@echo '============================================================'
	@echo '============================================================'
	@echo ''
	@echo '        ' dfwmalloc.tgz is ready
	@echo ''
	@echo '============================================================'
	@echo '============================================================'
	@echo '============================================================'

