quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

Makefile (15297B)


      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 
     25 ifeq ($(shell uname -s),Darwin)
     26 CONFIG_DARWIN=y
     27 endif
     28 ifeq ($(shell uname -s),FreeBSD)
     29 CONFIG_FREEBSD=y
     30 endif
     31 # Windows cross compilation from Linux
     32 # May need to have libwinpthread*.dll alongside the executable
     33 # (On Ubuntu/Debian may be installed with mingw-w64-x86-64-dev
     34 # to /usr/x86_64-w64-mingw32/lib/libwinpthread-1.dll)
     35 #CONFIG_WIN32=y
     36 # use link time optimization (smaller and faster executables but slower build)
     37 #CONFIG_LTO=y
     38 # consider warnings as errors (for development)
     39 #CONFIG_WERROR=y
     40 # force 32 bit build on x86_64
     41 #CONFIG_M32=y
     42 # cosmopolitan build (see https://github.com/jart/cosmopolitan)
     43 #CONFIG_COSMO=y
     44 
     45 # installation directory
     46 PREFIX?=/usr/local
     47 
     48 # use the gprof profiler
     49 #CONFIG_PROFILE=y
     50 # use address sanitizer
     51 #CONFIG_ASAN=y
     52 # use memory sanitizer
     53 #CONFIG_MSAN=y
     54 # use UB sanitizer
     55 #CONFIG_UBSAN=y
     56 # use thread sanitizer
     57 #CONFIG_TSAN=y
     58 
     59 # TEST262 bootstrap config: commit id and shallow "since" parameter
     60 TEST262_COMMIT?=5c8206929d81b2d3d727ca6aac56c18358c8d790
     61 TEST262_SINCE?=2025-09-01
     62 
     63 OBJDIR=.obj
     64 
     65 ifdef CONFIG_ASAN
     66 OBJDIR:=$(OBJDIR)/asan
     67 endif
     68 ifdef CONFIG_MSAN
     69 OBJDIR:=$(OBJDIR)/msan
     70 endif
     71 ifdef CONFIG_UBSAN
     72 OBJDIR:=$(OBJDIR)/ubsan
     73 endif
     74 
     75 ifdef CONFIG_DARWIN
     76 # use clang instead of gcc
     77 CONFIG_CLANG=y
     78 CONFIG_DEFAULT_AR=y
     79 endif
     80 ifdef CONFIG_FREEBSD
     81 # use clang instead of gcc
     82 CONFIG_CLANG=y
     83 CONFIG_DEFAULT_AR=y
     84 CONFIG_LTO=
     85 endif
     86 
     87 ifdef CONFIG_WIN32
     88   ifdef CONFIG_M32
     89     CROSS_PREFIX?=i686-w64-mingw32-
     90   else
     91     CROSS_PREFIX?=x86_64-w64-mingw32-
     92   endif
     93   EXE=.exe
     94 else ifdef MSYSTEM
     95   CONFIG_WIN32=y
     96   CROSS_PREFIX?=
     97   EXE=.exe
     98 else
     99   CROSS_PREFIX?=
    100   EXE=
    101 endif
    102 
    103 ifdef CONFIG_CLANG
    104   HOST_CC=clang
    105   CC=$(CROSS_PREFIX)clang
    106   CFLAGS+=-g -Wall -MMD -MF $(OBJDIR)/$(@F).d
    107   CFLAGS += -Wextra
    108   CFLAGS += -Wno-sign-compare
    109   CFLAGS += -Wno-missing-field-initializers
    110   CFLAGS += -Wundef -Wuninitialized
    111   CFLAGS += -Wunused -Wno-unused-parameter
    112   CFLAGS += -Wwrite-strings
    113   CFLAGS += -Wchar-subscripts -funsigned-char
    114   CFLAGS += -MMD -MF $(OBJDIR)/$(@F).d
    115   ifdef CONFIG_DEFAULT_AR
    116     AR=$(CROSS_PREFIX)ar
    117   else
    118     ifdef CONFIG_LTO
    119       AR=$(CROSS_PREFIX)llvm-ar
    120     else
    121       AR=$(CROSS_PREFIX)ar
    122     endif
    123   endif
    124   LIB_FUZZING_ENGINE ?= "-fsanitize=fuzzer"
    125 else ifdef CONFIG_COSMO
    126   CONFIG_LTO=
    127   HOST_CC=gcc
    128   CC=cosmocc
    129   # cosmocc does not correct support -MF
    130   CFLAGS=-g -Wall #-MMD -MF $(OBJDIR)/$(@F).d
    131   CFLAGS += -Wno-array-bounds -Wno-format-truncation
    132   AR=cosmoar
    133 else
    134   HOST_CC=gcc
    135   CC=$(CROSS_PREFIX)gcc
    136   CFLAGS=-ggdb -fno-omit-frame-pointer -Wall -MMD -MF $(OBJDIR)/$(@F).d
    137   CFLAGS += -Wno-array-bounds -Wno-format-truncation -Wno-infinite-recursion
    138   ifdef CONFIG_LTO
    139     AR=$(CROSS_PREFIX)gcc-ar
    140   else
    141     AR=$(CROSS_PREFIX)ar
    142   endif
    143 endif
    144 STRIP?=$(CROSS_PREFIX)strip
    145 ifdef CONFIG_M32
    146 CFLAGS+=-msse2 -mfpmath=sse # use SSE math for correct FP rounding
    147 ifndef CONFIG_WIN32
    148 CFLAGS+=-m32
    149 LDFLAGS+=-m32
    150 endif
    151 endif
    152 CFLAGS+=-fwrapv # ensure that signed overflows behave as expected
    153 ifdef CONFIG_WERROR
    154 CFLAGS+=-Werror
    155 endif
    156 DEFINES:=-D_GNU_SOURCE -DCONFIG_VERSION=\"$(shell cat VERSION)\"
    157 ifdef CONFIG_WIN32
    158 DEFINES+=-D__USE_MINGW_ANSI_STDIO # for standard snprintf behavior
    159 endif
    160 ifndef CONFIG_WIN32
    161 ifeq ($(shell $(CC) -o /dev/null compat/test-closefrom.c 2>/dev/null && echo 1),1)
    162 DEFINES+=-DHAVE_CLOSEFROM
    163 endif
    164 endif
    165 
    166 CFLAGS+=$(DEFINES)
    167 CFLAGS_DEBUG=$(CFLAGS) -O0
    168 CFLAGS_SMALL=$(CFLAGS) -Os
    169 CFLAGS_OPT=$(CFLAGS) -O2
    170 CFLAGS_NOLTO:=$(CFLAGS_OPT)
    171 ifdef CONFIG_COSMO
    172 LDFLAGS+=-s # better to strip by default
    173 else
    174 LDFLAGS+=-g
    175 endif
    176 ifdef CONFIG_LTO
    177 CFLAGS_SMALL+=-flto
    178 CFLAGS_OPT+=-flto
    179 LDFLAGS+=-flto
    180 endif
    181 ifdef CONFIG_PROFILE
    182 CFLAGS+=-p
    183 LDFLAGS+=-p
    184 endif
    185 ifdef CONFIG_ASAN
    186 CFLAGS+=-fsanitize=address -fno-omit-frame-pointer
    187 LDFLAGS+=-fsanitize=address -fno-omit-frame-pointer
    188 endif
    189 ifdef CONFIG_MSAN
    190 CFLAGS+=-fsanitize=memory -fno-omit-frame-pointer
    191 LDFLAGS+=-fsanitize=memory -fno-omit-frame-pointer
    192 endif
    193 ifdef CONFIG_UBSAN
    194 CFLAGS+=-fsanitize=undefined -fno-omit-frame-pointer
    195 LDFLAGS+=-fsanitize=undefined -fno-omit-frame-pointer
    196 endif
    197 ifdef CONFIG_TSAN
    198 CFLAGS+=-fsanitize=thread -fno-omit-frame-pointer
    199 LDFLAGS+=-fsanitize=thread -fno-omit-frame-pointer
    200 endif
    201 ifdef CONFIG_WIN32
    202 LDEXPORT=
    203 else
    204 LDEXPORT=-rdynamic
    205 endif
    206 
    207 ifndef CONFIG_COSMO
    208 ifndef CONFIG_DARWIN
    209 ifndef CONFIG_WIN32
    210 CONFIG_SHARED_LIBS=y # building shared libraries is supported
    211 endif
    212 endif
    213 endif
    214 
    215 PROGS=qjs$(EXE) qjsc$(EXE) run-test262$(EXE)
    216 
    217 ifneq ($(CROSS_PREFIX),)
    218 QJSC_CC=gcc
    219 QJSC=./host-qjsc
    220 PROGS+=$(QJSC)
    221 else
    222 QJSC_CC=$(CC)
    223 QJSC=./qjsc$(EXE)
    224 endif
    225 PROGS+=libquickjs.a
    226 ifdef CONFIG_LTO
    227 PROGS+=libquickjs.lto.a
    228 endif
    229 
    230 # examples
    231 ifeq ($(CROSS_PREFIX),)
    232 ifndef CONFIG_ASAN
    233 ifndef CONFIG_MSAN
    234 ifndef CONFIG_UBSAN
    235 PROGS+=examples/hello examples/test_fib
    236 # no -m32 option in qjsc
    237 ifndef CONFIG_M32
    238 ifndef CONFIG_WIN32
    239 PROGS+=examples/hello_module
    240 endif
    241 endif
    242 ifdef CONFIG_SHARED_LIBS
    243 PROGS+=examples/fib.so examples/point.so
    244 endif
    245 endif
    246 endif
    247 endif
    248 endif
    249 
    250 all: $(OBJDIR) $(OBJDIR)/quickjs.check.o $(OBJDIR)/qjs.check.o $(PROGS)
    251 
    252 QJS_LIB_OBJS=$(OBJDIR)/quickjs.o $(OBJDIR)/dtoa.o $(OBJDIR)/libregexp.o $(OBJDIR)/libunicode.o $(OBJDIR)/cutils.o $(OBJDIR)/quickjs-libc.o
    253 
    254 QJS_OBJS=$(OBJDIR)/qjs.o $(OBJDIR)/repl.o $(QJS_LIB_OBJS)
    255 
    256 HOST_LIBS=-lm -ldl -lpthread -lcurl -lsodium -lmbedcrypto
    257 LIBS=-lm -lpthread -lcurl -lsodium -lmbedcrypto
    258 ifndef CONFIG_WIN32
    259 LIBS+=-ldl
    260 endif
    261 LIBS+=$(EXTRA_LIBS)
    262 
    263 $(OBJDIR):
    264 	mkdir -p $(OBJDIR) $(OBJDIR)/examples $(OBJDIR)/tests
    265 
    266 qjs$(EXE): $(QJS_OBJS)
    267 	$(CC) $(LDFLAGS) $(LDEXPORT) -o $@ $^ $(LIBS)
    268 
    269 qjs-debug$(EXE): $(patsubst %.o, %.debug.o, $(QJS_OBJS))
    270 	$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
    271 
    272 qjsc$(EXE): $(OBJDIR)/qjsc.o $(QJS_LIB_OBJS)
    273 	$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
    274 
    275 fuzz_eval: $(OBJDIR)/fuzz_eval.o $(OBJDIR)/fuzz_common.o libquickjs.fuzz.a
    276 	$(CC) $(CFLAGS_OPT) $^ -o fuzz_eval $(LIB_FUZZING_ENGINE)
    277 
    278 fuzz_compile: $(OBJDIR)/fuzz_compile.o $(OBJDIR)/fuzz_common.o libquickjs.fuzz.a
    279 	$(CC) $(CFLAGS_OPT) $^ -o fuzz_compile $(LIB_FUZZING_ENGINE)
    280 
    281 fuzz_regexp: $(OBJDIR)/fuzz_regexp.o $(OBJDIR)/libregexp.fuzz.o $(OBJDIR)/cutils.fuzz.o $(OBJDIR)/libunicode.fuzz.o
    282 	$(CC) $(CFLAGS_OPT) $^ -o fuzz_regexp $(LIB_FUZZING_ENGINE)
    283 
    284 libfuzzer: fuzz_eval fuzz_compile fuzz_regexp
    285 
    286 ifneq ($(CROSS_PREFIX),)
    287 
    288 $(QJSC): $(OBJDIR)/qjsc.host.o \
    289     $(patsubst %.o, %.host.o, $(QJS_LIB_OBJS))
    290 	$(HOST_CC) $(LDFLAGS) -o $@ $^ $(HOST_LIBS)
    291 
    292 endif #CROSS_PREFIX
    293 
    294 QJSC_DEFINES:=-DCONFIG_CC=\"$(QJSC_CC)\" -DCONFIG_PREFIX=\"$(PREFIX)\"
    295 ifdef CONFIG_LTO
    296 QJSC_DEFINES+=-DCONFIG_LTO
    297 endif
    298 QJSC_HOST_DEFINES:=-DCONFIG_CC=\"$(HOST_CC)\" -DCONFIG_PREFIX=\"$(PREFIX)\"
    299 
    300 $(OBJDIR)/qjsc.o: CFLAGS+=$(QJSC_DEFINES)
    301 $(OBJDIR)/qjsc.host.o: CFLAGS+=$(QJSC_HOST_DEFINES)
    302 
    303 ifdef CONFIG_LTO
    304 LTOEXT=.lto
    305 else
    306 LTOEXT=
    307 endif
    308 
    309 libquickjs$(LTOEXT).a: $(QJS_LIB_OBJS)
    310 	$(AR) rcs $@ $^
    311 
    312 ifdef CONFIG_LTO
    313 libquickjs.a: $(patsubst %.o, %.nolto.o, $(QJS_LIB_OBJS))
    314 	$(AR) rcs $@ $^
    315 endif # CONFIG_LTO
    316 
    317 libquickjs.fuzz.a: $(patsubst %.o, %.fuzz.o, $(QJS_LIB_OBJS))
    318 	$(AR) rcs $@ $^
    319 
    320 repl.c: $(QJSC) repl.js
    321 	$(QJSC) -s -c -o $@ -m repl.js
    322 
    323 ifneq ($(wildcard unicode/UnicodeData.txt),)
    324 $(OBJDIR)/libunicode.o $(OBJDIR)/libunicode.nolto.o: libunicode-table.h
    325 
    326 libunicode-table.h: unicode_gen
    327 	./unicode_gen unicode $@
    328 endif
    329 
    330 run-test262$(EXE): $(OBJDIR)/run-test262.o $(QJS_LIB_OBJS)
    331 	$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
    332 
    333 run-test262-debug: $(patsubst %.o, %.debug.o, $(OBJDIR)/run-test262.o $(QJS_LIB_OBJS))
    334 	$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
    335 
    336 # object suffix order: nolto
    337 
    338 $(OBJDIR)/%.o: %.c | $(OBJDIR)
    339 	$(CC) $(CFLAGS_OPT) -c -o $@ $<
    340 
    341 $(OBJDIR)/fuzz_%.o: fuzz/fuzz_%.c | $(OBJDIR)
    342 	$(CC) $(CFLAGS_OPT) -c -I. -o $@ $<
    343 
    344 $(OBJDIR)/%.host.o: %.c | $(OBJDIR)
    345 	$(HOST_CC) $(CFLAGS_OPT) -c -o $@ $<
    346 
    347 $(OBJDIR)/%.pic.o: %.c | $(OBJDIR)
    348 	$(CC) $(CFLAGS_OPT) -fPIC -DJS_SHARED_LIBRARY -c -o $@ $<
    349 
    350 $(OBJDIR)/%.nolto.o: %.c | $(OBJDIR)
    351 	$(CC) $(CFLAGS_NOLTO) -c -o $@ $<
    352 
    353 $(OBJDIR)/%.debug.o: %.c | $(OBJDIR)
    354 	$(CC) $(CFLAGS_DEBUG) -c -o $@ $<
    355 
    356 $(OBJDIR)/%.fuzz.o: %.c | $(OBJDIR)
    357 	$(CC) $(CFLAGS_OPT) -fsanitize=fuzzer-no-link -c -o $@ $<
    358 
    359 $(OBJDIR)/%.check.o: %.c | $(OBJDIR)
    360 	$(CC) $(CFLAGS) -DCONFIG_CHECK_JSVALUE -c -o $@ $<
    361 
    362 regexp_test: libregexp.c libunicode.c cutils.c
    363 	$(CC) $(LDFLAGS) $(CFLAGS) -DTEST -o $@ libregexp.c libunicode.c cutils.c $(LIBS)
    364 
    365 unicode_gen: $(OBJDIR)/unicode_gen.host.o $(OBJDIR)/cutils.host.o libunicode.c unicode_gen_def.h
    366 	$(HOST_CC) $(LDFLAGS) $(CFLAGS) -o $@ $(OBJDIR)/unicode_gen.host.o $(OBJDIR)/cutils.host.o
    367 
    368 clean:
    369 	rm -f repl.c out.c
    370 	rm -f *.a *.o *.d *~ unicode_gen regexp_test fuzz_eval fuzz_compile fuzz_regexp $(PROGS)
    371 	rm -f hello.c test_fib.c
    372 	rm -f examples/*.so tests/*.so
    373 	rm -rf $(OBJDIR)/ *.dSYM/ qjs-debug$(EXE)
    374 	rm -rf run-test262-debug$(EXE)
    375 	rm -f run_octane run_sunspider_like
    376 
    377 install: all
    378 	mkdir -p "$(DESTDIR)$(PREFIX)/bin"
    379 	$(STRIP) qjs$(EXE) qjsc$(EXE)
    380 	install -m755 qjs$(EXE) qjsc$(EXE) "$(DESTDIR)$(PREFIX)/bin"
    381 	mkdir -p "$(DESTDIR)$(PREFIX)/lib/quickjs"
    382 	install -m644 libquickjs.a "$(DESTDIR)$(PREFIX)/lib/quickjs"
    383 ifdef CONFIG_LTO
    384 	install -m644 libquickjs.lto.a "$(DESTDIR)$(PREFIX)/lib/quickjs"
    385 endif
    386 	mkdir -p "$(DESTDIR)$(PREFIX)/include/quickjs"
    387 	install -m644 quickjs.h quickjs-libc.h "$(DESTDIR)$(PREFIX)/include/quickjs"
    388 
    389 ###############################################################################
    390 # examples
    391 
    392 # example of static JS compilation
    393 HELLO_SRCS=examples/hello.js
    394 HELLO_OPTS=-fno-string-normalize -fno-map -fno-promise -fno-typedarray \
    395            -fno-typedarray -fno-regexp -fno-json -fno-eval -fno-proxy \
    396            -fno-date -fno-module-loader
    397 
    398 hello.c: $(QJSC) $(HELLO_SRCS)
    399 	$(QJSC) -e $(HELLO_OPTS) -o $@ $(HELLO_SRCS)
    400 
    401 examples/hello: $(OBJDIR)/hello.o $(QJS_LIB_OBJS)
    402 	$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
    403 
    404 # example of static JS compilation with modules
    405 HELLO_MODULE_SRCS=examples/hello_module.js
    406 HELLO_MODULE_OPTS=-fno-string-normalize -fno-map -fno-typedarray \
    407            -fno-typedarray -fno-regexp -fno-json -fno-eval -fno-proxy \
    408            -fno-date -m
    409 examples/hello_module: $(QJSC) libquickjs$(LTOEXT).a $(HELLO_MODULE_SRCS)
    410 	$(QJSC) $(HELLO_MODULE_OPTS) -o $@ $(HELLO_MODULE_SRCS)
    411 
    412 # use of an external C module (static compilation)
    413 
    414 test_fib.c: $(QJSC) examples/test_fib.js
    415 	$(QJSC) -e -M examples/fib.so,fib -m -o $@ examples/test_fib.js
    416 
    417 examples/test_fib: $(OBJDIR)/test_fib.o $(OBJDIR)/examples/fib.o libquickjs$(LTOEXT).a
    418 	$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
    419 
    420 examples/fib.so: $(OBJDIR)/examples/fib.pic.o
    421 	$(CC) $(LDFLAGS) -shared -o $@ $^
    422 
    423 examples/point.so: $(OBJDIR)/examples/point.pic.o
    424 	$(CC) $(LDFLAGS) -shared -o $@ $^
    425 
    426 ###############################################################################
    427 # documentation
    428 
    429 DOCS=doc/quickjs.pdf doc/quickjs.html
    430 
    431 build_doc: $(DOCS)
    432 
    433 clean_doc:
    434 	rm -f $(DOCS)
    435 
    436 doc/version.texi: VERSION
    437 	@echo "@set VERSION `cat $<`" > $@
    438 
    439 doc/%.pdf: doc/%.texi doc/version.texi
    440 	texi2pdf --clean -o $@ -q $<
    441 
    442 doc/%.html.pre: doc/%.texi doc/version.texi
    443 	makeinfo --html --no-headers --no-split --number-sections -o $@ $<
    444 
    445 doc/%.html: doc/%.html.pre
    446 	sed -e 's|</style>|</style>\n<meta name="viewport" content="width=device-width, initial-scale=1.0">|' < $< > $@
    447 
    448 ###############################################################################
    449 # tests
    450 
    451 ifdef CONFIG_SHARED_LIBS
    452 test: tests/bjson.so examples/point.so
    453 endif
    454 
    455 test: qjs$(EXE)
    456 	$(WINE) ./qjs$(EXE) tests/test_closure.js
    457 	$(WINE) ./qjs$(EXE) tests/test_language.js
    458 	$(WINE) ./qjs$(EXE) --std tests/test_builtin.js
    459 	$(WINE) ./qjs$(EXE) tests/test_loop.js
    460 	$(WINE) ./qjs$(EXE) tests/test_bigint.js
    461 	$(WINE) ./qjs$(EXE) tests/test_cyclic_import.js
    462 	$(WINE) ./qjs$(EXE) tests/test_worker.js
    463 ifndef CONFIG_WIN32
    464 	$(WINE) ./qjs$(EXE) tests/test_std.js
    465 	$(WINE) ./qjs$(EXE) tests/test_rw_handler.js
    466 endif
    467 ifdef CONFIG_SHARED_LIBS
    468 	$(WINE) ./qjs$(EXE) tests/test_bjson.js
    469 	$(WINE) ./qjs$(EXE) examples/test_point.js
    470 endif
    471 
    472 stats: qjs$(EXE)
    473 	$(WINE) ./qjs$(EXE) -qd
    474 
    475 microbench: qjs$(EXE)
    476 	$(WINE) ./qjs$(EXE) --std tests/microbench.js
    477 
    478 ifeq ($(wildcard test262/features.txt),)
    479 test2-bootstrap:
    480 	git clone --single-branch --shallow-since=$(TEST262_SINCE) https://github.com/tc39/test262.git
    481 	(cd test262 && git checkout -q $(TEST262_COMMIT) && patch -p1 < ../tests/test262.patch && cd ..)
    482 else
    483 test2-bootstrap:
    484 	(cd test262 && git fetch && git reset --hard $(TEST262_COMMIT) && patch -p1 < ../tests/test262.patch && cd ..)
    485 endif
    486 
    487 ifeq ($(wildcard test262o/tests.txt),)
    488 test2o test2o-update:
    489 	@echo test262o tests not installed
    490 else
    491 # ES5 tests (obsolete)
    492 test2o: run-test262
    493 	time ./run-test262 -t -m -c test262o.conf
    494 
    495 test2o-update: run-test262
    496 	./run-test262 -t -u -c test262o.conf -T 1
    497 endif
    498 
    499 ifeq ($(wildcard test262/features.txt),)
    500 test2 test2-update test2-default test2-check:
    501 	@echo test262 tests not installed
    502 else
    503 # Test262 tests
    504 test2-default: run-test262
    505 	time ./run-test262 -t -m -c test262.conf
    506 
    507 test2: run-test262
    508 	time ./run-test262 -t -m -c test262.conf -a
    509 
    510 test2-update: run-test262
    511 	./run-test262 -t -u -c test262.conf -a -T 1
    512 
    513 test2-check: run-test262
    514 	time ./run-test262 -t -m -c test262.conf -E -a
    515 endif
    516 
    517 testall: all test microbench test2o test2
    518 
    519 testall-complete: testall
    520 
    521 node-test:
    522 	node tests/test_closure.js
    523 	node tests/test_language.js
    524 	node tests/test_builtin.js
    525 	node tests/test_loop.js
    526 	node tests/test_bigint.js
    527 
    528 node-microbench:
    529 	node tests/microbench.js -s microbench-node.txt
    530 	node --jitless tests/microbench.js -s microbench-node-jitless.txt
    531 
    532 bench-v8: qjs
    533 	make -C tests/bench-v8
    534 	./qjs -d tests/bench-v8/combined.js
    535 
    536 node-bench-v8:
    537 	make -C tests/bench-v8
    538 	node --jitless tests/bench-v8/combined.js
    539 
    540 tests/bjson.so: $(OBJDIR)/tests/bjson.pic.o
    541 	$(CC) $(LDFLAGS) -shared -o $@ $^ $(LIBS)
    542 
    543 BENCHMARKDIR=../quickjs-benchmarks
    544 
    545 run_sunspider_like: $(BENCHMARKDIR)/run_sunspider_like.c
    546 	$(CC) $(CFLAGS) $(LDFLAGS) -DNO_INCLUDE_DIR -I. -o $@ $< libquickjs$(LTOEXT).a $(LIBS)
    547 
    548 run_octane: $(BENCHMARKDIR)/run_octane.c
    549 	$(CC) $(CFLAGS) $(LDFLAGS) -DNO_INCLUDE_DIR -I. -o $@ $< libquickjs$(LTOEXT).a $(LIBS)
    550 
    551 benchmarks: run_sunspider_like run_octane
    552 	./run_sunspider_like $(BENCHMARKDIR)/kraken-1.0/
    553 	./run_sunspider_like $(BENCHMARKDIR)/kraken-1.1/
    554 	./run_sunspider_like $(BENCHMARKDIR)/sunspider-1.0/
    555 	./run_octane $(BENCHMARKDIR)/
    556 
    557 -include $(wildcard $(OBJDIR)/*.d)