# 解码器复现用例的构建
#
#   make          构建 poc/decode（默认带 AddressSanitizer）
#   make repro    构建并跑一遍复现用例
#   make clean    清理
#
# 没有 ASan 的环境： make SANITIZE=0（越界写会以 SIGSEGV 的形式出现）

CC ?= cc
SANITIZE ?= 1

ifeq ($(SANITIZE),1)
SAN_FLAGS = -fsanitize=address -fno-omit-frame-pointer
endif

CFLAGS ?= -O1 -g $(SAN_FLAGS)
CPPFLAGS += -Ilib/include

LIB_SRCS = $(wildcard lib/common/*.c) $(wildcard lib/dec/*.c)
ENC_SRCS = $(wildcard lib/enc/*.c)
DECODE = poc/decode
CLI = $(BUILD)/brotli
BUILD = build

.PHONY: all repro tools clean

all: $(DECODE)

$(DECODE): $(LIB_SRCS) poc/decode.c
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ poc/decode.c $(LIB_SRCS)

# 用例 part1 是 23 MB、内容高度重复，仓库里放的是 .gz，先解压再跑
$(BUILD)/part1.br: poc/part1.br.gz
	@mkdir -p $(BUILD)
	gunzip -c $< > $@

repro: $(DECODE) $(BUILD)/part1.br
	./$(DECODE) $(BUILD)/part1.br poc/part2.br

# 顺手把 brotli 命令行也编出来，方便造合法样本做回归
tools: $(CLI)

$(CLI): lib/tools/brotli.c $(LIB_SRCS) $(ENC_SRCS)
	@mkdir -p $(BUILD)
	$(CC) $(CFLAGS) $(CPPFLAGS) -Ilib -o $@ lib/tools/brotli.c $(LIB_SRCS) $(ENC_SRCS)

clean:
	rm -rf $(BUILD) $(DECODE)
