# Compiler
CC = gcc

# Compiler flags
CFLAGS = -Wall -Wextra -Werror -Ofast -std=c2x -lm -lrt -pthread -fPIC 
LDFLAGS = -lm
 
# -D_POSIX_C_SOURCE=199309L 
all: clear test_rbuffer test_rliza test_rnet test_rmalloc test_rtemp test_rjson test_rrex4 test_rstring_list test_rhttp test_rtime test_arena test_rtree test_rstring test_rlexer test_rrex3 test_rio test_rhashtable test_rkeytable test_rterminal test_rmerge run_rmerge format_all build format_all test_rlib 




format_all: format_rlib_h
	clang-format *.c *.h *.cpp -i --sort-includes=false

format_rlib_h:
	clang-format rlib.h build/rlib.h -i --sort-includes --verbose

clear:
	-@rm -rf build
	@mkdir build
	@echo "Build directory emptied"

rebuild: clear all

test_rbuffer: build_rbuffer run_rbuffer
build_rbuffer:
	$(CC) $(CFLAGS)  rbuffer.c -o ./build/rbuffer	
run_rbuffer:
	./build/rbuffer test

test_rliza: build_rliza run_rliza
build_rliza:
	$(CC) $(CFLAGS)  rliza.c -o ./build/rliza	
run_rliza:
	./build/rliza test

test_rnet: build_rnet run_rnet
build_rnet:
	$(CC) $(CFLAGS)  rnet.c -o ./build/rnet	
run_rnet:
	./build/rnet test

test_rtemp: build_rtemp run_rtemp
build_rtemp:
	$(CC) $(CFLAGS) rtemp.c -o ./build/rtemp	
run_rtemp:
	./build/rtemp

test_rjson: build_rjson run_rjson
build_rjson:
	$(CC) $(CFLAGS) rjson.c -o ./build/rjson	
run_rjson:
	./build/rjson


test_rstring_list: build_rstring_list run_rstring_list
build_rstring_list:
	$(CC) $(CFLAGS) rstring_list.c -o ./build/rstring_list	
run_rstring_list:
	./build/rstring_list

test_rhttp: build_rhttp run_rhttp
build_rhttp:
	$(CC) $(CFLAGS) rhttp.c -o ./build/rhttp	
run_rhttp:
	./build/rhttp

test_rautocomplete: build_rautocomplete run_rautocomplete
build_rautocomplete:
	$(CC) $(CFLAGS) rautocomplete.c -o ./build/rautocomplete	
run_rautocomplete:
	./build/rautocomplete

test_rlexer: build_rlexer run_rlexer
build_rlexer:
	$(CC) $(CFLAGS) rlexer.c -o ./build/rlexer
run_rlexer:
	./build/rlexer


test_rrex4: build_rrex4 run_rrex4
build_rrex4:
	$(CC) $(CFLAGS) rrex4.c -o ./build/rrex4
run_rrex4:
	./build/rrex4

test_rrex3: build_rrex3 run_rrex3
build_rrex3:
	$(CC) $(CFLAGS) rrex3.c -o ./build/rrex3
run_rrex3:
	./build/rrex3

test_rio: build_rio run_rio
build_rio:
	$(CC) $(CFLAGS) rio.c -o ./build/rio
run_rio:
	./build/rio



test_rterm: build_rterm run_rterm
build_rterm:
	$(CC) $(CFLAGS) rterm.c -o ./build/rterm
run_rterm:
	./build/rterm

test_rterminal: build_rterminal run_rterminal
build_rterminal:
	$(CC) $(CFLAGS) rterminal.c -o ./build/rterminal
run_rterminal:
	./build/rterminal

test_rmerge: build_rmerge run_rmerge
build_rmerge:
	$(CC) $(CFLAGS) rmerge.c -o ./build/rmerge
run_rmerge:
	./build/rmerge _rlib.h > ./build/rlib.h
	cp ./build/rlib.h ./rlib.h

test_rprint: build_rprint run_rprint
build_rprint:
	$(CC) $(CFLAGS) rprint.c -o ./build/rprint
run_rprint:
	./build/rprint

test_rstring: build_rstring run_rstring
build_rstring:
	$(CC) $(CFLAGS) rstring.c -o ./build/rstring
run_rstring:
	./build/rstring

test_rbench: build_rbench run_rbench
build_rbench:
	$(CC) $(CFLAGS) rbench.c -o ./build/rbench
run_rbench:
	./build/rbench

test_rbench_cpp: build_rbench_cpp run_rbench_cpp
build_rbench_cpp:
	g++ $(CFLAGS) ./C-Data-Structs/src/primes.c rbench.cpp  -o ./build/rbench.cpp -I./C-Data-Structs/include
run_rbench_cpp:
	./build/rbench.cpp

test_yurii_cpp: format_all build_yurii_cpp run_yurii_cpp
build_yurii_cpp:
	rmerge rbench.cpp > yurii_hashmap.cpp
	g++ C-Data-Structs/src/primes.c yurii_hashmap.cpp -o ./build/yurii_hashmap.cpp -IC-Data-Structs/include
run_yurii_cpp:
	./build/yurii_hashmap.cpp

test_rmalloc: build_rmalloc run_rmalloc
build_rmalloc:
	$(CC) $(CFLAGS) rmalloc.c -o ./build/rmalloc 
run_rmalloc:
	./build/rmalloc 

test_rtime: build_rtime run_rtime
build_rtime:
	$(CC) $(CFLAGS) rtime.c -o ./build/rtime
run_rtime:
	./build/rtime

test_arena: build_arena run_arena
build_arena:
	$(CC) $(CFLAGS) arena.c -o ./build/arena
run_arena:
	./build/arena

test_rlib: build_rlib run_rlib
build_rlib:
	$(CC) $(CFLAGS) rlib.c -o ./build/rlib
run_rlib:
	./build/rlib test

test_rtree: build_rtree run_rtree
build_rtree:
	$(CC) $(CFLAGS) rtree.c -o ./build/rtree
run_rtree:
	./build/rtree

test_rhashtable: build_rhashtable run_rhashtable
build_rhashtable:
	$(CC) $(CFLAGS) rhashtable.c -o ./build/rhashtable
run_rhashtable:
	./build/rhashtable

test_rkeytable: build_rkeytable run_rkeytable
build_rkeytable:
	$(CC) $(CFLAGS) rkeytable.c -o ./build/rkeytable
run_rkeytable:
	./build/rkeytable

build: format_rlib_h
	cp ./clean build/clean
	cp rlib.h rlibrlibso.c
	@gcc rlibrlibso.c $(CFLAGS) -shared -o ./build/librlib.so
	@echo "Built a new rlib.so"
	@gcc rlibso.c -L./build -Wl,-rpath=. -lrlib -o  ./build/rlibso ${CFLAGS}
	@cd ./build && ./rlibso
	@echo "Build succesful"

install:
	sudo cp ./build/rlib.h /usr/include/rlib.h
	sudo cp ./build/rmerge /usr/local/bin/rmerge
	sudo cp ./build/clean /usr/local/bin/clean
	sudo cp ./build/rlib /usr/local/bin/rlib

publish:
	brz add 
	brz commit 
	brz push lp:rlib