# awk-polycall -- AWK binding for Polycall (binding ABI v1)
#
#   make ext        build the gawk extension $(BUILD_DIR)/awk_polycall.so (.dll on
#                   Windows): the real core in-process, `@load "awk_polycall"`
#   make test       both test suites (tests/run-all.sh); exit 77 = something
#                   could not run (SKIP), never reported as a pass
#   make valgrind   the gawk extension test under valgrind memcheck
#   make example    examples/basic.awk (POSIX library, any AWK)
#   make example-ext examples/gawk_ext.awk (gawk extension)
#   make verify     static thin-adapter check
#
# The POSIX library (src/awk_polycall.awk) compiles nothing: it drives the
# installed `polycall` CLI (>= 1.1.0). The gawk extension needs gawk >= 5.0
# with gawkapi.h, a C compiler and the core's pkg-config file.

AWK ?= awk
GAWK ?= gawk
POLYCALL_CLI ?= polycall
PKG_CONFIG ?= pkg-config
BUILD_DIR ?= build
POLYCALL_CFLAGS ?= $(shell $(PKG_CONFIG) --cflags polycall)
POLYCALL_LIBS ?= $(shell $(PKG_CONFIG) --libs polycall)
# -I<dir> of gawkapi.h when it is not on the default include path
GAWK_CFLAGS ?=
EXT_CFLAGS ?= -std=gnu11 -O2 -g -Wall -Wextra -Wno-unused-parameter

ifeq ($(OS),Windows_NT)
EXT := $(BUILD_DIR)/awk_polycall.dll
EXT_LDFLAGS := -shared
else
EXT := $(BUILD_DIR)/awk_polycall.so
# -z now: an old libpolycall.so.1 without the ABI v1 symbols fails at load
EXT_LDFLAGS := -shared -fPIC -fvisibility=hidden -Wl,-z,now -Wl,-z,defs
endif

.PHONY: all ext test test-posix test-ext valgrind example example-ext verify clean
all: ext

ext: $(EXT)

$(EXT): ext/awk_polycall.c
	@mkdir -p $(BUILD_DIR)
	$(CC) $(EXT_CFLAGS) $(GAWK_CFLAGS) $(POLYCALL_CFLAGS) ext/awk_polycall.c -o $@ $(EXT_LDFLAGS) $(POLYCALL_LIBS)

test:
	POLYCALL_CLI=$(POLYCALL_CLI) GAWK=$(GAWK) sh tests/run-all.sh

test-posix:
	POLYCALL_CLI=$(POLYCALL_CLI) sh tests/run-awk-test.sh

test-ext:
	POLYCALL_CLI=$(POLYCALL_CLI) GAWK=$(GAWK) sh tests/run-gawk-ext-test.sh

valgrind:
	VALGRIND=1 POLYCALL_CLI=$(POLYCALL_CLI) GAWK=$(GAWK) sh tests/run-gawk-ext-test.sh

example:
	$(AWK) -v polycall_cli=$(POLYCALL_CLI) -f src/awk_polycall.awk -f examples/basic.awk </dev/null

example-ext: ext
	AWKLIBPATH=$(BUILD_DIR) $(GAWK) -b -f examples/gawk_ext.awk </dev/null

verify:
	sh scripts/verify-dry.sh

clean:
	rm -rf $(BUILD_DIR) bin lib
