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