CC ?= cc
AR ?= ar
RANLIB ?= ranlib
OBJCOPY ?= objcopy
INSTALL ?= install
PREFIX ?= /usr/local
DPIDIR ?= $(PREFIX)/lib/dillo/dpi
DESTDIR ?=
BUILD ?= build
CFLAGS ?= -O2 -std=c99 -Wall -Wextra -Wpedantic
CPPFLAGS ?=
LDFLAGS ?=

PKG_CONFIG ?= pkg-config
CURL_CFLAGS ?= $(shell $(PKG_CONFIG) --cflags libcurl 2>/dev/null)
CURL_LIBS ?= $(shell $(PKG_CONFIG) --libs libcurl 2>/dev/null || echo -lcurl)
SODIUM_CFLAGS ?= $(shell $(PKG_CONFIG) --cflags libsodium 2>/dev/null)
SODIUM_LIBS ?= $(shell $(PKG_CONFIG) --libs libsodium 2>/dev/null || echo -lsodium)

CPPFLAGS += -Iinc -DSLEEP_SALT -DDAT_BUILD_DIR=\"$(BUILD)\" -DDAT_NETWORK_PROTOCOL=\"$(shell tr -d '\r\n' < NETWORK_PROTOCOL)\" $(CURL_CFLAGS) $(SODIUM_CFLAGS)
LIBS = $(SODIUM_LIBS) $(CURL_LIBS) -lm -ldl

LIB_SOURCES = src/base32768.c src/cable.c src/cable_feed.c src/dat.c src/dat_browse.c src/dat_dns.c src/dat_fetch.c src/dat_walk.c src/dat_net.c src/dat_wire.c src/dat_session.c \
	src/cesspool.c src/sleep.c src/sleep_tree.c src/sleep_bitfield.c \
	src/sleep_proto.c src/sleep_crypto.c src/sleep_writer.c \
	src/sleep_feed.c src/sleep_proof.c src/sleep_replication.c src/sleep_utp.c
LIB_OBJECTS = $(patsubst src/%.c,$(BUILD)/%.o,$(LIB_SOURCES)) $(BUILD)/sleep_verify_lib.o
DEPFILES = $(LIB_OBJECTS:.o=.d) $(BUILD)/s7.d

.PHONY: all clean install install-user
all: $(BUILD)/dat.dpi

$(BUILD):
	mkdir -p $@

$(BUILD)/%.o: src/%.c | $(BUILD)
	$(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -c $< -o $@

$(BUILD)/sleep_verify_lib.o: src/sleep_verify.c | $(BUILD)
	$(CC) $(CPPFLAGS) $(CFLAGS) -DSLEEP_VERIFY_NO_MAIN -MMD -MP -c $< -o $@

# S7 is used only as a parser for archive .scm metadata. Rename its optional
# command-line entry point so the DPI owns the process main().
$(BUILD)/s7.o: src/s7.c | $(BUILD)
	$(CC) $(CPPFLAGS) $(CFLAGS) -w -MMD -MP -c $< -o $@

$(BUILD)/dpi_s7.o: $(BUILD)/s7.o
	$(OBJCOPY) --redefine-sym main=dat_dpi_s7_standalone_main $< $@

$(BUILD)/libdatdpi.a: $(LIB_OBJECTS)
	$(AR) rcs $@ $(LIB_OBJECTS)
	$(RANLIB) $@

$(BUILD)/dat.dpi: src/dat_dpi.c src/dat_dpi_icons.h $(BUILD)/libdatdpi.a $(BUILD)/dpi_s7.o
	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) src/dat_dpi.c $(BUILD)/libdatdpi.a $(BUILD)/dpi_s7.o $(LIBS) -o $@

install: $(BUILD)/dat.dpi
	$(INSTALL) -d "$(DESTDIR)$(DPIDIR)/dat"
	$(INSTALL) -m 755 $(BUILD)/dat.dpi "$(DESTDIR)$(DPIDIR)/dat/dat.dpi"
	$(INSTALL) -d "$(DESTDIR)$(PREFIX)/share/doc/dat-dpi"
	$(INSTALL) -m 644 README.md "$(DESTDIR)$(PREFIX)/share/doc/dat-dpi/README.md"

install-user: $(BUILD)/dat.dpi
	$(INSTALL) -d "$(HOME)/.dillo/dpi/dat"
	$(INSTALL) -m 755 $(BUILD)/dat.dpi "$(HOME)/.dillo/dpi/dat/dat.dpi"
	@if ! test -f "$(HOME)/.dillo/dpidrc"; then printf '%s\n' 'dpi_dir=$(DPIDIR)' > "$(HOME)/.dillo/dpidrc"; fi
	@if ! grep -q '^proto\.dat=' "$(HOME)/.dillo/dpidrc"; then printf '%s\n' 'proto.dat=dat/dat.dpi' >> "$(HOME)/.dillo/dpidrc"; fi

clean:
	rm -rf "$(BUILD)"

-include $(DEPFILES)
