1# Build type and install directories:
2
3build ?= release
4
5prefix ?= /usr/local
6bindir ?= $(prefix)/bin
7incdir ?= $(prefix)/include
8libdir ?= $(prefix)/lib
9
10ifeq "$(wildcard .git)" ".git"
11  VERSION := $(shell git describe --tags --always)
12else
13  VERSION := $(shell basename $$PWD | sed -e s,^mujs-,,)
14endif
15
16# Compiler flags for various configurations:
17
18CFLAGS := -std=c99 -pedantic -Wall -Wextra -Wno-unused-parameter
19
20ifeq "$(CC)" "clang"
21  CFLAGS += -Wunreachable-code
22endif
23
24ifeq "$(shell uname)" "Linux"
25  CFLAGS += -ffunction-sections -fdata-sections
26  CFLAGS += -DHAVE_READLINE
27  LDFLAGS += -Wl,--gc-sections
28  LIBREADLINE += -lreadline
29endif
30
31ifeq "$(build)" "debug"
32  CFLAGS += -g
33else ifeq "$(build)" "sanitize"
34  CFLAGS += -pipe -g -fsanitize=address -fno-omit-frame-pointer
35  LDFLAGS += -fsanitize=address
36else
37  CFLAGS += -Os
38  LDFLAGS += -Wl,-s
39endif
40
41CFLAGS += $(XCFLAGS)
42
43# You shouldn't need to edit anything below here.
44
45OUT := build/$(build)
46
47SRCS := $(wildcard js*.c utf*.c regexp.c)
48HDRS := $(wildcard js*.h mujs.h utf.h regexp.h)
49
50default: static
51static: $(OUT)/mujs-pp $(OUT)/mujs $(OUT)/libmujs.a $(OUT)/mujs.pc
52shared: static $(OUT)/libmujs.so
53
54astnames.h: jsparse.h
55	grep -E '(AST|EXP|STM)_' jsparse.h | sed 's/^[^A-Z]*\(AST_\)*/"/;s/,.*/",/' | tr A-Z a-z > $@
56
57opnames.h: jscompile.h
58	grep -E 'OP_' jscompile.h | sed 's/^[^A-Z]*OP_/"/;s/,.*/",/' | tr A-Z a-z > $@
59
60one.c: $(SRCS)
61	ls $(SRCS) | awk '{print "#include \""$$1"\""}' > $@
62
63jsdump.c: astnames.h opnames.h
64
65$(OUT)/%.o: %.c $(HDRS)
66	@ mkdir -p $(dir $@)
67	$(CC) $(CFLAGS) -o $@ -c $<
68
69$(OUT)/libmujs.o: one.c $(HDRS)
70	@ mkdir -p $(dir $@)
71	$(CC) $(CFLAGS) -o $@ -c $<
72
73$(OUT)/libmujs.a: $(OUT)/libmujs.o
74	@ mkdir -p $(dir $@)
75	$(AR) cru $@ $^
76
77$(OUT)/libmujs.so: one.c $(HDRS)
78	@ mkdir -p $(dir $@)
79	$(CC) $(CFLAGS) -fPIC -shared -o $@ $< -lm
80
81$(OUT)/mujs: $(OUT)/libmujs.o $(OUT)/main.o
82	@ mkdir -p $(dir $@)
83	$(CC) $(LDFLAGS) -o $@ $^ $(LIBREADLINE) -lm
84
85$(OUT)/mujs-pp: $(OUT)/libmujs.o $(OUT)/pp.o
86	@ mkdir -p $(dir $@)
87	$(CC) $(LDFLAGS) -o $@ $^ -lm
88
89$(OUT)/mujs.pc:
90	@ echo Creating $@
91	@ echo > $@ Name: mujs
92	@ echo >> $@ Description: MuJS embeddable Javascript interpreter
93	@ echo >> $@ Version: $(VERSION)
94	@ echo >> $@ Cflags: -I$(incdir)
95	@ echo >> $@ Libs: -L$(libdir) -lmujs
96	@ echo >> $@ Libs.private: -lm
97
98watch:
99	@ while ! inotifywait -q -e modify $(SRCS) $(HDRS) ; do time -p $(MAKE) ; done
100
101install-common: release
102	install -d $(DESTDIR)$(incdir)
103	install -d $(DESTDIR)$(libdir)
104	install -d $(DESTDIR)$(libdir)/pkgconfig
105	install -d $(DESTDIR)$(bindir)
106	install -m 644 mujs.h $(DESTDIR)$(incdir)
107	install -m 644 build/release/mujs.pc $(DESTDIR)$(libdir)/pkgconfig
108	install -m 755 build/release/mujs $(DESTDIR)$(bindir)
109
110install-static: install-common
111	install -m 644 build/release/libmujs.a $(DESTDIR)$(libdir)
112
113install-shared: install-common
114	install -m 755 build/release/libmujs.so $(DESTDIR)$(libdir)
115
116install: install-static
117
118tarball:
119	git archive --format=zip --prefix=mujs-$(VERSION)/ HEAD > mujs-$(VERSION).zip
120	git archive --format=tar --prefix=mujs-$(VERSION)/ HEAD | gzip > mujs-$(VERSION).tar.gz
121	git archive --format=tar --prefix=mujs-$(VERSION)/ HEAD | xz > mujs-$(VERSION).tar.xz
122
123tags: $(SRCS) main.c $(HDRS)
124	ctags $^
125
126clean:
127	rm -rf build
128
129nuke: clean
130	rm -f astnames.h opnames.h one.c
131
132debug:
133	$(MAKE) build=debug
134
135sanitize:
136	$(MAKE) build=sanitize
137
138release:
139	$(MAKE) build=release shared
140
141.PHONY: default static shared clean nuke
142.PHONY: install install-common install-shared install-static
143.PHONY: debug sanitize release
144