mirror of
https://github.com/ccxvii/mujs.git
synced 2026-09-26 03:43:52 +08:00
Simplify Makefile.
This commit is contained in:
@@ -1,67 +1,65 @@
|
||||
# Build type and install directories:
|
||||
# Makefile for building MuJS libraries, shell, and pretty-printer.
|
||||
#
|
||||
# Useful targets are: release, install, uninstall.
|
||||
|
||||
-include user.make
|
||||
default: build/debug/mujs build/debug/mujs-pp
|
||||
|
||||
build ?= release
|
||||
CFLAGS = -std=c99 -pedantic -Wall -Wextra -Wno-unused-parameter
|
||||
|
||||
prefix ?= /usr/local
|
||||
bindir ?= $(prefix)/bin
|
||||
incdir ?= $(prefix)/include
|
||||
libdir ?= $(prefix)/lib
|
||||
OPTIM = -O3
|
||||
|
||||
ifeq "$(wildcard .git)" ".git"
|
||||
VERSION := $(shell git describe --tags --always)
|
||||
prefix = /usr/local
|
||||
bindir = $(prefix)/bin
|
||||
incdir = $(prefix)/include
|
||||
libdir = $(prefix)/lib
|
||||
|
||||
ifeq ($(wildcard .git),.git)
|
||||
VERSION = $(shell git describe --tags --always)
|
||||
else
|
||||
VERSION := $(patsubst mujs-%,%,$(notdir $(CURDIR)))
|
||||
VERSION = $(patsubst mujs-%,%,$(notdir $(CURDIR)))
|
||||
endif
|
||||
|
||||
ifeq ($(shell uname),Darwin)
|
||||
SO_EXT := dylib
|
||||
SO = dylib
|
||||
else
|
||||
SO_EXT := so
|
||||
SO = so
|
||||
endif
|
||||
|
||||
# Compiler flags for various configurations:
|
||||
|
||||
CFLAGS := -std=c99 -pedantic -Wall -Wextra -Wno-unused-parameter
|
||||
|
||||
ifeq "$(CC)" "clang"
|
||||
CFLAGS += -Wunreachable-code
|
||||
ifeq ($(shell uname),FreeBSD)
|
||||
CFLAGS += -I/usr/local/include -L/usr/local/lib
|
||||
endif
|
||||
|
||||
ifeq "$(shell uname)" "Linux"
|
||||
HAVE_READLINE := yes
|
||||
endif
|
||||
HDRS = mujs.h jsi.h regexp.h utf.h astnames.h opnames.h
|
||||
|
||||
ifeq "$(build)" "debug"
|
||||
CFLAGS += -g
|
||||
else ifeq "$(build)" "sanitize"
|
||||
CFLAGS += -pipe -g -fsanitize=address -fno-omit-frame-pointer
|
||||
LDFLAGS += -fsanitize=address
|
||||
else ifeq "$(build)" "release"
|
||||
CFLAGS += -O2
|
||||
LDFLAGS += -Wl,-s
|
||||
endif
|
||||
SRCS = \
|
||||
jsarray.c \
|
||||
jsboolean.c \
|
||||
jsbuiltin.c \
|
||||
jscompile.c \
|
||||
jsdate.c \
|
||||
jsdtoa.c \
|
||||
jserror.c \
|
||||
jsfunction.c \
|
||||
jsgc.c \
|
||||
jsintern.c \
|
||||
jslex.c \
|
||||
jsmath.c \
|
||||
jsnumber.c \
|
||||
jsobject.c \
|
||||
json.c \
|
||||
jsparse.c \
|
||||
jsproperty.c \
|
||||
jsregexp.c \
|
||||
jsrepr.c \
|
||||
jsrun.c \
|
||||
jsstate.c \
|
||||
jsstring.c \
|
||||
jsvalue.c \
|
||||
regexp.c \
|
||||
utf.c
|
||||
|
||||
ifeq "$(HAVE_READLINE)" "yes"
|
||||
CFLAGS += -DHAVE_READLINE
|
||||
LIBREADLINE += -lreadline
|
||||
endif
|
||||
|
||||
CFLAGS += $(XCFLAGS)
|
||||
CPPFLAGS += $(XCPPFLAGS)
|
||||
|
||||
# You shouldn't need to edit anything below here.
|
||||
|
||||
OUT := build/$(build)
|
||||
|
||||
SRCS := $(wildcard js*.c utf*.c regexp.c)
|
||||
HDRS := $(wildcard js*.h mujs.h utf.h regexp.h)
|
||||
|
||||
default: shell
|
||||
shell: $(OUT)/mujs $(OUT)/mujs-pp
|
||||
static: $(OUT)/libmujs.a
|
||||
shared: $(OUT)/libmujs.$(SO_EXT)
|
||||
one.c:
|
||||
for F in $(SRCS); do echo "#include \"$$F\""; done > $@
|
||||
|
||||
astnames.h: jsi.h
|
||||
grep -E '\<(AST|EXP|STM)_' jsi.h | sed 's/^[^A-Z]*\(AST_\)*/"/;s/,.*/",/' | tr A-Z a-z > $@
|
||||
@@ -69,99 +67,91 @@ astnames.h: jsi.h
|
||||
opnames.h: jsi.h
|
||||
grep -E '\<OP_' jsi.h | sed 's/^[^A-Z]*OP_/"/;s/,.*/",/' | tr A-Z a-z > $@
|
||||
|
||||
UnicodeData.txt:
|
||||
curl -s -o $@ https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt
|
||||
|
||||
one.c: $(SRCS)
|
||||
ls $(SRCS) | awk '{print "#include \""$$1"\""}' > $@
|
||||
utfdata.h: genucd.py UnicodeData.txt
|
||||
python3 genucd.py UnicodeData.txt >$@
|
||||
|
||||
pp.c: astnames.h opnames.h
|
||||
build/sanitize/mujs: main.c one.c $(SRCS) $(HDRS)
|
||||
@mkdir -p $(@D)
|
||||
$(CC) $(CFLAGS) -g -fsanitize=address -fno-omit-frame-pointer -o $@ main.c one.c -lm -DHAVE_READLINE -lreadline
|
||||
|
||||
$(OUT)/%.o: %.c $(HDRS)
|
||||
@ mkdir -p $(@D)
|
||||
$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ -c $<
|
||||
|
||||
$(OUT)/libmujs.o: one.c $(HDRS)
|
||||
@ mkdir -p $(@D)
|
||||
$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ -c $<
|
||||
|
||||
$(OUT)/libmujs.a: $(OUT)/libmujs.o
|
||||
@ mkdir -p $(@D)
|
||||
build/debug/libmujs.$(SO): one.c $(SRCS) $(HDRS)
|
||||
@mkdir -p $(@D)
|
||||
$(CC) $(CFLAGS) -g -fPIC -shared -o $@ one.c -lm
|
||||
build/debug/libmujs.o: one.c $(SRCS) $(HDRS)
|
||||
@mkdir -p $(@D)
|
||||
$(CC) $(CFLAGS) -g -c -o $@ one.c
|
||||
build/debug/libmujs.a: build/debug/libmujs.o
|
||||
$(AR) cr $@ $^
|
||||
build/debug/mujs: main.c build/debug/libmujs.o
|
||||
$(CC) $(CFLAGS) -g -o $@ $^ -lm -DHAVE_READLINE -lreadline
|
||||
build/debug/mujs-pp: pp.c build/debug/libmujs.o
|
||||
$(CC) $(CFLAGS) -g -o $@ $^ -lm
|
||||
|
||||
$(OUT)/libmujs.$(SO_EXT): one.c $(HDRS)
|
||||
@ mkdir -p $(@D)
|
||||
$(CC) $(CFLAGS) $(CPPFLAGS) -fPIC -shared $(LDFLAGS) -o $@ $< -lm
|
||||
build/release/libmujs.$(SO): one.c $(SRCS) $(HDRS)
|
||||
@mkdir -p $(@D)
|
||||
$(CC) $(CFLAGS) $(OPTIM) -fPIC -shared -o $@ one.c -lm
|
||||
build/release/libmujs.o: one.c $(SRCS) $(HDRS)
|
||||
@mkdir -p $(@D)
|
||||
$(CC) $(CFLAGS) $(OPTIM) -c -o $@ one.c
|
||||
build/release/libmujs.a: build/release/libmujs.o
|
||||
$(AR) cr $@ $^
|
||||
build/release/mujs: main.c build/release/libmujs.o
|
||||
$(CC) $(CFLAGS) $(OPTIM) -o $@ $^ -lm -DHAVE_READLINE -lreadline
|
||||
build/release/mujs-pp: pp.c build/release/libmujs.o
|
||||
$(CC) $(CFLAGS) $(OPTIM) -o $@ $^ -lm
|
||||
|
||||
libmujs ?= libmujs.a
|
||||
build/release/mujs.pc:
|
||||
@mkdir -p $(@D)
|
||||
echo > $@ Name: mujs
|
||||
echo >> $@ Description: MuJS embeddable Javascript interpreter
|
||||
echo >> $@ Version: $(VERSION)
|
||||
echo >> $@ Cflags: -I$(incdir)
|
||||
echo >> $@ Libs: -L$(libdir) -lmujs
|
||||
echo >> $@ Libs.private: -lm
|
||||
|
||||
$(OUT)/mujs: $(OUT)/main.o $(OUT)/$(libmujs)
|
||||
@ mkdir -p $(@D)
|
||||
$(CC) $(LDFLAGS) -o $@ $< -L$(OUT) -l:$(libmujs) $(LIBREADLINE) -lm
|
||||
|
||||
$(OUT)/mujs-pp: $(OUT)/pp.o $(OUT)/$(libmujs)
|
||||
@ mkdir -p $(@D)
|
||||
$(CC) $(LDFLAGS) -o $@ $< -L$(OUT) -l:$(libmujs) -lm
|
||||
|
||||
.PHONY: $(OUT)/mujs.pc
|
||||
$(OUT)/mujs.pc:
|
||||
@ mkdir -p $(dir $@)
|
||||
@ echo Creating $@
|
||||
@ echo > $@ Name: mujs
|
||||
@ echo >> $@ Description: MuJS embeddable Javascript interpreter
|
||||
@ echo >> $@ Version: $(VERSION)
|
||||
@ echo >> $@ Cflags: -I$(incdir)
|
||||
@ echo >> $@ Libs: -L$(libdir) -lmujs
|
||||
@ echo >> $@ Libs.private: -lm
|
||||
|
||||
watch:
|
||||
@ while ! inotifywait -q -e modify $(SRCS) $(HDRS) ; do time -p $(MAKE) ; done
|
||||
|
||||
install-common: $(OUT)/mujs $(OUT)/mujs.pc
|
||||
install: build/release/mujs build/release/libmujs.a build/release/libmujs.$(SO) build/release/mujs.pc
|
||||
install -d $(DESTDIR)$(incdir)
|
||||
install -d $(DESTDIR)$(libdir)
|
||||
install -d $(DESTDIR)$(libdir)/pkgconfig
|
||||
install -d $(DESTDIR)$(bindir)
|
||||
install -m 644 mujs.h $(DESTDIR)$(incdir)
|
||||
install -m 644 $(OUT)/mujs.pc $(DESTDIR)$(libdir)/pkgconfig
|
||||
install -m 755 $(OUT)/mujs $(DESTDIR)$(bindir)
|
||||
|
||||
install-static: install-common $(OUT)/libmujs.a
|
||||
install -m 644 $(OUT)/libmujs.a $(DESTDIR)$(libdir)
|
||||
|
||||
install-shared: install-common $(OUT)/libmujs.$(SO_EXT)
|
||||
install -m 755 $(OUT)/libmujs.$(SO_EXT) $(DESTDIR)$(libdir)
|
||||
|
||||
install: install-static
|
||||
install -m 644 build/release/mujs.pc $(DESTDIR)$(libdir)/pkgconfig
|
||||
install -m 755 build/release/mujs $(DESTDIR)$(bindir)
|
||||
install -m 644 build/release/libmujs.a $(DESTDIR)$(libdir)
|
||||
install -m 755 build/release/libmujs.$(SO) $(DESTDIR)$(libdir)
|
||||
|
||||
uninstall:
|
||||
rm -f $(DESTDIR)$(bindir)/mujs
|
||||
rm -f $(DESTDIR)$(incdir)/mujs.h
|
||||
rm -f $(DESTDIR)$(libdir)/pkgconfig/mujs.pc
|
||||
rm -f $(DESTDIR)$(libdir)/libmujs.a
|
||||
rm -f $(DESTDIR)$(libdir)/libmujs.$(SO_EXT)
|
||||
rm -f $(DESTDIR)$(libdir)/libmujs.$(SO)
|
||||
|
||||
tarball:
|
||||
git archive --format=zip --prefix=mujs-$(VERSION)/ HEAD > mujs-$(VERSION).zip
|
||||
git archive --format=tar --prefix=mujs-$(VERSION)/ HEAD | gzip > mujs-$(VERSION).tar.gz
|
||||
git archive --format=tar --prefix=mujs-$(VERSION)/ HEAD | xz > mujs-$(VERSION).tar.xz
|
||||
|
||||
tags: $(SRCS) main.c $(HDRS)
|
||||
tags: $(SRCS) $(HDRS) main.c pp.c
|
||||
ctags $^
|
||||
|
||||
clean:
|
||||
rm -rf build
|
||||
|
||||
nuke: clean
|
||||
rm -f astnames.h opnames.h one.c
|
||||
rm -f one.c astnames.h opnames.h
|
||||
|
||||
debug:
|
||||
$(MAKE) build=debug
|
||||
sanitize: build/sanitize/mujs
|
||||
|
||||
sanitize:
|
||||
$(MAKE) build=sanitize
|
||||
debug: build/debug/libmujs.a
|
||||
debug: build/debug/libmujs.$(SO)
|
||||
debug: build/debug/mujs
|
||||
debug: build/debug/mujs-pp
|
||||
|
||||
release:
|
||||
$(MAKE) build=release
|
||||
|
||||
.PHONY: default static shared shell clean nuke
|
||||
.PHONY: install install-common install-shared install-static
|
||||
.PHONY: debug sanitize release
|
||||
release: build/release/mujs.pc
|
||||
release: build/release/libmujs.a
|
||||
release: build/release/libmujs.$(SO)
|
||||
release: build/release/mujs
|
||||
release: build/release/mujs-pp
|
||||
|
||||
Reference in New Issue
Block a user