Repository navigation
Expand file tree
/
Copy pathMakefile
More file actions
347 lines (298 loc) · 15 KB
/
Copy pathMakefile
File metadata and controls
347 lines (298 loc) · 15 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
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
#
# SPDX-FileCopyrightText: (c) 2023-2026 Ring Zero Desenvolvimento de Software LTDA
# SPDX-License-Identifier: MIT OR GPL-2.0-only
#
KERNEL_RELEASE ?= ${shell uname -r}
MODULES_PATH := /lib/modules
MODULES_RELEASE_PATH := ${MODULES_PATH}/${KERNEL_RELEASE}
# needed when zfs module is installed
MODULES_ORDER_LIST := kernel/zfs/zfs.ko kernel/zfs/zlua.ko updates/dkms/zfs.ko updates/dkms/zlua.ko ubuntu/dkms/zfs/zfs.ko
MODULES_ORDER_FILE := ${MODULES_RELEASE_PATH}/modules.order
BTF_INSTALL_PATH = ${MODULES_RELEASE_PATH}/build
MODULES_BUILD_PATH ?= ${BTF_INSTALL_PATH}
MODULES_INSTALL_PATH := ${MODULES_RELEASE_PATH}/kernel
SCRIPTS_INSTALL_PATH := ${MODULES_PATH}/lua
INCLUDE_PATH := ${MODULES_BUILD_PATH}/include
LUA ?= lua5.5
LUA_PATH = $(shell $(LUA) -E -e 'print(package.path:match("([^;]*)/%?%.lua;"))')
LUA_CPATH = $(shell $(LUA) -E -e 'print(package.cpath:match("([^;]*)/%?%.so;"))')
LUAEBPF_INSTALL_PATH = ${LUA_PATH}/luaebpf
LUNATIK_INSTALL_PATH = /usr/local/sbin
LUNATIK_EBPF_INSTALL_PATH = /usr/local/lib/bpf/lunatik
LUNATIK_TESTS_INSTALL_PATH = /usr/local/share/lunatik/tests
MOONTASTIK_RELEASE ?= v0.1c
LUA_API = lua/lua.h lua/lauxlib.h lua/lualib.h
RM = rm -f
MKDIR = mkdir -p -m 0755
LN = ln -sf
DOC_TAGS ?= ${shell git tag --points-at HEAD --list 'v*' 2>/dev/null}
INSTALL = install -o root -g root
# luac built with the host compiler from the same lua/ sources and _KERNEL configuration as lunatik.ko
HOSTCC ?= cc
LUNATIC := bin/lunatic
LUNATIC_CORE := lapi lcode lctype ldebug ldo ldump lfunc lgc llex lmem lobject lopcodes \
lparser lstate lstring ltable ltm lundump lvm lzio lauxlib
LUNATIC_SRCS := luac/luac.c $(addprefix lua/,$(addsuffix .c,$(LUNATIC_CORE)))
LUNATIC_CFLAGS := -std=gnu99 -O2 -Wall -D_KERNEL -DLUA_USE_LINUX -I. -Ilua
# what reading and rewriting a chunk takes from lua/, printed by bin/luaebpf/bytecode.c built as lunatic
# is and as the CLI's Lua is, so a chunk lunatic writes loads in the CLI's Lua
LUAEBPF_BYTECODE := bin/luaebpf/bytecode
LUAEBPF_TABLES := ${LUAEBPF_BYTECODE}/kernel.lua ${LUAEBPF_BYTECODE}/host.lua
LUAEBPF_TABLES_SRCS := bin/luaebpf/bytecode.c lua/lopcodes.c
# luaebpf.loader: a C module of the CLI's Lua, built against lua/ as that Lua is, over libbpf
LOADER := bin/luaebpf/loader.so
LOADER_CFLAGS := -std=gnu99 -O2 -Wall -fPIC -shared -DLUA_USE_LINUX -Ilua
# a program file's object goes beside the script it belongs to, where `lunatik run <script>` looks for it;
# the compiler reads the context's layout from the kernel's BTF, so a kernel that publishes none gets no object
define INSTALL_BPF
[ ! -r /sys/kernel/btf/vmlinux ] || for f in $(1); do case "$$f" in \
*.bpf.lua) ${LUNATIK_INSTALL_PATH}/lunatik bpf -o $(2)/$$(basename $$f .lua).o $$f || exit 1;; \
esac; done
endef
# a directory's kernel scripts, not its program files: a program file's body runs on the host, never under the kernel's require
LUA_SCRIPTS = $$(ls $(1)/*.lua 2>/dev/null | grep -v '\.bpf\.lua$$')
# BYTECODE=1 installs kernel Lua scripts as stripped chunks, under their .lua names
define INSTALL_LUA
${INSTALL} -m 0644 $(1) $(2) \
$(if $(filter 1,$(BYTECODE)),&& for f in $(1); do ${LUNATIC} -s -o $(2)/$$(basename $$f) $(2)/$$(basename $$f) || exit 1; done)
endef
CONFIG_LUNATIK ?= m
CONFIG_LUNATIK_RUNTIME ?= y
CONFIG_LUNATIK_RUN ?= m
# Order matters: modules are loaded left-to-right and unloaded right-to-left (rmmod).
# A module must appear AFTER all modules it depends on (e.g. SKB before NETFILTER).
LUNATIK_MODULES := DEVICE LINUX NOTIFIER SOCKET NETLINK RCU TASK THREAD DATA SET PROBE SYSCALL XDP FIFO \
SKB TC NETFILTER COMPLETION CRYPTO CPU HID SIGNAL BYTEORDER DARKEN BPF SCX FSNOTIFY
$(foreach c,$(LUNATIK_MODULES),\
$(eval CONFIG_LUNATIK_$(c) ?= m))
# disable modules here, e.g.:
# CONFIG_LUNATIK_SYSCALL := n
LUNATIK_CONFIG_MODULES := \
$(foreach c,$(LUNATIK_MODULES),CONFIG_LUNATIK_$(c)=$(CONFIG_LUNATIK_$(c)))
LUNATIK_CONFIG_FLAGS := CONFIG_LUNATIK=$(CONFIG_LUNATIK) CONFIG_LUNATIK_RUNTIME=$(CONFIG_LUNATIK_RUNTIME) \
CONFIG_LUNATIK_RUN=$(CONFIG_LUNATIK_RUN) $(LUNATIK_CONFIG_MODULES)
LUNATIK_MODULES := \
$(foreach c,$(LUNATIK_MODULES),\
$(if $(filter y m,$(CONFIG_LUNATIK_$(c))),$(c)))
AUTOGEN_STAMP := autogen/.stamp
AUTOGEN_CONFIG := autogen/.config
AUTOGEN_KEY := $(KERNEL_RELEASE)|$(LUNATIK_MODULES)
.PHONY: all clean install uninstall autogen doc-site doc-stubs FORCE \
scripts_install scripts_uninstall \
modules_install modules_uninstall btf_install \
examples_install examples_uninstall \
tests_install tests_uninstall \
ebpf ebpf_install ebpf_uninstall
all: lunatik_sym.h autogen ${LUNATIC} ${LUAEBPF_TABLES} ${LOADER}
${MAKE} -C ${MODULES_BUILD_PATH} M=${CURDIR} $(LUNATIK_CONFIG_FLAGS)
${LUNATIC}: ${LUNATIC_SRCS} $(wildcard lua/*.h) lunatik_conf.h
${HOSTCC} ${LUNATIC_CFLAGS} -o $@ ${LUNATIC_SRCS}
${LUAEBPF_BYTECODE}/kernel.lua: TABLES_CFLAGS := ${LUNATIC_CFLAGS}
${LUAEBPF_BYTECODE}/host.lua: TABLES_CFLAGS := -std=gnu99 -O2 -Wall -DLUA_USE_LINUX -Ilua
${LUAEBPF_TABLES}: ${LUAEBPF_TABLES_SRCS} $(wildcard lua/*.h) lunatik_conf.h
${MKDIR} ${LUAEBPF_BYTECODE}
${HOSTCC} ${TABLES_CFLAGS} -o $@.bin ${LUAEBPF_TABLES_SRCS}
./$@.bin > $@
${RM} $@.bin
${LOADER}: bin/luaebpf/loader.c $(wildcard lua/*.h)
${HOSTCC} ${LOADER_CFLAGS} -o $@ $< -lbpf
clean:
${MAKE} -C ${MODULES_BUILD_PATH} M=${CURDIR} clean
${MAKE} -C ${MODULES_BUILD_PATH} M=${CURDIR}/autogen clean
${MAKE} -C examples/filter clean
${RM} lunatik_sym.h ${LUNATIC} ${LOADER}
${RM} -r ${LUAEBPF_BYTECODE}
${RM} -r lib/linux
${RM} autogen/lunatik/*.lua autogen/linux/*.lua \
autogen/dump_*.c autogen/dump_*.pp \
autogen/extract.c autogen/extract.s \
autogen/targets.mk ${AUTOGEN_STAMP} ${AUTOGEN_CONFIG}
scripts_install:
${MKDIR} ${SCRIPTS_INSTALL_PATH}
${RM} -r ${SCRIPTS_INSTALL_PATH}/socket
${MKDIR} ${SCRIPTS_INSTALL_PATH}/socket
${RM} -r ${SCRIPTS_INSTALL_PATH}/netlink
${MKDIR} ${SCRIPTS_INSTALL_PATH}/netlink
${MKDIR} ${SCRIPTS_INSTALL_PATH}/netlink/rt
${MKDIR} ${SCRIPTS_INSTALL_PATH}/netlink/nl80211
${RM} -r ${SCRIPTS_INSTALL_PATH}/skb
${RM} -r ${SCRIPTS_INSTALL_PATH}/syscall
${MKDIR} ${SCRIPTS_INSTALL_PATH}/syscall
${RM} -r ${SCRIPTS_INSTALL_PATH}/crypto
${MKDIR} ${SCRIPTS_INSTALL_PATH}/crypto
${RM} -r ${SCRIPTS_INSTALL_PATH}/bpf
${MKDIR} ${SCRIPTS_INSTALL_PATH}/bpf
${RM} -r ${SCRIPTS_INSTALL_PATH}/set
${MKDIR} ${SCRIPTS_INSTALL_PATH}/set
${RM} -r ${SCRIPTS_INSTALL_PATH}/linux
${MKDIR} ${SCRIPTS_INSTALL_PATH}/linux
${MKDIR} ${LUA_PATH}/lunatik
${RM} ${SCRIPTS_INSTALL_PATH}/driver.lua
# source whatever BYTECODE says: the CLI's Lua reads it through the link below, and refuses a chunk lunatic writes
${INSTALL} -m 0644 common/class.lua ${SCRIPTS_INSTALL_PATH}/
$(call INSTALL_LUA,lib/mailbox.lua,${SCRIPTS_INSTALL_PATH}/)
$(call INSTALL_LUA,lib/net.lua,${SCRIPTS_INSTALL_PATH}/)
$(call INSTALL_LUA,lib/struct.lua,${SCRIPTS_INSTALL_PATH}/)
$(call INSTALL_LUA,lib/netlink.lua,${SCRIPTS_INSTALL_PATH}/)
$(call INSTALL_LUA,lib/util.lua,${SCRIPTS_INSTALL_PATH}/)
$(call INSTALL_LUA,lib/lighten.lua,${SCRIPTS_INSTALL_PATH}/)
$(call INSTALL_LUA,lib/socket/*.lua,${SCRIPTS_INSTALL_PATH}/socket)
$(call INSTALL_LUA,lib/netlink/*.lua,${SCRIPTS_INSTALL_PATH}/netlink)
$(call INSTALL_LUA,lib/netlink/rt/*.lua,${SCRIPTS_INSTALL_PATH}/netlink/rt)
$(call INSTALL_LUA,lib/netlink/nl80211/*.lua,${SCRIPTS_INSTALL_PATH}/netlink/nl80211)
$(call INSTALL_LUA,lib/syscall/*.lua,${SCRIPTS_INSTALL_PATH}/syscall)
$(call INSTALL_LUA,lib/crypto/*.lua,${SCRIPTS_INSTALL_PATH}/crypto)
$(call INSTALL_LUA,lib/bpf/*.lua,${SCRIPTS_INSTALL_PATH}/bpf)
$(call INSTALL_LUA,lib/set/*.lua,${SCRIPTS_INSTALL_PATH}/set)
# NOTE: `lib/linux/` exists only as LDoc stubs (see doc-stubs); never install it.
$(call INSTALL_LUA,autogen/linux/*.lua,${SCRIPTS_INSTALL_PATH}/linux)
${RM} -r ${SCRIPTS_INSTALL_PATH}/lunatik # last, so an install that stops earlier keeps the CLI's library
${MKDIR} ${SCRIPTS_INSTALL_PATH}/lunatik
$(call INSTALL_LUA,driver.lua,${SCRIPTS_INSTALL_PATH}/lunatik)
$(call INSTALL_LUA,lib/lunatik/*.lua,${SCRIPTS_INSTALL_PATH}/lunatik)
${INSTALL} -m 0644 autogen/lunatik/*.lua ${SCRIPTS_INSTALL_PATH}/lunatik
${LN} ${SCRIPTS_INSTALL_PATH}/lunatik/config.lua ${LUA_PATH}/lunatik/config.lua
${LN} ${SCRIPTS_INSTALL_PATH}/class.lua ${LUA_PATH}/lunatik/class.lua
${INSTALL} -D -m 0755 bin/lunatik ${LUNATIK_INSTALL_PATH}/lunatik
${INSTALL} -D -m 0755 ${LUNATIC} ${LUNATIK_INSTALL_PATH}/lunatic
${INSTALL} -D -m 0755 ${LOADER} ${LUA_CPATH}/luaebpf/loader.so
${RM} -r ${LUAEBPF_INSTALL_PATH}
${MKDIR} ${LUAEBPF_INSTALL_PATH}/bytecode ${LUAEBPF_INSTALL_PATH}/emit ${LUAEBPF_INSTALL_PATH}/lib/bpf
${INSTALL} -m 0644 bin/luaebpf/*.lua ${LUAEBPF_INSTALL_PATH}
${INSTALL} -m 0644 ${LUAEBPF_TABLES} ${LUAEBPF_INSTALL_PATH}/bytecode
${INSTALL} -m 0644 bin/luaebpf/emit/*.lua ${LUAEBPF_INSTALL_PATH}/emit
${INSTALL} -m 0644 bin/luaebpf/lib/bpf/*.lua ${LUAEBPF_INSTALL_PATH}/lib/bpf
scripts_uninstall:
${RM} ${SCRIPTS_INSTALL_PATH}/driver.lua
${RM} ${SCRIPTS_INSTALL_PATH}/class.lua
${RM} ${SCRIPTS_INSTALL_PATH}/mailbox.lua
${RM} ${SCRIPTS_INSTALL_PATH}/net.lua
${RM} ${SCRIPTS_INSTALL_PATH}/struct.lua
${RM} ${SCRIPTS_INSTALL_PATH}/netlink.lua
${RM} ${SCRIPTS_INSTALL_PATH}/util.lua
${RM} ${SCRIPTS_INSTALL_PATH}/lighten.lua
${RM} -r ${SCRIPTS_INSTALL_PATH}/lunatik
${RM} -r ${SCRIPTS_INSTALL_PATH}/socket
${RM} -r ${SCRIPTS_INSTALL_PATH}/netlink
${RM} -r ${SCRIPTS_INSTALL_PATH}/skb
${RM} -r ${SCRIPTS_INSTALL_PATH}/syscall
${RM} -r ${SCRIPTS_INSTALL_PATH}/crypto
${RM} -r ${SCRIPTS_INSTALL_PATH}/bpf
${RM} -r ${SCRIPTS_INSTALL_PATH}/set
${RM} -r ${SCRIPTS_INSTALL_PATH}/linux
${RM} ${LUNATIK_INSTALL_PATH}/lunatik ${LUNATIK_INSTALL_PATH}/lunatic
${RM} -r ${LUAEBPF_INSTALL_PATH}
${RM} -r ${LUA_PATH}/lunatik ${LUA_CPATH}/luaebpf
ebpf:
${MAKE} -C examples/filter
${MAKE} -C examples/sniclassify
ebpf_install:
${MKDIR} ${LUNATIK_EBPF_INSTALL_PATH}
${INSTALL} -m 0644 examples/filter/https.o ${LUNATIK_EBPF_INSTALL_PATH}/
${INSTALL} -m 0644 examples/sniclassify/classify.o ${LUNATIK_EBPF_INSTALL_PATH}/
ebpf_uninstall:
${RM} -r ${LUNATIK_EBPF_INSTALL_PATH}
EXAMPLE_DIRS := $(patsubst examples/%/,%,$(wildcard examples/*/))
examples_install:
${RM} -r ${SCRIPTS_INSTALL_PATH}/examples
${MKDIR} ${SCRIPTS_INSTALL_PATH}/examples
for d in $(EXAMPLE_DIRS); do \
${MKDIR} ${SCRIPTS_INSTALL_PATH}/examples/$$d; \
lua=$(call LUA_SCRIPTS,examples/$$d); \
$(call INSTALL_LUA,$$lua,${SCRIPTS_INSTALL_PATH}/examples/$$d); \
$(call INSTALL_BPF,examples/$$d/*.lua,${SCRIPTS_INSTALL_PATH}/examples/$$d); \
done
examples_uninstall:
${RM} -r ${SCRIPTS_INSTALL_PATH}/examples
# Flat test subdirs follow the pattern `.sh -> TESTS/<x>, .lua -> SCRIPTS/tests/<x>`.
# `socket/` is nested (unix/ underneath) and handled separately below.
TEST_DIRS := $(filter-out socket,$(patsubst tests/%/,%,$(wildcard tests/*/)))
TEST_PEERS := $(filter-out %.bpf.c,$(wildcard tests/*/*.c tests/*/*/*.c))
tests_install:
${RM} -r ${SCRIPTS_INSTALL_PATH}/tests ${LUNATIK_TESTS_INSTALL_PATH}
${MKDIR} ${LUNATIK_TESTS_INSTALL_PATH}
${INSTALL} -m 0755 tests/run.sh ${LUNATIK_TESTS_INSTALL_PATH}
${INSTALL} -m 0644 tests/lib.sh tests/netns.sh ${LUNATIK_TESTS_INSTALL_PATH}
${MKDIR} ${SCRIPTS_INSTALL_PATH}/tests
${INSTALL} -m 0644 tests/lib.lua ${SCRIPTS_INSTALL_PATH}/tests
for d in $(TEST_DIRS); do \
${MKDIR} ${LUNATIK_TESTS_INSTALL_PATH}/$$d ${SCRIPTS_INSTALL_PATH}/tests/$$d; \
${INSTALL} -m 0755 tests/$$d/*.sh ${LUNATIK_TESTS_INSTALL_PATH}/$$d; \
lua=$(call LUA_SCRIPTS,tests/$$d); \
[ -z "$$lua" ] || ${INSTALL} -m 0644 $$lua ${SCRIPTS_INSTALL_PATH}/tests/$$d; \
done
${INSTALL} -m 0644 tests/xdp/Makefile tests/xdp/*.bpf.c ${LUNATIK_TESTS_INSTALL_PATH}/xdp
${INSTALL} -m 0644 tests/tc/Makefile tests/tc/*.bpf.c ${LUNATIK_TESTS_INSTALL_PATH}/tc
${INSTALL} -m 0644 tests/scx/Makefile tests/scx/*.bpf.c tests/scx/*.bpf.h ${LUNATIK_TESTS_INSTALL_PATH}/scx
${INSTALL} -m 0644 tests/fifo/Makefile tests/fifo/*.bpf.c ${LUNATIK_TESTS_INSTALL_PATH}/fifo
${INSTALL} -m 0644 tests/luaebpf/*.bpf.lua ${LUNATIK_TESTS_INSTALL_PATH}/luaebpf
${INSTALL} -m 0755 tools/shade.sh ${LUNATIK_TESTS_INSTALL_PATH}/darken
${MKDIR} ${LUNATIK_TESTS_INSTALL_PATH}/socket/unix ${SCRIPTS_INSTALL_PATH}/tests/socket/unix
${INSTALL} -m 0755 tests/socket/*.sh ${LUNATIK_TESTS_INSTALL_PATH}/socket
${INSTALL} -m 0644 tests/socket/*.lua ${SCRIPTS_INSTALL_PATH}/tests/socket
${INSTALL} -m 0755 tests/socket/unix/*.sh ${LUNATIK_TESTS_INSTALL_PATH}/socket/unix
${INSTALL} -m 0644 tests/socket/unix/*.lua ${SCRIPTS_INSTALL_PATH}/tests/socket/unix
for f in $(TEST_PEERS); do ${INSTALL} -m 0644 $$f ${LUNATIK_TESTS_INSTALL_PATH}/$${f#tests/}; done
# a luaebpf case compiles its own program files: the corpora write their oracle where they compile
for d in $(filter-out luaebpf,$(TEST_DIRS)); do \
$(call INSTALL_BPF,tests/$$d/*.lua,${SCRIPTS_INSTALL_PATH}/tests/$$d); \
done
tests_uninstall:
${RM} -r ${SCRIPTS_INSTALL_PATH}/tests
${RM} -r ${LUNATIK_TESTS_INSTALL_PATH}
modules_install:
${RM} -r ${MODULES_INSTALL_PATH}/lunatik
${MKDIR} ${MODULES_INSTALL_PATH}/lunatik
${INSTALL} -m 0644 $$(sed 's/\.o$$/.ko/' modules.order) ${MODULES_INSTALL_PATH}/lunatik
btf_install:
cp /sys/kernel/btf/vmlinux ${BTF_INSTALL_PATH}
modules_uninstall:
${RM} -r ${MODULES_INSTALL_PATH}/lunatik
# the program files of examples_install and tests_install compile with the CLI scripts_install writes
install: scripts_install modules_install
${MAKE} examples_install tests_install
for mod in $(MODULES_ORDER_LIST); do \
sed -i "\|^$$mod$$|d" $(MODULES_ORDER_FILE); \
echo "$$mod" >> $(MODULES_ORDER_FILE); \
done
depmod -a
uninstall: scripts_uninstall modules_uninstall examples_uninstall tests_uninstall
for mod in $(MODULES_ORDER_LIST); do \
sed -i "\|^$$mod$$|d" $(MODULES_ORDER_FILE); \
done
depmod -a
lunatik_sym.h: $(LUA_API) gensymbols.sh
${shell CC='$(CC)' ./gensymbols.sh $(LUA_API) > lunatik_sym.h}
# Only rewrite .config when the key actually changes, so its mtime
# advances exactly when KERNEL_RELEASE or the enabled module set does.
$(AUTOGEN_CONFIG): FORCE
@printf '%s\n' '$(AUTOGEN_KEY)' | cmp -s - $@ 2>/dev/null || \
printf '%s\n' '$(AUTOGEN_KEY)' > $@
$(AUTOGEN_STAMP): autogen.lua autogen/specs.lua $(AUTOGEN_CONFIG)
${RM} autogen/linux/*.lua
CC='$(CC)' "$(LUA)" autogen.lua "$(MODULES_BUILD_PATH)" "$(KERNEL_RELEASE)" "$(LUNATIK_MODULES)"
@touch $@
autogen: $(AUTOGEN_STAMP)
FORCE:
moontastik_install_%:
[ $* ] || (echo "usage: make moontastik_install_TARGET" ; exit 1)
wget https://github.com/luainkernel/moontastik/releases/download/${MOONTASTIK_RELEASE}/moontastik_lua.zip -O moontastik_lua.zip
[ -d moontastik_lua ] && ${RM} -r moontastik_lua || true
unzip moontastik_lua.zip
cd moontastik_lua/"$*" && ./install.sh ; cd -
moontastik_uninstall_%:
[ $* ] || (echo "usage: make moontastik_uninstall_TARGET" ; exit 1)
${RM} -r ${SCRIPTS_INSTALL_PATH}/$*
doc-stubs:
${RM} -r lib/linux
"$(LUA)" autogen/ldoc.lua
# DOC_RELEASES lists the release tags the site serves, latest first, for the header's version switch
doc-site: doc-stubs
${RM} -r doc/classes doc/modules doc/topics
printf '%s\n' ${DOC_TAGS} > doc/.tags
printf '%s\n' ${DOC_RELEASES} > doc/.releases
ldoc .
${RM} doc/.tags doc/.releases
cp doc/style/site.js doc/site.js
cp -r doc/style/fonts doc/
"$(LUA)" doc/style/search.lua doc