# Standalone codec harness.  Build: nice make -j4; tests: make test; data: make data
CC      ?= gcc
CFLAGS  ?= -O2 -g
CFLAGS  += -std=gnu11 -ffp-contract=off -Wall -Wextra -Wno-unused-function $(SIFT_INC) -I$(shell pg_config --includedir-server)
SRC      = ../../src
include $(SRC)/areas.mk
LIB      = $(SRC)/bm25/bitmap.c $(SRC)/bm25/blob.c $(SRC)/bm25/bitmap_scalar.c $(SRC)/bm25/bitmap_avx2.c $(SRC)/bm25/bitmap_avx512.c $(SRC)/bm25/bitmap_neon.c
HDR      = $(SRC)/bm25/bitmap.h $(SRC)/bm25/bitmap_int.h $(SRC)/bm25/bitmap_kern.h
OUT     ?= /tmp/sift-codec
OBJ      = $(patsubst $(SRC)/%.c,$(OUT)/obj/%.o,$(LIB)) $(OUT)/obj/stub.o

all: $(OUT)/test $(OUT)/bench $(OUT)/corpus $(OUT)/stats

$(OUT)/obj/%.o: $(SRC)/%.c $(HDR)
	@mkdir -p $(@D)
	$(CC) $(CFLAGS) -c -o $@ $<

$(OUT)/obj/stub.o: stub.c $(HDR)
	@mkdir -p $(@D)
	$(CC) $(CFLAGS) $(SIFT_INC) -c -o $@ $<

$(OUT)/test: test.c $(OBJ) $(HDR)
	$(CC) $(CFLAGS) -o $@ test.c $(OBJ) -lm

# optional CRoaring amalgamation (roaring.c, roaring.h) for comparisons
ROARING ?= $(OUT)/croaring
ifneq ($(wildcard $(ROARING)/roaring.c),)
ROAR_CFLAGS = -DHAVE_ROARING -I$(ROARING)
ROAR_OBJ    = $(OUT)/obj/roaring.o
$(ROAR_OBJ): $(ROARING)/roaring.c
	@mkdir -p $(@D)
	$(CC) -O2 -g -c -o $@ $<
endif

$(OUT)/bench: bench.c data.h baselines.h $(OBJ) $(ROAR_OBJ) $(HDR)
	$(CC) $(CFLAGS) $(ROAR_CFLAGS) -o $@ bench.c $(OBJ) $(ROAR_OBJ) -lm

$(OUT)/fuzz: fuzz.c $(OBJ) $(HDR)
	$(CC) $(CFLAGS) -o $@ fuzz.c $(OBJ) -lm

$(OUT)/corpus: corpus.c
	$(CC) $(CFLAGS) -o $@ $<

$(OUT)/stats: stats.c data.h
	$(CC) $(CFLAGS) -o $@ $<

test: $(OUT)/test
	$(OUT)/test

# corrupted-blob fuzzer; run with CFLAGS='-O1 -g -fsanitize=address,undefined -fno-sanitize-recover=all'
fuzz: $(OUT)/fuzz
	$(OUT)/fuzz $(FUZZARGS)

# articles.tsv: synthetic ctids (five documents per page) and the text of the Simple English Wikipedia
# articles (bench/datasets/fetch.sh articles); ARTICLES=path to bench's articles.tsv
ARTICLES ?= /tmp/sift-bench/data/articles.tsv
data:
	@mkdir -p $(OUT)
	awk -F'\t' '{ printf "%d\t%d\t%s\n", int((NR - 1) / 5), (NR - 1) % 5 + 1, $$2 }' $(ARTICLES) >$(OUT)/articles.tsv
	$(OUT)/corpus $(OUT)/articles.tsv $(OUT)

clean:
	rm -rf $(OUT)/obj $(OUT)/test $(OUT)/fuzz $(OUT)/bench $(OUT)/corpus $(OUT)/stats

.PHONY: all test fuzz data clean
