gemini/Makefile
2025-08-22 10:09:58 -05:00

152 lines
4.3 KiB
Makefile

# Makefile
## Tools and flags
SHELL := /bin/sh
PORT := 8080
STE := ste
STG := stg
STS := sts
STX := stx
XIPP := xipp
GUILE_FLAGS := ""
STS_FLAGS = --title $(TITLE) --style $$STYLE_REL --favicon $$FAVICON_REL
XIPP_FLAGS = --relative-to $(WWW_DIR) --prefix '$(CAPSULE_NAME)'
CAPSULE_NAME := ~snit
TITLE := "isekai.rocks/$(CAPSULE_NAME)"
## Directories and files and such
SITE_DIR := site
INCL_DIR := incl
SGT_DIR := build/sgt
SXML_DIR := build/sxml
GMI_DIR := dist/gmi
WWW_DIR := dist/www
ASST_DIR := asst
SCM := scm
SGT := sgt
SXM := sxml
GMI := gmi
HTM := xhtml
ROOT_NAME := index
STYLE_SRC := $(ASST_DIR)/style.css
STYLE_DST := $(WWW_DIR)/style.css
FAVICON_SRC := $(ASST_DIR)/favicon.ico
FAVICON_DST := $(WWW_DIR)/favicon.ico
## Source files
INCLUDE_FILES := $(shell find $(INCL_DIR) -type f -name '*.$(SCM)')
SITE_FILES := $(shell find $(SITE_DIR) -type f -name '*.$(SCM)')
ASSET_FILES := $(shell find $(ASST_DIR) -type f)
BANNERS := $(WWW_DIR)/meta/27x81/index.$(HTM)
CHILD_FILES := $(filter-out $(SITE_DIR)/$(ROOT_NAME).$(SCM),$(SITE_FILES))
SGT_FILES := $(patsubst $(SITE_DIR)/%.$(SCM),$(SGT_DIR)/%.$(SGT),$(CHILD_FILES)) $(SGT_DIR)/$(ROOT_NAME).$(SGT)
SXML_FILES := $(patsubst $(SITE_DIR)/%.$(SCM),$(SXML_DIR)/%.$(SXM),$(CHILD_FILES)) $(SXML_DIR)/$(ROOT_NAME).$(SXM)
GMI_FILES := $(patsubst $(SITE_DIR)/%.$(SCM),$(GMI_DIR)/%/index.$(GMI),$(CHILD_FILES)) $(GMI_DIR)/$(ROOT_NAME).$(GMI)
WWW_FILES := $(patsubst $(SITE_DIR)/%.$(SCM),$(WWW_DIR)/%/index.$(HTM),$(CHILD_FILES)) $(WWW_DIR)/$(ROOT_NAME).$(HTM)
GMI_ASST := $(patsubst $(ASST_DIR)/%,$(GMI_DIR)/%,$(ASSET_FILES))
WWW_ASST := $(patsubst $(ASST_DIR)/%,$(WWW_DIR)/%,$(ASSET_FILES))
## Build rules (both, gemini-only, http-only)
all: gmi web
gmi: $(GMI_FILES) $(GMI_ASST)
web: $(WWW_FILES) $(WWW_ASST)
## Copy assets
$(GMI_DIR)/%: $(ASST_DIR)/%
@mkdir -p $(dir $@)
cp $< $@
$(WWW_DIR)/%: $(ASST_DIR)/%
@mkdir -p $(dir $@)
cp $< $@
## Evaluate templates (.scm -> .sgt)
$(SGT_DIR)/%.$(SGT): $(SITE_DIR)/%.$(SCM) $(INCLUDE_FILES)
@mkdir -p $(dir $@)
GUILE_FLAGS=$(GUILE_FLAGS) $(STE) -I $(INCL_DIR) $< > $@
$(SGT_DIR)/$(ROOT_NAME).$(SGT): $(SITE_DIR)/$(ROOT_NAME).$(SCM) $(INCLUDE_FILES)
@mkdir -p $(dir $@)
GUILE_FLAGS=$(GUILE_FLAGS) $(STE) -I $(INCL_DIR) $< > $@
## Render GemText from SGT data (.sgt -> .gmi)
$(GMI_DIR)/%/index.$(GMI): $(SGT_DIR)/%.$(SGT) $(INCLUDE_FILES)
@mkdir -p $(dir $@)
GUILE_FLAGS=$(GUILE_FLAGS) $(STG) $< > $@
$(GMI_DIR)/$(ROOT_NAME).$(GMI): $(SGT_DIR)/$(ROOT_NAME).$(SGT) $(INCLUDE_FILES)
@mkdir -p $(dir $@)
GUILE_FLAGS=$(GUILE_FLAGS) $(STG) $< > $@
## Render SXML data from SGT data (.sgt -> .sxml)
$(SXML_DIR)/%.$(SXM): $(SGT_DIR)/%.$(SGT) $(STYLE_DST) $(FAVICON_DST) $(WWW_ASST)
@mkdir -p $(dir $@)
STYLE_REL=$$(realpath -m --relative-to=$(WWW_DIR)/$* $(STYLE_DST)); \
FAVICON_REL=$$(realpath -m --relative-to=$(WWW_DIR)/$* $(FAVICON_DST)); \
GUILE_FLAGS=$(GUILE_FLAGS) $(STS) $(STS_FLAGS) $< | \
GUILE_FLAGS=$(GUILE_FLAGS) $(XIPP) $(XIPP_FLAGS) > $@
$(SXML_DIR)/$(ROOT_NAME).$(SXM): $(SGT_DIR)/$(ROOT_NAME).$(SGT) $(STYLE_DST) $(FAVICON_DST) $(WWW_ASST)
@mkdir -p $(dir $@)
STYLE_REL=$$(realpath -m --relative-to=$(WWW_DIR)/$* $(STYLE_DST)); \
FAVICON_REL=$$(realpath -m --relative-to=$(WWW_DIR)/$* $(FAVICON_DST)); \
GUILE_FLAGS=$(GUILE_FLAGS) $(STS) $(STS_FLAGS) $< | \
GUILE_FLAGS=$(GUILE_FLAGS) $(XIPP) $(XIPP_FLAGS) > $@
$(BANNERS): XIPP_FLAGS += --replace --button
## Render XHTML from SGT data (.sgt -> .xhtml)
$(WWW_DIR)/%/index.$(HTM): $(SXML_DIR)/%.$(SXM)
@mkdir -p $(dir $@)
GUILE_FLAGS=$(GUILE_FLAGS) $(STX) $< > $@
$(WWW_DIR)/$(ROOT_NAME).$(HTM): $(SXML_DIR)/$(ROOT_NAME).$(SXM)
@mkdir -p $(dir $@)
GUILE_FLAGS=$(GUILE_FLAGS) $(STX) $< > $@
## We want to keep intermediary files
.SECONDARY: $(SGT_FILES) $(SXML_FILES)
## Delete rendered files or both
clean:
rm -rf $(GMI_DIR) $(WWW_DIR)
distclean: clean
rm -rf $(SGT_DIR) $(SXML_DIR)
## Run a local web server to view changes
wwwsrv:
@$(MAKE) HTM=html web
@echo
@echo "This is a long-running server; you may wish to run inside tmux/screen"
@echo "Visit http://localhost:$(PORT)/$(CAPSULE_NAME) to view your changes"
@TMPDIR=$$(mktemp -d); \
trap "rm -r $$TMPDIR" EXIT; \
ln -s $$(realpath $(WWW_DIR)) $$TMPDIR/$(CAPSULE_NAME); \
cd $$TMPDIR; \
python -m http.server $(PORT)
.PHONY: all gmi web clean distclean wwwsrv