Repository navigation
Expand file tree
/
Copy pathMakefile
More file actions
197 lines (164 loc) · 6.01 KB
/
Copy pathMakefile
File metadata and controls
197 lines (164 loc) · 6.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
R := https://github.com/makeplus/makes
M := .cache/makes
$(shell [ -d $M ] || (git clone -q $R '$M'))
include $M/init.mk
include $M/clean.mk
PYTHON-VENV := $(ROOT)/venv
include $M/python.mk
include $M/typos.mk
include $M/yamlscript.mk
GLOJURE-VERSION := 0.6.5-rc30
# Set before include: glojure.mk uses `override GLOJURE-REPO`, which silently
# locks the value and ignores any later plain `:=` assignment.
GLOJURE-REPO := https://github.com/gloathub/glojure
include $M/go.mk
include $M/glojure.mk
include $M/node.mk
# glojure.mk installs a prebuilt CLI for shell sessions. This project only
# uses the source checkout below, because the browser runtime is built as WASM.
SHELL-DEPS := $(filter-out $(GLJ),$(SHELL-DEPS))
GLOJURE-TAG := v$(patsubst v%,%,$(GLOJURE-VERSION))
GLOJURE-DIR := $(LOCAL-CACHE)/glojure-$(GLOJURE-TAG)
$(GLOJURE-DIR):
@echo "* Cloning glojure $(GLOJURE-TAG) locally"
git clone -q -b $(GLOJURE-TAG) --config advice.detachedHead=false \
$(GLOJURE-REPO) $@
SHELL-DEPS += $(PYTHON-VENV)
include $M/shell.mk
export UV_LINK_MODE := copy
export UV_CACHE_DIR := $(ROOT)/.cache/uv
export NPM_CONFIG_CACHE := $(ROOT)/.cache/npm
export NO_MKDOCS_2_WARNING := 1
# Override python.mk's venv recipe: use uv venv instead of python -m venv
# (avoids ensurepip hang with uv-managed standalone Python builds).
$(PYTHON-VENV): $(PYTHON)
@echo '+++ Installing a Python virtualenv in $@'
uv venv --python $(PYTHON-NAME) $@
$(if $(wildcard requirements.txt),uv pip install -r requirements.txt,true)
@echo
REPO ?= git@github.com:clojurestar/clojure-cc
MAKES-CLEAN := \
docs/clojuredocs.org/ \
docs/dialects.md \
docs/javascripts/cc-logo-data.js \
docs/javascripts/clojuredocs.js \
docs/repl/wasm_exec.js \
site \
MAKES-REALCLEAN := \
$(PYTHON-VENV) \
docs/repl/glj.wasm \
hooks/__pycache__/ \
repo-data.yaml \
MAKES-DISTCLEAN := .cache/
DEPS := \
$(PYTHON-VENV) \
default::
GLJ-WASM := docs/repl/glj.wasm
GLJ-WASM-EXEC := docs/repl/wasm_exec.js
CLOJUREDOCS-DIR := docs/clojuredocs.org
CLOJUREDOCS-JS-DIR := $(LOCAL-CACHE)/clojuredocs-js
CLOJUREDOCS-JS := docs/javascripts/clojuredocs.js
CLOJUREDOCS-JS-SOURCES := \
src/clojuredocs/editor.js \
src/clojuredocs/forms.js \
src/clojuredocs/forms.test.js
CLOJUREDOCS-EXPORT := $(LOCAL-CACHE)/clojuredocs-export.json
CLOJUREDOCS-GLJ := $(LOCAL-BIN)/glj-check
CLOJUREDOCS-PAGES := src/clojuredocs/pages.yaml
# Build the in-browser Glojure REPL WebAssembly binary
$(GLJ-WASM): $(GO) $(GLOJURE-DIR)
@mkdir -p $(dir $@)
cd $(GLOJURE-DIR)/cmd/glj && \
GOOS=js \
GOARCH=wasm \
CGO_ENABLED=0 \
go build \
-ldflags "-X github.com/gloathub/glojure/pkg/runtime.version=$(GLOJURE-VERSION)" \
-o $(ROOT)/$@ .
$(GLJ-WASM-EXEC): $(GO)
@mkdir -p $(dir $@)
cp $(GOROOT)/lib/wasm/wasm_exec.js $@
glj-wasm: $(GLJ-WASM) $(GLJ-WASM-EXEC)
# Refresh the tracked, normalized subset from the public ClojureDocs export.
clojuredocs-refresh: $(YS) $(PYTHON) $(CLOJUREDOCS-PAGES)
clojuredocs_source="$$(ys -e \
"say: load('$(CLOJUREDOCS-PAGES)').meta.source.url")"; \
curl+ "$$clojuredocs_source" > $(CLOJUREDOCS-EXPORT)
mkdir -p $(LOCAL-TMP)
ys util/clojuredocs-refresh.ys | \
$(PYTHON) -m json.tool --no-ensure-ascii --indent 2 > \
$(LOCAL-TMP)/clojuredocs-snapshot.json
mv $(LOCAL-TMP)/clojuredocs-snapshot.json \
src/clojuredocs/snapshot.json
$(CLOJUREDOCS-DIR): util/clojuredocs.ys \
src/clojuredocs/snapshot.json \
$(CLOJUREDOCS-PAGES) $(YS)
$(RM) -r $@
mkdir -p $@
ys util/clojuredocs.ys
$(CLOJUREDOCS-JS-DIR)/node_modules/.ready: \
src/clojuredocs/package.json src/clojuredocs/package-lock.json $(NODE)
$(RM) -r $(CLOJUREDOCS-JS-DIR)
mkdir -p $(CLOJUREDOCS-JS-DIR)
cp src/clojuredocs/package.json \
src/clojuredocs/package-lock.json $(CLOJUREDOCS-JS-DIR)/
cd $(CLOJUREDOCS-JS-DIR) && \
npm ci --ignore-scripts --no-audit --no-fund
touch $@
$(CLOJUREDOCS-JS): $(CLOJUREDOCS-JS-SOURCES) \
$(CLOJUREDOCS-JS-DIR)/node_modules/.ready
cp $(CLOJUREDOCS-JS-SOURCES) $(CLOJUREDOCS-JS-DIR)/
cd $(CLOJUREDOCS-JS-DIR) && \
node_modules/.bin/esbuild editor.js --bundle --format=iife \
--minify --outfile=$(ROOT)/$@
clojuredocs: $(CLOJUREDOCS-DIR) $(CLOJUREDOCS-JS)
$(CLOJUREDOCS-GLJ): $(GO) $(GLOJURE-DIR)
cd $(GLOJURE-DIR)/cmd/glj && \
go build -o $@ .
clojuredocs-check: $(CLOJUREDOCS-DIR) $(CLOJUREDOCS-GLJ) \
$(GLJ-WASM) $(GLJ-WASM-EXEC) $(CLOJUREDOCS-JS) $(NODE)
cd $(CLOJUREDOCS-JS-DIR) && node --test forms.test.js
CLOJUREDOCS_FORMS=$(CLOJUREDOCS-JS-DIR)/forms.js \
GLJ=$(CLOJUREDOCS-GLJ) node util/check-clojuredocs.mjs
CLOJUREDOCS_FORMS=$(CLOJUREDOCS-JS-DIR)/forms.js \
node util/check-clojuredocs-wasm.mjs
# Refresh star counts and latest-release info into repo-data.yaml
repo-data: $(YS)
ys util/repo-data.ys
# Generate dialect catalog from YAML data
# repo-data.yaml is optional: if absent the Stars and Release columns render
# empty. Refresh it with `make repo-data` before publishing.
docs/dialects.md: util/dialects.ys src/dialects.yaml src/dialects.md \
$(wildcard repo-data.yaml) $(YS)
ys $< > $@
# Generate logo dialect data JS from YAML data
docs/javascripts/cc-logo-data.js: util/cc-logo-data.ys src/dialects.yaml $(YS)
ys $< > $@
# Build main site (production)
site: $(DEPS) glj-wasm clojuredocs docs/dialects.md \
docs/javascripts/cc-logo-data.js
mkdocs build -d $@
# Serve locally with MkDocs
# Kill any other 'mkdocs serve' first so a stale dev server on the same port
# doesn't block startup.
serve: $(DEPS) glj-wasm clojuredocs docs/dialects.md \
docs/javascripts/cc-logo-data.js
-pkill -f 'mkdocs serve' 2>/dev/null
mkdocs serve --livereload
# Build alias
build: site
# Lint check
lint: $(TYPOS)
typos
# Deploy to production: refresh repo data, build, force-push to gh-pages
publish: repo-data
$(MAKE) site
cd site && \
git init && \
git add -A && \
git commit -m 'Deploy to production' && \
git push -f $(REPO) HEAD:gh-pages
$(RM) -r site
# Deploy to production without refreshing repo data
publish-quickly:
$(MAKE) -o repo-data publish