Makefile 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. #
  2. # QuickJS Javascript Engine
  3. #
  4. # Copyright (c) 2017-2021 Fabrice Bellard
  5. # Copyright (c) 2017-2021 Charlie Gordon
  6. #
  7. # Permission is hereby granted, free of charge, to any person obtaining a copy
  8. # of this software and associated documentation files (the "Software"), to deal
  9. # in the Software without restriction, including without limitation the rights
  10. # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. # copies of the Software, and to permit persons to whom the Software is
  12. # furnished to do so, subject to the following conditions:
  13. #
  14. # The above copyright notice and this permission notice shall be included in
  15. # all copies or substantial portions of the Software.
  16. #
  17. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  20. # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21. # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23. # THE SOFTWARE.
  24. ifeq ($(shell uname -s),Darwin)
  25. CONFIG_DARWIN=y
  26. endif
  27. ifeq ($(shell uname -s),FreeBSD)
  28. CONFIG_FREEBSD=y
  29. endif
  30. # Windows cross compilation from Linux
  31. # May need to have libwinpthread*.dll alongside the executable
  32. # (On Ubuntu/Debian may be installed with mingw-w64-x86-64-dev
  33. # to /usr/x86_64-w64-mingw32/lib/libwinpthread-1.dll)
  34. #CONFIG_WIN32=y
  35. # use link time optimization (smaller and faster executables but slower build)
  36. #CONFIG_LTO=y
  37. # consider warnings as errors (for development)
  38. #CONFIG_WERROR=y
  39. # force 32 bit build on x86_64
  40. #CONFIG_M32=y
  41. # cosmopolitan build (see https://github.com/jart/cosmopolitan)
  42. #CONFIG_COSMO=y
  43. # installation directory
  44. PREFIX?=/usr/local
  45. # use the gprof profiler
  46. #CONFIG_PROFILE=y
  47. # use address sanitizer
  48. #CONFIG_ASAN=y
  49. # use memory sanitizer
  50. #CONFIG_MSAN=y
  51. # use UB sanitizer
  52. #CONFIG_UBSAN=y
  53. # use thread sanitizer
  54. #CONFIG_TSAN=y
  55. # TEST262 bootstrap config: commit id and shallow "since" parameter
  56. TEST262_COMMIT?=5c8206929d81b2d3d727ca6aac56c18358c8d790
  57. TEST262_SINCE?=2025-09-01
  58. OBJDIR=.obj
  59. ifdef CONFIG_ASAN
  60. OBJDIR:=$(OBJDIR)/asan
  61. endif
  62. ifdef CONFIG_MSAN
  63. OBJDIR:=$(OBJDIR)/msan
  64. endif
  65. ifdef CONFIG_UBSAN
  66. OBJDIR:=$(OBJDIR)/ubsan
  67. endif
  68. ifdef CONFIG_DARWIN
  69. # use clang instead of gcc
  70. CONFIG_CLANG=y
  71. CONFIG_DEFAULT_AR=y
  72. endif
  73. ifdef CONFIG_FREEBSD
  74. # use clang instead of gcc
  75. CONFIG_CLANG=y
  76. CONFIG_DEFAULT_AR=y
  77. CONFIG_LTO=
  78. endif
  79. ifdef CONFIG_WIN32
  80. ifdef CONFIG_M32
  81. CROSS_PREFIX?=i686-w64-mingw32-
  82. else
  83. CROSS_PREFIX?=x86_64-w64-mingw32-
  84. endif
  85. EXE=.exe
  86. else ifdef MSYSTEM
  87. CONFIG_WIN32=y
  88. CROSS_PREFIX?=
  89. EXE=.exe
  90. else
  91. CROSS_PREFIX?=
  92. EXE=
  93. endif
  94. ifdef CONFIG_CLANG
  95. HOST_CC=clang
  96. CC=$(CROSS_PREFIX)clang
  97. CFLAGS+=-g -Wall -MMD -MF $(OBJDIR)/$(@F).d
  98. CFLAGS += -Wextra
  99. CFLAGS += -Wno-sign-compare
  100. CFLAGS += -Wno-missing-field-initializers
  101. CFLAGS += -Wundef -Wuninitialized
  102. CFLAGS += -Wunused -Wno-unused-parameter
  103. CFLAGS += -Wwrite-strings
  104. CFLAGS += -Wchar-subscripts -funsigned-char
  105. CFLAGS += -MMD -MF $(OBJDIR)/$(@F).d
  106. ifdef CONFIG_DEFAULT_AR
  107. AR=$(CROSS_PREFIX)ar
  108. else
  109. ifdef CONFIG_LTO
  110. AR=$(CROSS_PREFIX)llvm-ar
  111. else
  112. AR=$(CROSS_PREFIX)ar
  113. endif
  114. endif
  115. LIB_FUZZING_ENGINE ?= "-fsanitize=fuzzer"
  116. else ifdef CONFIG_COSMO
  117. CONFIG_LTO=
  118. HOST_CC=gcc
  119. CC=cosmocc
  120. # cosmocc does not correct support -MF
  121. CFLAGS=-g -Wall #-MMD -MF $(OBJDIR)/$(@F).d
  122. CFLAGS += -Wno-array-bounds -Wno-format-truncation
  123. AR=cosmoar
  124. else
  125. HOST_CC=gcc
  126. CC=$(CROSS_PREFIX)gcc
  127. CFLAGS+=-g -Wall -MMD -MF $(OBJDIR)/$(@F).d
  128. CFLAGS += -Wno-array-bounds -Wno-format-truncation -Wno-infinite-recursion
  129. ifdef CONFIG_LTO
  130. AR=$(CROSS_PREFIX)gcc-ar
  131. else
  132. AR=$(CROSS_PREFIX)ar
  133. endif
  134. endif
  135. STRIP?=$(CROSS_PREFIX)strip
  136. ifdef CONFIG_M32
  137. CFLAGS+=-msse2 -mfpmath=sse # use SSE math for correct FP rounding
  138. ifndef CONFIG_WIN32
  139. CFLAGS+=-m32
  140. LDFLAGS+=-m32
  141. endif
  142. endif
  143. CFLAGS+=-fwrapv # ensure that signed overflows behave as expected
  144. ifdef CONFIG_WERROR
  145. CFLAGS+=-Werror
  146. endif
  147. DEFINES:=-D_GNU_SOURCE -DCONFIG_VERSION=\"$(shell cat VERSION)\"
  148. ifdef CONFIG_WIN32
  149. DEFINES+=-D__USE_MINGW_ANSI_STDIO # for standard snprintf behavior
  150. endif
  151. ifndef CONFIG_WIN32
  152. ifeq ($(shell $(CC) -o /dev/null compat/test-closefrom.c 2>/dev/null && echo 1),1)
  153. DEFINES+=-DHAVE_CLOSEFROM
  154. endif
  155. endif
  156. CFLAGS+=$(DEFINES)
  157. CFLAGS_DEBUG=$(CFLAGS) -O0
  158. CFLAGS_SMALL=$(CFLAGS) -Os
  159. CFLAGS_OPT=$(CFLAGS) -O2
  160. CFLAGS_NOLTO:=$(CFLAGS_OPT)
  161. ifdef CONFIG_COSMO
  162. LDFLAGS+=-s # better to strip by default
  163. else
  164. LDFLAGS+=-g
  165. endif
  166. ifdef CONFIG_LTO
  167. CFLAGS_SMALL+=-flto
  168. CFLAGS_OPT+=-flto
  169. LDFLAGS+=-flto
  170. endif
  171. ifdef CONFIG_PROFILE
  172. CFLAGS+=-p
  173. LDFLAGS+=-p
  174. endif
  175. ifdef CONFIG_ASAN
  176. CFLAGS+=-fsanitize=address -fno-omit-frame-pointer
  177. LDFLAGS+=-fsanitize=address -fno-omit-frame-pointer
  178. endif
  179. ifdef CONFIG_MSAN
  180. CFLAGS+=-fsanitize=memory -fno-omit-frame-pointer
  181. LDFLAGS+=-fsanitize=memory -fno-omit-frame-pointer
  182. endif
  183. ifdef CONFIG_UBSAN
  184. CFLAGS+=-fsanitize=undefined -fno-omit-frame-pointer
  185. LDFLAGS+=-fsanitize=undefined -fno-omit-frame-pointer
  186. endif
  187. ifdef CONFIG_TSAN
  188. CFLAGS+=-fsanitize=thread -fno-omit-frame-pointer
  189. LDFLAGS+=-fsanitize=thread -fno-omit-frame-pointer
  190. endif
  191. ifdef CONFIG_WIN32
  192. LDEXPORT=
  193. else
  194. LDEXPORT=-rdynamic
  195. endif
  196. ifndef CONFIG_COSMO
  197. ifndef CONFIG_DARWIN
  198. ifndef CONFIG_WIN32
  199. CONFIG_SHARED_LIBS=y # building shared libraries is supported
  200. endif
  201. endif
  202. endif
  203. PROGS=qjs$(EXE) qjsc$(EXE) run-test262$(EXE)
  204. ifneq ($(CROSS_PREFIX),)
  205. QJSC_CC=gcc
  206. QJSC=./host-qjsc
  207. PROGS+=$(QJSC)
  208. else
  209. QJSC_CC=$(CC)
  210. QJSC=./qjsc$(EXE)
  211. endif
  212. PROGS+=libquickjs.a
  213. ifdef CONFIG_LTO
  214. PROGS+=libquickjs.lto.a
  215. endif
  216. # examples
  217. ifeq ($(CROSS_PREFIX),)
  218. ifndef CONFIG_ASAN
  219. ifndef CONFIG_MSAN
  220. ifndef CONFIG_UBSAN
  221. PROGS+=examples/hello examples/test_fib
  222. # no -m32 option in qjsc
  223. ifndef CONFIG_M32
  224. ifndef CONFIG_WIN32
  225. PROGS+=examples/hello_module
  226. endif
  227. endif
  228. ifdef CONFIG_SHARED_LIBS
  229. PROGS+=examples/fib.so examples/point.so
  230. endif
  231. endif
  232. endif
  233. endif
  234. endif
  235. all: $(OBJDIR) $(OBJDIR)/quickjs.check.o $(OBJDIR)/qjs.check.o $(PROGS)
  236. QJS_LIB_OBJS=$(OBJDIR)/quickjs.o $(OBJDIR)/dtoa.o $(OBJDIR)/libregexp.o $(OBJDIR)/libunicode.o $(OBJDIR)/cutils.o $(OBJDIR)/quickjs-libc.o
  237. QJS_OBJS=$(OBJDIR)/qjs.o $(OBJDIR)/repl.o $(QJS_LIB_OBJS)
  238. HOST_LIBS=-lm -ldl -lpthread
  239. LIBS=-lm -lpthread
  240. ifndef CONFIG_WIN32
  241. LIBS+=-ldl
  242. endif
  243. LIBS+=$(EXTRA_LIBS)
  244. $(OBJDIR):
  245. mkdir -p $(OBJDIR) $(OBJDIR)/examples $(OBJDIR)/tests
  246. qjs$(EXE): $(QJS_OBJS)
  247. $(CC) $(LDFLAGS) $(LDEXPORT) -o $@ $^ $(LIBS)
  248. qjs-debug$(EXE): $(patsubst %.o, %.debug.o, $(QJS_OBJS))
  249. $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
  250. qjsc$(EXE): $(OBJDIR)/qjsc.o $(QJS_LIB_OBJS)
  251. $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
  252. fuzz_eval: $(OBJDIR)/fuzz_eval.o $(OBJDIR)/fuzz_common.o libquickjs.fuzz.a
  253. $(CC) $(CFLAGS_OPT) $^ -o fuzz_eval $(LIB_FUZZING_ENGINE)
  254. fuzz_compile: $(OBJDIR)/fuzz_compile.o $(OBJDIR)/fuzz_common.o libquickjs.fuzz.a
  255. $(CC) $(CFLAGS_OPT) $^ -o fuzz_compile $(LIB_FUZZING_ENGINE)
  256. fuzz_regexp: $(OBJDIR)/fuzz_regexp.o $(OBJDIR)/libregexp.fuzz.o $(OBJDIR)/cutils.fuzz.o $(OBJDIR)/libunicode.fuzz.o
  257. $(CC) $(CFLAGS_OPT) $^ -o fuzz_regexp $(LIB_FUZZING_ENGINE)
  258. libfuzzer: fuzz_eval fuzz_compile fuzz_regexp
  259. ifneq ($(CROSS_PREFIX),)
  260. $(QJSC): $(OBJDIR)/qjsc.host.o \
  261. $(patsubst %.o, %.host.o, $(QJS_LIB_OBJS))
  262. $(HOST_CC) $(LDFLAGS) -o $@ $^ $(HOST_LIBS)
  263. endif #CROSS_PREFIX
  264. QJSC_DEFINES:=-DCONFIG_CC=\"$(QJSC_CC)\" -DCONFIG_PREFIX=\"$(PREFIX)\"
  265. ifdef CONFIG_LTO
  266. QJSC_DEFINES+=-DCONFIG_LTO
  267. endif
  268. QJSC_HOST_DEFINES:=-DCONFIG_CC=\"$(HOST_CC)\" -DCONFIG_PREFIX=\"$(PREFIX)\"
  269. $(OBJDIR)/qjsc.o: CFLAGS+=$(QJSC_DEFINES)
  270. $(OBJDIR)/qjsc.host.o: CFLAGS+=$(QJSC_HOST_DEFINES)
  271. ifdef CONFIG_LTO
  272. LTOEXT=.lto
  273. else
  274. LTOEXT=
  275. endif
  276. libquickjs$(LTOEXT).a: $(QJS_LIB_OBJS)
  277. $(AR) rcs $@ $^
  278. ifdef CONFIG_LTO
  279. libquickjs.a: $(patsubst %.o, %.nolto.o, $(QJS_LIB_OBJS))
  280. $(AR) rcs $@ $^
  281. endif # CONFIG_LTO
  282. libquickjs.fuzz.a: $(patsubst %.o, %.fuzz.o, $(QJS_LIB_OBJS))
  283. $(AR) rcs $@ $^
  284. repl.c: $(QJSC) repl.js
  285. $(QJSC) -s -c -o $@ -m repl.js
  286. ifneq ($(wildcard unicode/UnicodeData.txt),)
  287. $(OBJDIR)/libunicode.o $(OBJDIR)/libunicode.nolto.o: libunicode-table.h
  288. libunicode-table.h: unicode_gen
  289. ./unicode_gen unicode $@
  290. endif
  291. run-test262$(EXE): $(OBJDIR)/run-test262.o $(QJS_LIB_OBJS)
  292. $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
  293. run-test262-debug: $(patsubst %.o, %.debug.o, $(OBJDIR)/run-test262.o $(QJS_LIB_OBJS))
  294. $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
  295. # object suffix order: nolto
  296. $(OBJDIR)/%.o: %.c | $(OBJDIR)
  297. $(CC) $(CFLAGS_OPT) -c -o $@ $<
  298. $(OBJDIR)/fuzz_%.o: fuzz/fuzz_%.c | $(OBJDIR)
  299. $(CC) $(CFLAGS_OPT) -c -I. -o $@ $<
  300. $(OBJDIR)/%.host.o: %.c | $(OBJDIR)
  301. $(HOST_CC) $(CFLAGS_OPT) -c -o $@ $<
  302. $(OBJDIR)/%.pic.o: %.c | $(OBJDIR)
  303. $(CC) $(CFLAGS_OPT) -fPIC -DJS_SHARED_LIBRARY -c -o $@ $<
  304. $(OBJDIR)/%.nolto.o: %.c | $(OBJDIR)
  305. $(CC) $(CFLAGS_NOLTO) -c -o $@ $<
  306. $(OBJDIR)/%.debug.o: %.c | $(OBJDIR)
  307. $(CC) $(CFLAGS_DEBUG) -c -o $@ $<
  308. $(OBJDIR)/%.fuzz.o: %.c | $(OBJDIR)
  309. $(CC) $(CFLAGS_OPT) -fsanitize=fuzzer-no-link -c -o $@ $<
  310. $(OBJDIR)/%.check.o: %.c | $(OBJDIR)
  311. $(CC) $(CFLAGS) -DCONFIG_CHECK_JSVALUE -c -o $@ $<
  312. regexp_test: libregexp.c libunicode.c cutils.c
  313. $(CC) $(LDFLAGS) $(CFLAGS) -DTEST -o $@ libregexp.c libunicode.c cutils.c $(LIBS)
  314. unicode_gen: $(OBJDIR)/unicode_gen.host.o $(OBJDIR)/cutils.host.o libunicode.c unicode_gen_def.h
  315. $(HOST_CC) $(LDFLAGS) $(CFLAGS) -o $@ $(OBJDIR)/unicode_gen.host.o $(OBJDIR)/cutils.host.o
  316. clean:
  317. rm -f repl.c out.c
  318. rm -f *.a *.o *.d *~ unicode_gen regexp_test fuzz_eval fuzz_compile fuzz_regexp $(PROGS)
  319. rm -f hello.c test_fib.c
  320. rm -f examples/*.so tests/*.so
  321. rm -rf $(OBJDIR)/ *.dSYM/ qjs-debug$(EXE)
  322. rm -rf run-test262-debug$(EXE)
  323. rm -f run_octane run_sunspider_like
  324. install: all
  325. mkdir -p "$(DESTDIR)$(PREFIX)/bin"
  326. $(STRIP) qjs$(EXE) qjsc$(EXE)
  327. install -m755 qjs$(EXE) qjsc$(EXE) "$(DESTDIR)$(PREFIX)/bin"
  328. mkdir -p "$(DESTDIR)$(PREFIX)/lib/quickjs"
  329. install -m644 libquickjs.a "$(DESTDIR)$(PREFIX)/lib/quickjs"
  330. ifdef CONFIG_LTO
  331. install -m644 libquickjs.lto.a "$(DESTDIR)$(PREFIX)/lib/quickjs"
  332. endif
  333. mkdir -p "$(DESTDIR)$(PREFIX)/include/quickjs"
  334. install -m644 quickjs.h quickjs-libc.h "$(DESTDIR)$(PREFIX)/include/quickjs"
  335. ###############################################################################
  336. # examples
  337. # example of static JS compilation
  338. HELLO_SRCS=examples/hello.js
  339. HELLO_OPTS=-fno-string-normalize -fno-map -fno-promise -fno-typedarray \
  340. -fno-typedarray -fno-regexp -fno-json -fno-eval -fno-proxy \
  341. -fno-date -fno-module-loader
  342. hello.c: $(QJSC) $(HELLO_SRCS)
  343. $(QJSC) -e $(HELLO_OPTS) -o $@ $(HELLO_SRCS)
  344. examples/hello: $(OBJDIR)/hello.o $(QJS_LIB_OBJS)
  345. $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
  346. # example of static JS compilation with modules
  347. HELLO_MODULE_SRCS=examples/hello_module.js
  348. HELLO_MODULE_OPTS=-fno-string-normalize -fno-map -fno-typedarray \
  349. -fno-typedarray -fno-regexp -fno-json -fno-eval -fno-proxy \
  350. -fno-date -m
  351. examples/hello_module: $(QJSC) libquickjs$(LTOEXT).a $(HELLO_MODULE_SRCS)
  352. $(QJSC) $(HELLO_MODULE_OPTS) -o $@ $(HELLO_MODULE_SRCS)
  353. # use of an external C module (static compilation)
  354. test_fib.c: $(QJSC) examples/test_fib.js
  355. $(QJSC) -e -M examples/fib.so,fib -m -o $@ examples/test_fib.js
  356. examples/test_fib: $(OBJDIR)/test_fib.o $(OBJDIR)/examples/fib.o libquickjs$(LTOEXT).a
  357. $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
  358. examples/fib.so: $(OBJDIR)/examples/fib.pic.o
  359. $(CC) $(LDFLAGS) -shared -o $@ $^
  360. examples/point.so: $(OBJDIR)/examples/point.pic.o
  361. $(CC) $(LDFLAGS) -shared -o $@ $^
  362. ###############################################################################
  363. # documentation
  364. DOCS=doc/quickjs.pdf doc/quickjs.html
  365. build_doc: $(DOCS)
  366. clean_doc:
  367. rm -f $(DOCS)
  368. doc/version.texi: VERSION
  369. @echo "@set VERSION `cat $<`" > $@
  370. doc/%.pdf: doc/%.texi doc/version.texi
  371. texi2pdf --clean -o $@ -q $<
  372. doc/%.html.pre: doc/%.texi doc/version.texi
  373. makeinfo --html --no-headers --no-split --number-sections -o $@ $<
  374. doc/%.html: doc/%.html.pre
  375. sed -e 's|</style>|</style>\n<meta name="viewport" content="width=device-width, initial-scale=1.0">|' < $< > $@
  376. ###############################################################################
  377. # tests
  378. ifdef CONFIG_SHARED_LIBS
  379. test: tests/bjson.so examples/point.so
  380. endif
  381. test: qjs$(EXE)
  382. $(WINE) ./qjs$(EXE) tests/test_closure.js
  383. $(WINE) ./qjs$(EXE) tests/test_language.js
  384. $(WINE) ./qjs$(EXE) --std tests/test_builtin.js
  385. $(WINE) ./qjs$(EXE) tests/test_loop.js
  386. $(WINE) ./qjs$(EXE) tests/test_bigint.js
  387. $(WINE) ./qjs$(EXE) tests/test_cyclic_import.js
  388. $(WINE) ./qjs$(EXE) tests/test_worker.js
  389. ifndef CONFIG_WIN32
  390. $(WINE) ./qjs$(EXE) tests/test_std.js
  391. $(WINE) ./qjs$(EXE) tests/test_rw_handler.js
  392. endif
  393. ifdef CONFIG_SHARED_LIBS
  394. $(WINE) ./qjs$(EXE) tests/test_bjson.js
  395. $(WINE) ./qjs$(EXE) examples/test_point.js
  396. endif
  397. stats: qjs$(EXE)
  398. $(WINE) ./qjs$(EXE) -qd
  399. microbench: qjs$(EXE)
  400. $(WINE) ./qjs$(EXE) --std tests/microbench.js
  401. ifeq ($(wildcard test262/features.txt),)
  402. test2-bootstrap:
  403. git clone --single-branch --shallow-since=$(TEST262_SINCE) https://github.com/tc39/test262.git
  404. (cd test262 && git checkout -q $(TEST262_COMMIT) && patch -p1 < ../tests/test262.patch && cd ..)
  405. else
  406. test2-bootstrap:
  407. (cd test262 && git fetch && git reset --hard $(TEST262_COMMIT) && patch -p1 < ../tests/test262.patch && cd ..)
  408. endif
  409. ifeq ($(wildcard test262o/tests.txt),)
  410. test2o test2o-update:
  411. @echo test262o tests not installed
  412. else
  413. # ES5 tests (obsolete)
  414. test2o: run-test262
  415. time ./run-test262 -t -m -c test262o.conf
  416. test2o-update: run-test262
  417. ./run-test262 -t -u -c test262o.conf -T 1
  418. endif
  419. ifeq ($(wildcard test262/features.txt),)
  420. test2 test2-update test2-default test2-check:
  421. @echo test262 tests not installed
  422. else
  423. # Test262 tests
  424. test2-default: run-test262
  425. time ./run-test262 -t -m -c test262.conf
  426. test2: run-test262
  427. time ./run-test262 -t -m -c test262.conf -a
  428. test2-update: run-test262
  429. ./run-test262 -t -u -c test262.conf -a
  430. test2-check: run-test262
  431. time ./run-test262 -t -m -c test262.conf -E -a
  432. endif
  433. testall: all test microbench test2o test2
  434. testall-complete: testall
  435. node-test:
  436. node tests/test_closure.js
  437. node tests/test_language.js
  438. node tests/test_builtin.js
  439. node tests/test_loop.js
  440. node tests/test_bigint.js
  441. node-microbench:
  442. node tests/microbench.js -s microbench-node.txt
  443. node --jitless tests/microbench.js -s microbench-node-jitless.txt
  444. bench-v8: qjs
  445. make -C tests/bench-v8
  446. ./qjs -d tests/bench-v8/combined.js
  447. node-bench-v8:
  448. make -C tests/bench-v8
  449. node --jitless tests/bench-v8/combined.js
  450. tests/bjson.so: $(OBJDIR)/tests/bjson.pic.o
  451. $(CC) $(LDFLAGS) -shared -o $@ $^ $(LIBS)
  452. BENCHMARKDIR=../quickjs-benchmarks
  453. run_sunspider_like: $(BENCHMARKDIR)/run_sunspider_like.c
  454. $(CC) $(CFLAGS) $(LDFLAGS) -DNO_INCLUDE_DIR -I. -o $@ $< libquickjs$(LTOEXT).a $(LIBS)
  455. run_octane: $(BENCHMARKDIR)/run_octane.c
  456. $(CC) $(CFLAGS) $(LDFLAGS) -DNO_INCLUDE_DIR -I. -o $@ $< libquickjs$(LTOEXT).a $(LIBS)
  457. benchmarks: run_sunspider_like run_octane
  458. ./run_sunspider_like $(BENCHMARKDIR)/kraken-1.0/
  459. ./run_sunspider_like $(BENCHMARKDIR)/kraken-1.1/
  460. ./run_sunspider_like $(BENCHMARKDIR)/sunspider-1.0/
  461. ./run_octane $(BENCHMARKDIR)/
  462. -include $(wildcard $(OBJDIR)/*.d)