# SPDX-License-Identifier: 0BSD

SONAME  ?= liblinkbag.so.0
VERSION ?= version unset!
CROSS   ?=

CFLAGS   += -O3 -g -std=c23   -Wall -Wextra
CXXFLAGS += -O3 -g -std=c++20 -Wall -Wextra -fno-exceptions -Wno-missing-field-initializers -Wno-address-of-packed-member
CPPFLAGS += -D_GNU_SOURCE -DVERSION='"$(VERSION)"'
LDFLAGS  += -Wl,-as-needed

.PHONY: all check clean

EXAMPLES := $(subst .c,,$(wildcard example-*.c))
BINS := $(subst .cpp,,$(wildcard linkbag*.cpp)) $(EXAMPLES)
MANS := $(subst .in,,$(wildcard *.[0-9].in))
all: $(filter-out $(if $(CROSS),linkbag-test $(EXAMPLES)),$(BINS) liblinkbag.so liblinkbag.a $(MANS))

liblinkbag.a: liblinkbag.o
	$(AR) crs $@ $<
liblinkbag.so: $(SONAME)
	ln -fs $< $@

$(SONAME): liblinkbag.cpp
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) -fPIC -shared -Wl,-soname,$(SONAME) $< $(LDLIBS) -o $@

%: %.in
	sed -e 's:^\(\.ds LINKBAG_UNAME\).*:\1 $(shell uname):' -e '/^\.Os/s:$$: $(VERSION):' < $< | awk '$$1 == "$$include" {gsub(/"/, "", $$2); while((getline line < $$2) > 0) {gsub(/\\/, "\\e", line); gsub(/\t/, "  ", line); if(line !~ /^##/) print line}; next}  {print}' > $@

linkbag-test $(EXAMPLES): CXXFLAGS += -O0
linkbag-test $(EXAMPLES): LDFLAGS  += -Wl,-rpath=.
linkbag-test $(EXAMPLES): liblinkbag.so
check: linkbag-test linkbag
	./linkbag-test

clean:
	rm -f $(BINS) liblinkbag.so $(SONAME) liblinkbag.[ao] $(MANS)
