pegjs/Makefile
David Majda adfeb87c82 Do not preprecess package.json
Before this commit, package.json in the project root directory was
preprocessed in order to insert correct version into it. This made it
invalid JSON and thus unusable for npm purposes.

This commit makes package.json a valid JSON by hardcoding the version
into it. I think that introducing this small duplicity is outweighted by
being able to use npm in project root directory. For example, it is now
possible to make the "npm test" command work and introduce Travis CI
integration.
2012-10-28 16:01:13 +01:00

143 lines
5.2 KiB
Makefile

# ===== Directories =====
SRC_DIR = src
BIN_DIR = bin
SPEC_DIR = spec
BENCHMARK_DIR = benchmark
EXAMPLES_DIR = examples
LIB_DIR = lib
DIST_DIR = dist
DIST_WEB_DIR = $(DIST_DIR)/web
DIST_NODE_DIR = $(DIST_DIR)/node
# ===== Files =====
PARSER_SRC_FILE = $(SRC_DIR)/parser.pegjs
PARSER_OUT_FILE = $(SRC_DIR)/parser.js
PEGJS_SRC_FILE = $(SRC_DIR)/peg.js
PEGJS_LIB_FILE = $(LIB_DIR)/peg.js
PEGJS_DIST_FILE_DEV = $(DIST_WEB_DIR)/peg-$(PEGJS_VERSION).js
PEGJS_DIST_FILE_MIN = $(DIST_WEB_DIR)/peg-$(PEGJS_VERSION).min.js
PACKAGE_JSON_FILE = package.json
CHANGELOG_FILE = CHANGELOG
LICENSE_FILE = LICENSE
README_FILE = README.md
VERSION_FILE = VERSION
# ===== Executables =====
JSHINT = jshint
UGLIFYJS = uglifyjs
JASMINE_NODE = jasmine-node
PEGJS = $(BIN_DIR)/pegjs
BENCHMARK_RUN = $(BENCHMARK_DIR)/run
# ===== Variables =====
PEGJS_VERSION = `cat $(VERSION_FILE)`
# ===== Preprocessor =====
# A simple preprocessor that recognizes two directives:
#
# @VERSION -- insert PEG.js version
# @include "<file>" -- include <file> here
#
# This could have been implemented many ways. I chose Perl because everyone will
# have it.
PREPROCESS=perl -e ' \
use strict; \
use warnings; \
\
use File::Basename; \
\
open(my $$f, "$(VERSION_FILE)") or die "Can\x27t open $(VERSION_FILE): $$!"; \
my $$PEGJS_VERSION = <$$f>; \
close($$f); \
chomp($$PEGJS_VERSION); \
\
sub preprocess { \
my $$file = shift; \
my $$output = ""; \
\
open(my $$f, $$file) or die "Can\x27t open $$file: $$!"; \
while(<$$f>) { \
s/\@VERSION/$$PEGJS_VERSION/g; \
\
if (/^\s*\/\/\s*\@include\s*"([^"]*)"\s*$$/) { \
$$output .= preprocess(dirname($$file) . "/" . $$1); \
next; \
} \
\
$$output .= $$_; \
} \
close($$f); \
\
return $$output; \
} \
\
print preprocess($$ARGV[0]); \
'
# ===== Targets =====
# Generate the grammar parser
parser:
$(PEGJS) --export-var PEG.parser $(PARSER_SRC_FILE) $(PARSER_OUT_FILE)
# Build the PEG.js library
build:
mkdir -p $(LIB_DIR)
$(PREPROCESS) $(PEGJS_SRC_FILE) > $(PEGJS_LIB_FILE)
# Remove built PEG.js library (created by "build")
clean:
rm -rf $(LIB_DIR)
# Prepare dstribution files
dist: build
# Web
mkdir -p $(DIST_WEB_DIR)
cp $(PEGJS_LIB_FILE) $(PEGJS_DIST_FILE_DEV)
$(UGLIFYJS) --ascii -o $(PEGJS_DIST_FILE_MIN) $(PEGJS_LIB_FILE)
# Node.js
mkdir -p $(DIST_NODE_DIR)
cp -r \
$(LIB_DIR) \
$(BIN_DIR) \
$(EXAMPLES_DIR) \
$(PACKAGE_JSON_FILE) \
$(CHANGELOG_FILE) \
$(LICENSE_FILE) \
$(README_FILE) \
$(VERSION_FILE) \
$(DIST_NODE_DIR)
# Remove distribution file (created by "dist")
distclean:
rm -rf $(DIST_DIR)
# Run the spec suite
spec: build
$(JASMINE_NODE) --verbose $(SPEC_DIR)
# Run the benchmark suite
benchmark: build
$(BENCHMARK_RUN)
# Run JSHint on the source
hint: build
$(JSHINT) \
`find $(SRC_DIR) -name '*.js'` \
`find $(SPEC_DIR) -name '*.js' -and -not -path '$(SPEC_DIR)/vendor/*'` \
$(BENCHMARK_DIR)/*.js \
$(BENCHMARK_RUN) \
$(PEGJS)
.PHONY: spec benchmark hint parser build clean dist distclean
.SILENT: spec benchmark hint parser build clean dist distclean