| @@ -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 | |||||