CC = gcc
CFLAGS = -Ofast -march=native -mtune=native -flto=auto -fuse-linker-plugin \
    -funroll-all-loops -finline-functions -finline-limit=10000 \
    -fprefetch-loop-arrays -ftracer -fmodulo-sched \
    -fmodulo-sched-allow-regmoves -fgcse-sm -fgcse-las \
    -ftree-loop-distribution -ftree-loop-im -ftree-loop-ivcanon \
    -fivopts -fvariable-expansion-in-unroller -fvect-cost-model=unlimited \
    -fipa-pta -fipa-cp-clone -fdevirtualize-speculatively \
    -fno-plt -fno-semantic-interposition -fomit-frame-pointer \
    -fmerge-all-constants -fno-stack-protector -DNDEBUG \
    -fno-trapping-math -fno-signed-zeros -freciprocal-math \
    -mavx2 -mfma -mbmi2 -mlzcnt -mpopcnt \
    -pthread

all: build run valgrind build_risspam run_risspam build_cpp build_borded_cpp build_py build_jest

build:
	@echo "Building retoor_c with PGO..."
	@rm -rf pgo_data && mkdir -p pgo_data
	@$(CC) $(CFLAGS) -fprofile-dir=pgo_data -fprofile-generate retoor_c/isspam.c -o isspam
	@./isspam ./spam/*.txt > /dev/null 2>&1 || true
	@./isspam ./not_spam/*.txt > /dev/null 2>&1 || true
	@[ -d books ] && ./isspam ./books/*.txt > /dev/null 2>&1 || true
	@$(CC) $(CFLAGS) -fprofile-dir=pgo_data -fprofile-use -fprofile-correction retoor_c/isspam.c -o isspam
	@rm -rf pgo_data

build_quick:
	@echo "Compiling retoor_c project (no PGO)."
	@$(CC) $(CFLAGS) retoor_c/isspam.c -o isspam

build_py:
	@echo "Copying py file"
	@cp retoor_c/isspam.py isspam.py

build_cpp:
	@echo "Compiling C++ version of isspam."
	@g++ -Ofast retoor_c/isspam.cpp -o isspam_cpp

build_borded_cpp:
	@echo "Compiling Borded C++ version of isspam."
	@g++ -std=c++23 -Ofast borded_cpp/src/main3.cpp -o borded_cpp_exec

build_risspam:
	@echo "Compiling 12bitfloat_risspam project."
	cd 12bitfloat_rust/risspam && cargo build --release && cp target/release/risspam ../../

build_jest:
	@echo "compiling jest_rust project"
	cd jest_rust && cargo build --release && cp target/release/jisspam ..

build_swift:
	@echo "Compiling Swift version of isspam."
	cd swift_isspam && swift build -c release && cp .build/release/sisspam ../

build_all: build build_py build_cpp build_borded_cpp build_risspam build_jest build_swift

run: run_spam wl run_not_spam
run_risspam: run_spam_risspam run_not_spam_risspam

bench_rust: build_risspam benchmark_only
bench_rust_only: build_risspam
	cd 12bitfloat_rust/risspam && time ./target/release/risspam ../../books/*.txt

format:
	clang-format *.c *.h -i

wl:
	@echo ""

run_spam:
	@./isspam ./spam/*.txt

run_not_spam:
	@./isspam ./not_spam/*.txt

run_spam_risspam:
	@./risspam ./spam/*.txt

run_not_spam_risspam:
	@./risspam ./not_spam/*.txt

valgrind: build 
	valgrind ./isspam ./spam/*.txt

publish:
	@wget https://retoor.molodetz.nl/api/packages/retoor/generic/env.py/1.0.0/env.py --quiet
	@wget https://retoor.molodetz.nl/api/packages/retoor/generic/publish/1.0.0/publish --quiet
	@chmod +x publish
	@./publish isspam
	@./publish risspam
	@./publish sisspam
	@rm publish
	@rm env.py

benchmark:
	-@rm -rf books 
	@echo "Extracting books."
	@tar -xzf books.tar.gz books/
	@echo "Extracted books."
	@python bench.py

# Skip extracting books over and over
benchmark_only:
	@python bench.py
