Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Replace Jakefile with Makefile

Doing scripting tasks in JavaScript is painful.
  • Loading branch information...
commit bc5abfef5ca01a64773eebd4b452a2e09eb2d876 1 parent ed45a18
@dmajda dmajda authored
Showing with 147 additions and 247 deletions.
  1. +0 −244 Jakefile
  2. +145 −0 Makefile
  3. +0 −1  package.json
  4. +2 −2 tools/impact
View
244 Jakefile
@@ -1,244 +0,0 @@
-var util = require("util");
-var fs = require("fs");
-var path = require("path");
-var childProcess = require("child_process");
-
-var PEGJS_VERSION = fs.readFileSync("VERSION", "utf8").trim();
-
-/* Relative paths are here because of use in |require|. */
-var SRC_DIR = "./src";
-var TEST_DIR = "./test";
-var BENCHMARK_DIR = "./benchmark";
-var LIB_DIR = "./lib";
-var BIN_DIR = "./bin";
-var EXAMPLES_DIR = "./examples";
-var DIST_DIR = "./dist";
-var DIST_WEB_DIR = "./dist/web";
-var DIST_NODE_DIR = "./dist/node";
-
-var SRC_FILES = fs.readdirSync(SRC_DIR).filter(function(file) {
- return /\.js$/.test(file);
-}).map(function(file) {
- return SRC_DIR + "/" + file;
-});
-
-var TEST_FILES = fs.readdirSync(TEST_DIR).filter(function(file) {
- return /-test\.js$/.test(file);
-}).map(function(file) {
- return TEST_DIR + "/" + file;
-});
-var TEST_HELPERS_FILE = TEST_DIR + "/helpers.js";
-var TEST_RUN_FILE = TEST_DIR + "/run";
-
-var BENCHMARK_BENCHMARKS_FILE = BENCHMARK_DIR + "/benchmarks.js";
-var BENCHMARK_RUNNER_FILE = BENCHMARK_DIR + "/runner.js";
-var BENCHMARK_INDEX_FILE = BENCHMARK_DIR + "/index.js";
-var BENCHMARK_RUN_FILE = BENCHMARK_DIR + "/run";
-
-var PEGJS = BIN_DIR + "/pegjs";
-
-var PEGJS_SRC_FILE = SRC_DIR + "/peg.js";
-var PEGJS_OUT_FILE = LIB_DIR + "/peg.js";
-
-var PEGJS_DIST_FILE = DIST_WEB_DIR + "/peg-" + PEGJS_VERSION + ".js"
-var PEGJS_DIST_MIN_FILE = DIST_WEB_DIR + "/peg-" + PEGJS_VERSION + ".min.js"
-
-var PARSER_SRC_FILE = SRC_DIR + "/parser.pegjs";
-var PARSER_OUT_FILE = SRC_DIR + "/parser.js";
-
-var JAKEFILE = "./Jakefile";
-
-function exitFailure() {
- process.exit(1);
-}
-
-function abort(message) {
- util.error(message);
- exitFailure();
-}
-
-function mkdirUnlessExists(dir) {
- try {
- fs.statSync(dir);
- } catch (e) {
- fs.mkdirSync(dir, 0755);
- }
-}
-
-function copyFile(src, dest) {
- fs.writeFileSync(dest, fs.readFileSync(src));
-}
-
-function copyDir(src, dest) {
- mkdirUnlessExists(dest);
-
- fs.readdirSync(src).every(function(file) {
- var srcFile = src + "/" + file;
- var destFile = dest + "/" + file;
-
- var stats = fs.statSync(srcFile);
- if (stats.isDirectory()) {
- copyDir(srcFile, destFile);
- } else {
- copyFile(srcFile, destFile);
- fs.chmodSync(destFile, stats.mode);
- }
-
- return true;
- });
-}
-
-function dirExists(dir) {
- try {
- var stats = fs.statSync(file);
- } catch (e) {
- return false;
- }
-
- return stats.isDirectory();
-}
-
-function removeDir(dir) {
- fs.readdirSync(dir).every(function(file) {
- var file = dir + "/" + file;
-
- var stats = fs.statSync(file);
- if (stats.isDirectory()) {
- removeDir(file);
- } else {
- fs.unlinkSync(file);
- }
-
- return true;
- });
-
- fs.rmdirSync(dir);
-}
-
-function preprocess(file) {
- var input = fs.readFileSync(file, "utf8").trim();
- return input.split("\n").map(function(line) {
- var matches = /^\s*\/\/\s*@include\s*"([^"]*)"\s*$/.exec(line);
- if (matches !== null) {
- var includedFile = SRC_DIR + "/" + matches[1];
-
- try {
- fs.statSync(includedFile);
- } catch (e) {
- abort("Included file \"" + includedFile + "\" does not exist.");
- }
-
- return preprocess(includedFile);
- } else {
- return line;
- }
- }).join("\n").replace(/@VERSION/g, PEGJS_VERSION);
-}
-
-desc("Generate the grammar parser");
-task("parser", [], function() {
- var PEG = require(PEGJS_OUT_FILE);
- var input = fs.readFileSync(PARSER_SRC_FILE, "utf8");
-
- try {
- var parser = PEG.buildParser(input);
- } catch (e) {
- if (e.line !== undefined && e.column !== undefined) {
- abort(e.line + ":" + e.column + ": " + e.message);
- } else {
- abort(e.message);
- }
- }
-
- fs.writeFileSync(PARSER_OUT_FILE, "PEG.parser = " + parser.toSource() + ";\n");
-});
-
-desc("Build the peg.js file");
-task("build", [], function() {
- mkdirUnlessExists(LIB_DIR);
- fs.writeFileSync(PEGJS_OUT_FILE, preprocess(PEGJS_SRC_FILE), "utf8");
-});
-
-desc("Remove built peg.js file (created by \"build\")");
-task("clean", [], function() {
- if (dirExists(LIB_DIR)) {
- removeDir(LIB_DIR);
- }
-});
-
-desc("Prepare the distribution files");
-task("dist", ["build"], function() {
- mkdirUnlessExists(DIST_DIR);
-
- /* Web */
-
- mkdirUnlessExists(DIST_WEB_DIR);
-
- copyFile(PEGJS_OUT_FILE, PEGJS_DIST_FILE);
-
- var process = childProcess.spawn(
- "uglifyjs",
- ["--ascii", "-o", PEGJS_DIST_MIN_FILE, PEGJS_OUT_FILE],
- { customFds: [0, 1, 2] }
- );
- process.on("exit", function() { complete(); });
-
- /* Node.js */
-
- mkdirUnlessExists(DIST_NODE_DIR);
-
- copyDir(LIB_DIR, DIST_NODE_DIR + "/lib");
- copyDir(BIN_DIR, DIST_NODE_DIR + "/bin");
- copyDir(EXAMPLES_DIR, DIST_NODE_DIR + "/examples");
-
- copyFile("CHANGELOG", DIST_NODE_DIR + "/CHANGELOG");
- copyFile("LICENSE", DIST_NODE_DIR + "/LICENSE");
- copyFile("README.md", DIST_NODE_DIR + "/README.md");
- copyFile("VERSION", DIST_NODE_DIR + "/VERSION");
-
- fs.writeFileSync(DIST_NODE_DIR + "/package.json", preprocess("package.json"), "utf8");
-}, true);
-
-desc("Remove the distribution files (created by \"dist\")");
-task("distclean", [], function() {
- if (dirExists(DIST_DIR)) {
- removeDir(DIST_DIR);
- }
-});
-
-desc("Run the test suite");
-task("test", ["build"], function() {
- var process = childProcess.spawn("test/run", [], { customFds: [0, 1, 2] });
- process.on("exit", function() { complete(); });
-}, true);
-
-desc("Run the benchmark suite");
-task("benchmark", ["build"], function(runCount) {
- var process = childProcess.spawn(
- "benchmark/run",
- runCount !== undefined ? [runCount] : [],
- { customFds: [0, 1, 2] }
- );
- process.on("exit", function() { complete(); });
-}, true);
-
-desc("Run JSHint");
-task("hint", ["build"], function() {
- var process = childProcess.spawn(
- "jshint",
- SRC_FILES.concat(TEST_FILES).concat([
- TEST_HELPERS_FILE,
- TEST_RUN_FILE,
- BENCHMARK_BENCHMARKS_FILE,
- BENCHMARK_RUNNER_FILE,
- BENCHMARK_INDEX_FILE,
- BENCHMARK_RUN_FILE,
- PEGJS,
- JAKEFILE
- ]),
- { customFds: [0, 1, 2] }
- );
- process.on("exit", function() { complete(); });
-}, true);
-
-task("default", ["build"], function() {});
View
145 Makefile
@@ -0,0 +1,145 @@
+# ===== Directories =====
+
+SRC_DIR = src
+BIN_DIR = bin
+TEST_DIR = test
+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
+
+PACKAGE_JSON_SRC_FILE = package.json
+PACKAGE_JSON_DIST_FILE = $(DIST_NODE_DIR)/package.json
+
+PEGJS_DIST_FILE_DEV = $(DIST_WEB_DIR)/peg-$(PEGJS_VERSION).js
+PEGJS_DIST_FILE_MIN = $(DIST_WEB_DIR)/peg-$(PEGJS_VERSION).min.js
+
+CHANGELOG_FILE = CHANGELOG
+LICENSE_FILE = LICENSE
+README_FILE = README.md
+VERSION_FILE = VERSION
+
+# ===== Executables =====
+
+JSHINT = jshint
+UGLIFYJS = uglifyjs
+PEGJS = $(BIN_DIR)/pegjs
+TEST_RUN = $(TEST_DIR)/run
+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) \
+ $(CHANGELOG_FILE) \
+ $(LICENSE_FILE) \
+ $(README_FILE) \
+ $(VERSION_FILE) \
+ $(DIST_NODE_DIR)
+ $(PREPROCESS) $(PACKAGE_JSON_SRC_FILE) > $(PACKAGE_JSON_DIST_FILE)
+
+# Remove distribution file (created by "dist")
+distclean:
+ rm -rf $(DIST_DIR)
+
+# Run the test suite
+test: build
+ $(TEST_RUN)
+
+# Run the benchmark suite
+benchmark: build
+ $(BENCHMARK_RUN)
+
+# Run JSHint on the source
+hint: build
+ $(JSHINT) \
+ $(SRC_DIR)/*.js \
+ $(TEST_DIR)/*.js \
+ $(TEST_RUN) \
+ $(BENCHMARK_DIR)/*.js \
+ $(BENCHMARK_RUN) \
+ $(PEGJS)
+
+.PHONY: test benchmark hint parser build clean dist distclean
+.SILENT: test benchmark hint parser build clean dist distclean
View
1  package.json
@@ -15,7 +15,6 @@
"url": "http://github.com/dmajda/pegjs.git"
},
"devDependencies": {
- "jake": ">= 0.1.22",
"uglify-js": ">= 1.2.4",
"jshint": ">= 0.5.5"
},
View
4 tools/impact
@@ -9,11 +9,11 @@ set -e
prepare() {
git checkout --quiet "$1"
- jake build
+ make build
}
run_benchmark() {
- echo $(jake benchmark | awk 'BEGIN { FS = " *│ *" } /Total/ { split($5, a, " "); print a[1] }')
+ echo $(make benchmark | awk 'BEGIN { FS = " *│ *" } /Total/ { split($5, a, " "); print a[1] }')
}
measure_speed() {
Please sign in to comment.
Something went wrong with that request. Please try again.