summaryrefslogtreecommitdiffstats
path: root/node_modules/node-sass/scripts/build.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/node-sass/scripts/build.js')
-rw-r--r--node_modules/node-sass/scripts/build.js155
1 files changed, 155 insertions, 0 deletions
diff --git a/node_modules/node-sass/scripts/build.js b/node_modules/node-sass/scripts/build.js
new file mode 100644
index 0000000..7bbba5e
--- /dev/null
+++ b/node_modules/node-sass/scripts/build.js
@@ -0,0 +1,155 @@
+/*!
+ * node-sass: scripts/build.js
+ */
+
+var fs = require('fs'),
+ mkdir = require('mkdirp'),
+ path = require('path'),
+ spawn = require('cross-spawn'),
+ sass = require('../lib/extensions');
+
+/**
+ * After build
+ *
+ * @param {Object} options
+ * @api private
+ */
+
+function afterBuild(options) {
+ var install = sass.getBinaryPath();
+ var target = path.join(__dirname, '..', 'build',
+ options.debug ? 'Debug' :
+ process.config.target_defaults
+ ? process.config.target_defaults.default_configuration
+ : 'Release',
+ 'binding.node');
+
+ mkdir(path.dirname(install), function(err) {
+ if (err && err.code !== 'EEXIST') {
+ console.error(err.message);
+ return;
+ }
+
+ fs.stat(target, function(err) {
+ if (err) {
+ console.error('Build succeeded but target not found');
+ return;
+ }
+
+ fs.rename(target, install, function(err) {
+ if (err) {
+ console.error(err.message);
+ return;
+ }
+
+ console.log('Installed to', install);
+ });
+ });
+ });
+}
+
+/**
+ * Build
+ *
+ * @param {Object} options
+ * @api private
+ */
+
+function build(options) {
+ var args = [require.resolve(path.join('node-gyp', 'bin', 'node-gyp.js')), 'rebuild', '--verbose'].concat(
+ ['libsass_ext', 'libsass_cflags', 'libsass_ldflags', 'libsass_library'].map(function(subject) {
+ return ['--', subject, '=', process.env[subject.toUpperCase()] || ''].join('');
+ })).concat(options.args);
+
+ console.log('Building:', [process.execPath].concat(args).join(' '));
+
+ var proc = spawn(process.execPath, args, {
+ stdio: [0, 1, 2]
+ });
+
+ proc.on('exit', function(errorCode) {
+ if (!errorCode) {
+ afterBuild(options);
+ return;
+ }
+
+ if (errorCode === 127 ) {
+ console.error('node-gyp not found!');
+ } else {
+ console.error('Build failed with error code:', errorCode);
+ }
+
+ process.exit(1);
+ });
+}
+
+/**
+ * Parse arguments
+ *
+ * @param {Array} args
+ * @api private
+ */
+
+function parseArgs(args) {
+ var options = {
+ arch: process.arch,
+ platform: process.platform,
+ force: process.env.npm_config_force === 'true',
+ };
+
+ options.args = args.filter(function(arg) {
+ if (arg === '-f' || arg === '--force') {
+ options.force = true;
+ return false;
+ } else if (arg.substring(0, 13) === '--target_arch') {
+ options.arch = arg.substring(14);
+ } else if (arg === '-d' || arg === '--debug') {
+ options.debug = true;
+ } else if (arg.substring(0, 13) === '--libsass_ext' && arg.substring(14) !== 'no') {
+ options.libsassExt = true;
+ }
+
+ return true;
+ });
+
+ return options;
+}
+
+/**
+ * Test for pre-built library
+ *
+ * @param {Object} options
+ * @api private
+ */
+
+function testBinary(options) {
+ if (options.force || process.env.SASS_FORCE_BUILD) {
+ return build(options);
+ }
+
+ if (!sass.hasBinary(sass.getBinaryPath())) {
+ return build(options);
+ }
+
+ console.log('Binary found at', sass.getBinaryPath());
+ console.log('Testing binary');
+
+ try {
+ require('../').renderSync({
+ data: 's { a: ss }'
+ });
+
+ console.log('Binary is fine');
+ } catch (e) {
+ console.log('Binary has a problem:', e);
+ console.log('Building the binary locally');
+
+ return build(options);
+ }
+}
+
+/**
+ * Apply arguments and run
+ */
+
+testBinary(parseArgs(process.argv.slice(2)));