UNPKG

benbria-build

Version:

This is a tool for building projects using [Ninja](http://martine.github.io/ninja/). It assumes your project follows a certain layout.

332 lines (290 loc) 11.1 kB
// Generated by CoffeeScript 1.6.3 (function() { var collectCoffeeFiles, commander, config, edgeMapping, factories, findCommand, findLocalCommand, findScript, fp, fs, getOptionString, getOptions, glob, globule, ld, log, makeAssetEdges, makeCommonRules, makeFingerprintEdge, makeLintEdges, makeNinja, makeSimpleRule, makeSourceEdges, makeSystemEdges, ninjaBuilder, packageJson, path, simpleMapOpt, warnMessage, _ref; packageJson = require('../package.json'); ld = require('lodash'); commander = require('commander'); fs = require('fs'); path = require('path'); glob = require('glob'); globule = require('globule'); log = require('yadsil')('benbria-configure-ninja'); ninjaBuilder = require('ninja-build-gen'); factories = require('./ninjaFactories'); _ref = require('./ninjaCommands'), findCommand = _ref.findCommand, findLocalCommand = _ref.findLocalCommand, findScript = _ref.findScript; log.warn = log.warning; config = {}; config.ninjaFilePath = process.cwd(); config.ninjaFile = "build.ninja"; config.configureNinjaScript = __filename; config.streamlineVersion = 10; config.streamlineOpts = ""; config.stylusOpts = ""; fp = {}; fp.assets = 'assets'; fp.build = 'build'; fp.buildAssets = "" + fp.build + "/" + fp.assets; fp.coffeelint = "" + fp.build + "/coffeelint"; fp.fingerprintFile = "" + fp.buildAssets + "/release/fingerprints.json"; warnMessage = "# Auto-generated by `loop-configure-ninja`.\n"; makeSystemEdges = function(ninja, optionString, options) { ninja.assign('buildCoffee', findLocalCommand('coffee', config)); factories.forActiveFactory(config, log, function(factory) { if (factory.assignments) { log.debug("Generating assignments for " + factory.name); return factory.assignments(ninja, config); } }); ninja.assign('uglifyjs', findLocalCommand("uglifyjs", config)); ninja.rule('configure').run("" + (findCommand('loop-configure-ninja', config)) + optionString).description('CONFIGURE'); return ninja.edge(config.ninjaFile).using('configure').need([findCommand('loop-configure-ninja', config)]); }; makeSimpleRule = function(ninja, _arg) { var command, desc, display, name; name = _arg.name, command = _arg.command, display = _arg.display; desc = name.toUpperCase() + ' ' + (display != null ? display : '$in'); return ninja.rule(name).run(command).description(desc); }; makeCommonRules = function(ninja, options) { factories.forActiveFactory(config, log, function(factory) { if (factory.makeRules) { log.debug("Making rules for " + factory.name); return factory.makeRules(ninja, config); } }); makeSimpleRule(ninja, { name: 'copy', command: 'cp $in $out' }); return makeSimpleRule(ninja, { name: 'fingerprint', command: "$buildCoffee " + (findScript("fingerprint.coffee", config)) + " $cliOptions -b $basePath -o $out $in", display: '$basePath' }); }; edgeMapping = function(ninja, files, mappingOptions, callback) { return ld.map(globule.mapping(files, mappingOptions), function(match) { callback(ninja.edge(match.dest).from(match.src)); return match.dest; }); }; simpleMapOpt = function(srcBase, destBase, ext) { return { srcBase: srcBase, destBase: destBase, ext: ext, extDot: 'last' }; }; makeLintEdges = function(ninja, coffeeFiles) { var options; options = simpleMapOpt('.', '$builddir/coffeelint', '.coffeelint'); return edgeMapping(ninja, coffeeFiles, options, function(edge) { return edge.using('coffeelint').need(['.coffeelint']); }); }; makeAssetEdges = function(ninja) { var assetPaths, configName, configNames, fingerprintFile, _i, _len; assetPaths = {}; configNames = ['debug', 'release']; for (_i = 0, _len = configNames.length; _i < _len; _i++) { configName = configNames[_i]; log.debug("Making " + configName + " asset edges"); assetPaths[configName] = []; factories.forActiveFactory(config, log, function(factory) { var edges, mappingOptions, match, sourceFileNames, _j, _len1, _ref1, _results; if (factory.assetFiles && factory.makeAssetEdge) { log.debug(" " + factory.name); mappingOptions = simpleMapOpt(fp.assets, path.join(fp.buildAssets, configName), factory.targetExt || '.js'); sourceFileNames = globule.find(factory.assetFiles, mappingOptions); _ref1 = globule.mapping(sourceFileNames, mappingOptions); _results = []; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { match = _ref1[_j]; edges = factory.makeAssetEdge(ninja, match.src, match.dest, configName); _results.push(assetPaths[configName] = assetPaths[configName].concat(edges)); } return _results; } }); } ninja.edge('debug-assets').from(assetPaths.debug); if (assetPaths.release.length > 0) { log.debug("Making fingerprint edge for " + assetPaths.release.length + " release assets"); fingerprintFile = makeFingerprintEdge(ninja, assetPaths.release); return ninja.edge('release-assets').from(fingerprintFile); } else { return ninja.edge('release-assets'); } }; makeSourceEdges = function(ninja) { var destFiles; destFiles = []; log.debug("Making src edges"); factories.forActiveFactory(config, log, function(factory) { var edges, mappingOptions, match, sourceFileNames, _i, _len, _ref1, _results; if (factory.files && factory.makeSrcEdge) { log.debug(" " + factory.name); mappingOptions = simpleMapOpt('src', 'lib', factory.targetExt || '.js'); sourceFileNames = globule.find(factory.files, mappingOptions); _ref1 = globule.mapping(sourceFileNames, mappingOptions); _results = []; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { match = _ref1[_i]; edges = factory.makeSrcEdge(ninja, match.src, match.dest); _results.push(destFiles = destFiles.concat(edges)); } return _results; } }); return ninja.edge('lib').from(destFiles); }; makeFingerprintEdge = function(ninja, assetsEdges) { ninja.edge(fp.fingerprintFile).using('fingerprint').from(assetsEdges).assign('basePath', "" + fp.buildAssets + "/release"); return fp.fingerprintFile; }; collectCoffeeFiles = function(ext, options) { var coffeeFiles; log.info('looking for coffee script files..'); coffeeFiles = [].concat(glob.sync("src/**/*." + ext), glob.sync("assets/js/**/*." + ext), glob.sync("bin/**/*." + ext), glob.sync("Gruntfile." + ext)); log.info("found " + coffeeFiles.length + " " + ext + " scripts"); return coffeeFiles; }; makeNinja = function(options, done) { var files, ninja; ninja = ninjaBuilder('1.3', 'build'); factories.forEachFactory(function(factory) { return typeof factory.initialize === "function" ? factory.initialize(ninja, config, log) : void 0; }); ninja.header(warnMessage); if (options.ninjaColor) { ninja.assign('cliOptions', '--color'); } makeSystemEdges(ninja, getOptionString(options), options); makeCommonRules(ninja, options); if (!options.noLint) { files = collectCoffeeFiles('coffee', options).concat(collectCoffeeFiles('_coffee', options)); ninja.edge('lint').from(makeLintEdges(ninja, files)); } else { ninja.edge('lint'); } makeAssetEdges(ninja); makeSourceEdges(ninja); ninja.edge('debug').from(['debug-assets', 'lib']); ninja.edge('release').from(['release-assets', 'lib']); ninja.edge('all').from(['debug-assets', 'release-assets', 'lib']); ninja.byDefault('all'); return done(null, ninja); }; getOptionString = function(options) { var str; str = ''; if (options.noLint) { str += ' --no-lint'; } if (options.ninjaColor) { str += ' --ninja-color'; } if (options.streamline8) { str += ' --streamline8'; } if (options.streamlineOpts) { str += " --streamline-opts '" + options.streamlineOpts + "'"; } if (options.stylusOpts) { str += " --stylus-opts '" + options.stylusOpts + "'"; } if (options.require) { str += " --require '" + options.require + "'"; } return str; }; getOptions = function() { var ArgumentParser, options, parser; ArgumentParser = require('argparse').ArgumentParser; parser = new ArgumentParser({ version: packageJson.version, addHelp: true, description: "Generates a ninja.build file for a coffeescript project." }); parser.addArgument(['--require'], { help: "Comma delimited list of modules before building.", nargs: "?" }); parser.addArgument(['--verbose'], { help: "Verbose output", nargs: 0 }); parser.addArgument(['--no-lint'], { help: "Disable coffee linting.", dest: "noLint", nargs: 0 }); parser.addArgument(['--color'], { help: "Force color display out of a TTY.", nargs: 0 }); parser.addArgument(['--ninja-color'], { help: "Force color on ninja scripts.", dest: "ninjaColor", nargs: 0 }); parser.addArgument(['--streamline8'], { help: "Use streamline 0.8.x command line arguments (instead of 0.10.x)", nargs: 0 }); parser.addArgument(['--streamline-opts'], { help: "Extra options for streamline compilers", metavar: "opts", dest: "streamlineOpts", defaultValue: '' }); parser.addArgument(['--stylus-opts'], { help: "Extra options for stylus", metavar: "opts", dest: "stylusOpts", defaultValue: '' }); options = parser.parseArgs(process.argv.slice(2)); if (options.ninjaColor) { options.color = true; } log.verbose(options.verbose); if (options.color) { log.color(options.color); } if (log.color()) { options.ninjaColor = true; } return options; }; module.exports = function(configureNinjaScript) { var mod, options, _i, _len, _ref1; config.configureNinjaScript = configureNinjaScript; options = getOptions(); if (options.streamline8) { config.streamlineVersion = 8; } config.streamlineOpts = options.streamlineOpts; config.stylusOpts = options.stylusOpts; if (options.require) { _ref1 = options.require.split(','); for (_i = 0, _len = _ref1.length; _i < _len; _i++) { mod = _ref1[_i]; if (mod.indexOf('./') === 0) { mod = path.resolve(mod); } require(mod); } } return makeNinja(options, function(err, ninja) { var ninjaFile; if (err) { throw err; } ninjaFile = path.resolve(config.ninjaFilePath, config.ninjaFile); ninja.save(ninjaFile); return log.info("generated \'" + ninjaFile + "\' (" + ninja.ruleCount + " rules, " + ninja.edgeCount + " edges)"); }); }; }).call(this);