# Klammertext sks/ Makefile
# Builds all the DSOs (document$(DSO): .so, on Windows .dll) in sks/
# subdirectories

K := $(KLAMMERTEXT_HOME)
KS := $(K)/sks
KM := $(K)/mac

include $(K)/env/makefile.env

# Shared library that all the DSOs depend on
LIBRARY := $(K)/lib/$(KLAMMERTEXT_LIBFILE)

# Support directories (build .o files used by other sks/ components)
SUPPORT_DIRS := kutil target

# Excluded directories:
#   kutil, target - support directories that build .o files, not a DSO
#   book, phase - obsolete, not updated for the shared library

# Directories that build a DSO (excluding support and obsolete directories):
# every subdirectory whose Makefile names its product with makefile.env's
# $(DSO) suffix ("document$(DSO) :", "all : document$(DSO)").
SO_DIRS := $(shell for dir in $(KS)/*/; do \
    if [ -f "$${dir}Makefile" ] && grep -qE '\$$\(DSO\)' "$${dir}Makefile" 2>/dev/null; then \
        basename "$$dir"; \
    fi; done | grep -v -E '^(kutil|target|book|phase)$$')

.PHONY: all clean support $(SUPPORT_DIRS) $(SO_DIRS)

# Default target: build support first, then every DSO
all : support $(SO_DIRS)

# Build support directories
support : $(SUPPORT_DIRS)

kutil :
	$(MAKE) -j -C $(KS)/kutil

target : kutil
	$(MAKE) -j -C $(KS)/target

# Pattern rule for the DSO directories
# Each depends on the library and support directories
$(SO_DIRS) : support $(LIBRARY)
	$(MAKE) -j -C $(KS)/$@

# Clean all subdirectories
clean :
	@for dir in $(SUPPORT_DIRS) $(SO_DIRS); do \
		echo "Cleaning $$dir..."; \
		$(MAKE) -C $(KS)/$$dir clean; \
	done

# Rebuild everything
redo : clean all
