Makefile 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. # Makefile for building MuJS libraries, shell, and pretty-printer.
  2. #
  3. # Useful targets are: release, install, uninstall.
  4. default: build/debug/mujs build/debug/mujs-pp
  5. CFLAGS = -std=c99 -pedantic -Wall -Wextra -Wno-unused-parameter
  6. OPTIM = -O3
  7. prefix = /usr/local
  8. bindir = $(prefix)/bin
  9. incdir = $(prefix)/include
  10. libdir = $(prefix)/lib
  11. ifeq ($(wildcard .git),.git)
  12. VERSION = $(shell git describe --tags --always)
  13. else
  14. VERSION = $(patsubst mujs-%,%,$(notdir $(CURDIR)))
  15. endif
  16. ifeq ($(shell uname),Darwin)
  17. SO = dylib
  18. else
  19. SO = so
  20. endif
  21. ifeq ($(shell uname),FreeBSD)
  22. CFLAGS += -I/usr/local/include -L/usr/local/lib
  23. endif
  24. HDRS = mujs.h jsi.h regexp.h utf.h astnames.h opnames.h
  25. ifneq ($(HAVE_READLINE),no)
  26. READLINE_CFLAGS = -DHAVE_READLINE
  27. READLINE_LIBS = -lreadline
  28. endif
  29. SRCS = \
  30. jsarray.c \
  31. jsboolean.c \
  32. jsbuiltin.c \
  33. jscompile.c \
  34. jsdate.c \
  35. jsdtoa.c \
  36. jserror.c \
  37. jsfunction.c \
  38. jsgc.c \
  39. jsintern.c \
  40. jslex.c \
  41. jsmath.c \
  42. jsnumber.c \
  43. jsobject.c \
  44. json.c \
  45. jsparse.c \
  46. jsproperty.c \
  47. jsregexp.c \
  48. jsrepr.c \
  49. jsrun.c \
  50. jsstate.c \
  51. jsstring.c \
  52. jsvalue.c \
  53. regexp.c \
  54. utf.c
  55. one.c:
  56. for F in $(SRCS); do echo "#include \"$$F\""; done > $@
  57. astnames.h: jsi.h
  58. grep -E '\<(AST|EXP|STM)_' jsi.h | sed 's/^[^A-Z]*\(AST_\)*/"/;s/,.*/",/' | tr A-Z a-z > $@
  59. opnames.h: jsi.h
  60. grep -E '\<OP_' jsi.h | sed 's/^[^A-Z]*OP_/"/;s/,.*/",/' | tr A-Z a-z > $@
  61. UnicodeData.txt:
  62. curl -s -o $@ https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt
  63. utfdata.h: genucd.py UnicodeData.txt
  64. python3 genucd.py UnicodeData.txt >$@
  65. build/sanitize/mujs: main.c one.c $(SRCS) $(HDRS)
  66. @mkdir -p $(@D)
  67. $(CC) $(CFLAGS) -g -fsanitize=address -fno-omit-frame-pointer -o $@ main.c one.c -lm $(READLINE_CFLAGS) $(READLINE_LIBS)
  68. build/debug/libmujs.$(SO): one.c $(SRCS) $(HDRS)
  69. @mkdir -p $(@D)
  70. $(CC) $(CFLAGS) -g -fPIC -shared -o $@ one.c -lm
  71. build/debug/libmujs.o: one.c $(SRCS) $(HDRS)
  72. @mkdir -p $(@D)
  73. $(CC) $(CFLAGS) -g -c -o $@ one.c
  74. build/debug/libmujs.a: build/debug/libmujs.o
  75. $(AR) cr $@ $^
  76. build/debug/mujs: main.c build/debug/libmujs.o
  77. $(CC) $(CFLAGS) -g -o $@ $^ -lm $(READLINE_CFLAGS) $(READLINE_LIBS)
  78. build/debug/mujs-pp: pp.c build/debug/libmujs.o
  79. $(CC) $(CFLAGS) -g -o $@ $^ -lm
  80. build/release/libmujs.$(SO): one.c $(SRCS) $(HDRS)
  81. @mkdir -p $(@D)
  82. $(CC) $(CFLAGS) $(OPTIM) -fPIC -shared -o $@ one.c -lm
  83. build/release/libmujs.o: one.c $(SRCS) $(HDRS)
  84. @mkdir -p $(@D)
  85. $(CC) $(CFLAGS) $(OPTIM) -c -o $@ one.c
  86. build/release/libmujs.a: build/release/libmujs.o
  87. $(AR) cr $@ $^
  88. build/release/mujs: main.c build/release/libmujs.o
  89. $(CC) $(CFLAGS) $(OPTIM) -o $@ $^ -lm $(READLINE_CFLAGS) $(READLINE_LIBS)
  90. build/release/mujs-pp: pp.c build/release/libmujs.o
  91. $(CC) $(CFLAGS) $(OPTIM) -o $@ $^ -lm
  92. build/release/mujs.pc:
  93. @mkdir -p $(@D)
  94. echo > $@ Name: mujs
  95. echo >> $@ Description: MuJS embeddable Javascript interpreter
  96. echo >> $@ Version: $(VERSION)
  97. echo >> $@ Cflags: -I$(incdir)
  98. echo >> $@ Libs: -L$(libdir) -lmujs
  99. echo >> $@ Libs.private: -lm
  100. install-common: build/release/mujs build/release/mujs-pp build/release/mujs.pc
  101. install -d $(DESTDIR)$(incdir)
  102. install -d $(DESTDIR)$(libdir)
  103. install -d $(DESTDIR)$(libdir)/pkgconfig
  104. install -d $(DESTDIR)$(bindir)
  105. install -m 644 mujs.h $(DESTDIR)$(incdir)
  106. install -m 644 build/release/mujs.pc $(DESTDIR)$(libdir)/pkgconfig
  107. install -m 755 build/release/mujs $(DESTDIR)$(bindir)
  108. install -m 755 build/release/mujs-pp $(DESTDIR)$(bindir)
  109. install-static: install-common build/release/libmujs.a
  110. install -m 644 build/release/libmujs.a $(DESTDIR)$(libdir)
  111. install-shared: install-common build/release/libmujs.$(SO)
  112. install -m 755 build/release/libmujs.$(SO) $(DESTDIR)$(libdir)
  113. install: install-static
  114. uninstall:
  115. rm -f $(DESTDIR)$(bindir)/mujs
  116. rm -f $(DESTDIR)$(bindir)/mujs-pp
  117. rm -f $(DESTDIR)$(incdir)/mujs.h
  118. rm -f $(DESTDIR)$(libdir)/pkgconfig/mujs.pc
  119. rm -f $(DESTDIR)$(libdir)/libmujs.a
  120. rm -f $(DESTDIR)$(libdir)/libmujs.$(SO)
  121. tarball:
  122. git archive --format=zip --prefix=mujs-$(VERSION)/ HEAD > mujs-$(VERSION).zip
  123. git archive --format=tar --prefix=mujs-$(VERSION)/ HEAD | gzip > mujs-$(VERSION).tar.gz
  124. tags: $(SRCS) $(HDRS) main.c pp.c
  125. ctags $^
  126. clean:
  127. rm -rf build
  128. nuke: clean
  129. rm -f one.c astnames.h opnames.h
  130. sanitize: build/sanitize/mujs
  131. debug: build/debug/libmujs.a
  132. debug: build/debug/libmujs.$(SO)
  133. debug: build/debug/mujs
  134. debug: build/debug/mujs-pp
  135. release: build/release/mujs.pc
  136. release: build/release/libmujs.a
  137. release: build/release/libmujs.$(SO)
  138. release: build/release/mujs
  139. release: build/release/mujs-pp