# libpxd Makefile

#OPTLEVEL := -O2
OPTLEVEL := -O0

WARNINGS := -Wall -Wstrict-overflow -Wextra -Wpedantic

LIBPXD_SOURCE_DIR := $(PWD)
LIBPXD_BINARY_DIR := $(PWD)
LIBPXD_CFLAGS     := -I$(LIBPXD_SOURCE_DIR)/include -std=gnu11 -fPIC $(WARNINGS) -fstack-protector-all
LIBPXD_LDFLAGS    := -lssl -lcrypto -lpthread -L$(LIBPXD_BINARY_DIR)
LIBPXD_OBJS       := px_common.o px_log.o px_time.o px_connection.o px_event.o \
                     px_gemini_ctx.o px_workq.o px_url.o px_gemini.o \
                     px_path.o px_route.o px_network.o px_listen.o
TARGETS           := include/libpxd/px_version.h libpxd.so examples tests polluxd

CFLAGS  := $(LIBPXD_CFLAGS) -g $(OPTLEVEL)
LDFLAGS := $(LIBPXD_LDFLAGS) -g

.PHONY: all clean examples tests polluxd .FORCE

# use old-style suffix patterns for compatibility
.SUFFIXES: .c .o

all: $(TARGETS)

include/libpxd/px_version.h: .FORCE
	@./update_version.sh

libpxd.so: $(LIBPXD_OBJS)
	$(CC) -shared -o $(@) $(LIBPXD_OBJS) $(LDFLAGS)

examples:
	$(MAKE) -C examples LIBPXD_CFLAGS="$(CFLAGS)" LIBPXD_LDFLAGS="$(LDFLAGS)" LIBPXD_SOURCE_DIR="$(LIBPXD_SOURCE_DIR)" LIBPXD_BINARY_DIR="$(LIBPXD_BINARY_DIR)"

polluxd: libpxd.so
	$(MAKE) -C polluxd LIBPXD_CFLAGS="$(CFLAGS)" LIBPXD_LDFLAGS="$(LDFLAGS)" LIBPXD_SOURCE_DIR="$(LIBPXD_SOURCE_DIR)" LIBPXD_BINARY_DIR="$(LIBPXD_BINARY_DIR)"

tests: libpxd.so
	$(MAKE) -C tests LIBPXD_CFLAGS="$(CFLAGS)" LIBPXD_LDFLAGS="$(LDFLAGS)" LIBPXD_SOURCE_DIR="$(LIBPXD_SOURCE_DIR)" LIBPXD_BINARY_DIR="$(LIBPXD_BINARY_DIR)"

# unused parameters happen in the auto-generated allocators from flex, we
# disable that warning here.  it would be nice to find a better way to avoid
# those specific warnings without disabling the check for the whole file
lexurl.yy.o: lexurl.yy.c
	$(CC) -o $@ -c $(CFLAGS) -Wno-unused-parameter $<

lexurl.yy.c: lexurl.l
	flex -o $@ -R lexurl.l

px_common.o: px_common.c include/libpxd/px_version.h
	$(CC) -o $@ -c $(CFLAGS) $<

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

.FORCE:

lexurl.l:

clean :
	rm -f *.o *.so include/libpxd/px_version.h
	@$(MAKE) -C examples clean
	@$(MAKE) -C polluxd clean
	@$(MAKE) -C tests clean
