959f20f6e2
This will allow to use ES2015 constructs in benchmark code. The change required introducing a small server, which serves both PEG.js and benchmark code passed through Babel and bundled together. This allowed to convert the benchmark to regular modules and to get rid of the hackery that was previously needed to make it run both in Node.js and in the browser. Note the benchmark no longer exercises the browser version. See #442.
117 lines
4.1 KiB
Makefile
117 lines
4.1 KiB
Makefile
# ===== Variables =====
|
|
|
|
PEGJS_VERSION = `cat $(VERSION_FILE)`
|
|
|
|
# ===== Directories =====
|
|
|
|
SRC_DIR = src
|
|
LIB_DIR = lib
|
|
BIN_DIR = bin
|
|
BROWSER_DIR = browser
|
|
SPEC_DIR = spec
|
|
BENCHMARK_DIR = benchmark
|
|
NODE_MODULES_DIR = node_modules
|
|
NODE_MODULES_BIN_DIR = $(NODE_MODULES_DIR)/.bin
|
|
|
|
# ===== Files =====
|
|
|
|
MAIN_FILE = $(LIB_DIR)/peg.js
|
|
|
|
PARSER_SRC_FILE = $(SRC_DIR)/parser.pegjs
|
|
PARSER_OUT_FILE = $(LIB_DIR)/parser.js
|
|
PARSER_OUT_FILE_NEW = $(LIB_DIR)/parser.js.new
|
|
|
|
BROWSER_FILE_DEV = $(BROWSER_DIR)/peg-$(PEGJS_VERSION).js
|
|
BROWSER_FILE_MIN = $(BROWSER_DIR)/peg-$(PEGJS_VERSION).min.js
|
|
|
|
SPEC_SERVER_FILE = $(SPEC_DIR)/server
|
|
BENCHMARK_SERVER_FILE = $(BENCHMARK_DIR)/server
|
|
|
|
VERSION_FILE = VERSION
|
|
|
|
# ===== Executables =====
|
|
|
|
ESLINT = $(NODE_MODULES_BIN_DIR)/eslint
|
|
BROWSERIFY = $(NODE_MODULES_BIN_DIR)/browserify
|
|
UGLIFYJS = $(NODE_MODULES_BIN_DIR)/uglifyjs
|
|
JASMINE_NODE = $(NODE_MODULES_BIN_DIR)/jasmine-node
|
|
PEGJS = $(BIN_DIR)/pegjs
|
|
BENCHMARK_RUN = $(BENCHMARK_DIR)/run
|
|
|
|
# ===== Targets =====
|
|
|
|
# Default target
|
|
all: browser
|
|
|
|
# Generate the grammar parser
|
|
parser:
|
|
# We need to prepend ESLint header to the generated parser file because we
|
|
# don't want the various unused variables there to get reported. This is a bit
|
|
# tricky because the file is used when generating its own new version, which
|
|
# means we can't start writing the header there until we call $(PEGJS).
|
|
|
|
$(PEGJS) -o $(PARSER_OUT_FILE_NEW) $(PARSER_SRC_FILE)
|
|
|
|
rm -f $(PARSER_OUT_FILE)
|
|
|
|
echo '/* eslint-env node, amd */' >> $(PARSER_OUT_FILE)
|
|
echo '/* eslint no-unused-vars: 0 */' >> $(PARSER_OUT_FILE)
|
|
echo >> $(PARSER_OUT_FILE)
|
|
cat $(PARSER_OUT_FILE_NEW) >> $(PARSER_OUT_FILE)
|
|
|
|
rm $(PARSER_OUT_FILE_NEW)
|
|
|
|
# Build the browser version of the library
|
|
browser:
|
|
mkdir -p $(BROWSER_DIR)
|
|
|
|
rm -f $(BROWSER_FILE_DEV)
|
|
rm -f $(BROWSER_FILE_MIN)
|
|
|
|
echo '/*' >> $(BROWSER_FILE_DEV)
|
|
echo " * PEG.js $(PEGJS_VERSION)" >> $(BROWSER_FILE_DEV)
|
|
echo ' *' >> $(BROWSER_FILE_DEV)
|
|
echo ' * http://pegjs.org/' >> $(BROWSER_FILE_DEV)
|
|
echo ' *' >> $(BROWSER_FILE_DEV)
|
|
echo ' * Copyright (c) 2010-2016 David Majda' >> $(BROWSER_FILE_DEV)
|
|
echo ' * Licensed under the MIT license.' >> $(BROWSER_FILE_DEV)
|
|
echo ' */' >> $(BROWSER_FILE_DEV)
|
|
|
|
$(BROWSERIFY) \
|
|
--standalone peg \
|
|
--transform [ babelify --presets [ es2015 ] --compact false ] \
|
|
$(MAIN_FILE) >> $(BROWSER_FILE_DEV)
|
|
|
|
$(UGLIFYJS) \
|
|
--mangle \
|
|
--compress warnings=false \
|
|
--comments /Copyright/ \
|
|
-o $(BROWSER_FILE_MIN) \
|
|
$(BROWSER_FILE_DEV)
|
|
|
|
# Remove browser version of the library (created by "browser")
|
|
browserclean:
|
|
rm -rf $(BROWSER_DIR)
|
|
|
|
# Run the spec suite
|
|
spec:
|
|
$(JASMINE_NODE) --verbose $(SPEC_DIR)
|
|
|
|
# Run the benchmark suite
|
|
benchmark:
|
|
$(BENCHMARK_RUN)
|
|
|
|
# Run ESLint on the source
|
|
lint:
|
|
$(ESLINT) \
|
|
`find $(LIB_DIR) -name '*.js'` \
|
|
`find $(SPEC_DIR) -name '*.js' -and -not -path '$(SPEC_DIR)/vendor/*'` \
|
|
$(SPEC_SERVER_FILE) \
|
|
$(BENCHMARK_DIR)/*.js \
|
|
$(BENCHMARK_RUN) \
|
|
$(BENCHMARK_SERVER_FILE) \
|
|
$(PEGJS)
|
|
|
|
.PHONY: all parser browser browserclean spec benchmark lint
|
|
.SILENT: all parser browser browserclean spec benchmark lint
|