| @@ -0,0 +1,99 @@ | |||
| #!/usr/bin/env node | |||
| /* | |||
| erlccache — (c) 2010 Jan Lehnardt <jan@apache.org> | |||
| use instead of erlc and your builds will magically speed up | |||
| somebody needs to turn this into proper node code, or sh or whatever | |||
| MIT License | |||
| */ | |||
| // CUSTOMIZE HERE | |||
| var erlc = "/Users/jan/.local/bin/erlc"; | |||
| var dir = "/Users/jan/.erlccache/"; | |||
| // STOP CUSTOMIZING | |||
| var sys = require("sys"); | |||
| var child_process = require("child_process"); | |||
| var crypto = require("crypto"); | |||
| var fs = require("fs"); | |||
| var args = process.argv.slice(2).toString(); | |||
| var cmd = erlc + " " + args; | |||
| // execute a shell command | |||
| function exec(cmd, fun) { | |||
| fun = fun || function (error, stdout, stderr) { | |||
| sys.print("stdout: " + stdout); | |||
| sys.print("stderr: " + stderr); | |||
| if (error !== null) { | |||
| sys.puts("exec error: " + error); | |||
| } | |||
| }; | |||
| child_process.exec(cmd, fun); | |||
| } | |||
| // get the .erl file out of cmd | |||
| function erl_parse_file(cmd) { | |||
| var file = cmd.match(/[\w]+\.erl\s*/).toString(); | |||
| return file; | |||
| } | |||
| // find location of .beam file given the cmd | |||
| function erl_beamfile(cmd) { | |||
| return process.cwd() + "/" + erl_parse_file(cmd).replace(/.erl/, ".beam"); | |||
| } | |||
| // create a sha1 hex digest from the cmd .erl file | |||
| function cache_hash(cmd) { | |||
| var hash = crypto.createHash("sha1"); | |||
| var file = erl_parse_file(cmd); | |||
| hash.update(fs.readFileSync(file, "binary")); | |||
| return hash.digest("hex"); | |||
| } | |||
| // copy(from, to); -- synchronous | |||
| function cache_file_copy(from, to) { | |||
| fs.writeFileSync(to, fs.readFileSync(from, "binary"), "binary"); | |||
| } | |||
| // see if the filename in cmd is cached, if not compile and cache | |||
| function cache_hit(cmd) { | |||
| // make cache dir if it doesn't exist | |||
| try { | |||
| fs.statSync(dir); | |||
| } catch(e) { | |||
| fs.mkdirSync(dir, 0700); | |||
| } | |||
| // hash cmd | |||
| var hash = cache_hash(cmd); | |||
| try { | |||
| fs.statSync(dir + hash); | |||
| } catch(e) { | |||
| // compile | |||
| exec(cmd, function(error, stdout, stderr) { | |||
| if(!error) { | |||
| var beamfile = erl_beamfile(cmd); | |||
| // add beam file to dir + hash(cmd) | |||
| cache_file_copy(beamfile, dir + hash); | |||
| } | |||
| }); | |||
| return false; | |||
| } | |||
| return true | |||
| } | |||
| // copy the cached beamfile to the final destination as if erlc did it | |||
| function cache_copy(cmd) { | |||
| var beamfile = erl_beamfile(cmd); | |||
| var cachefile = dir + cache_hash(cmd); | |||
| cache_file_copy(cachefile, beamfile); | |||
| } | |||
| if(cache_hit(cmd)) { | |||
| cache_copy(cmd); | |||
| } | |||
| //done | |||