docs: function _getNodeCompiler(
    nodeFileDir,
    nodeConfigureArgs,
    nodeMakeArgs,
    nodeVCBuildArgs,
    complete,
    type,
  ) {
    var dir = _getFirstDirectory(nodeFileDir);
  
    // standard
    var executable = 'node.exe';
    var binary = 'node';
  
    // iojs specifics.
    if (framework === 'iojs') {
      executable = 'iojs.exe';
      binary = 'iojs';
    }
  
    if (dir) {
      if (isWin) {
        complete(null, {
          dir: dir,
          version: path.basename(nodeFileDir),
          releasePath: path.join(dir, 'Release', executable),
          make: function(next) {
            // create a new env with minimal impact on old one
            var newEnv = process.env;
  
            if (isPy !== 'python') {
              // add the dir of the suposed python exe to path
              newEnv.path = process.env.PATH + ';' + path.dirname(isPy);
            }
  
            if (!nodeVCBuildArgs || !nodeVCBuildArgs.length) {
              nodeVCBuildArgs = ['nosign']; // "release" is already the default config value in VCBuild.bat
            }
  
            // spawn a vcbuild process with our custom enviroment.
            var vcbuild = spawn('vcbuild.bat', nodeVCBuildArgs, {
              cwd: dir,
              env: newEnv,
            });
            vcbuild.stdout.pipe(process.stdout);
            vcbuild.stderr.pipe(process.stderr);
            vcbuild.on('close', function() {
              next();
            });
          },
        });
      } else {
        complete(null, {
          dir: dir,
          version: path.basename(nodeFileDir),
          releasePath: path.join(dir, 'out', 'Release', binary),
          make: function(next) {
            var cfg = './configure',
              configure;
  
            var conf = [cfg];
  
            /* add all nodeConfigureArgs to the ./configure argument array */
            conf = [conf].concat(nodeConfigureArgs);
  
            // should work for all use cases now.
            configure = spawn(isPy, conf, {
              cwd: dir.toString('ascii'),
            });
  
            // local function, move to top eventually
            function _loop(dir) {
              /* eventually try every python file */
              var pdir = fs.readdirSync(dir);
  
              pdir.forEach(function(v, i) {
                var stat = fs.statSync(dir + '/' + v);
                if (stat.isFile()) {
                  // only process Makefiles and .mk targets.
                  if (v !== 'Makefile' && path.extname(v) !== '.mk') {
                    return;
                  }
  
                  _log('patching ' + v);
  
                  /* patch the file */
                  var py = fs.readFileSync(dir + '/' + v, {
                    encoding: 'utf8',
                  });
                  py = py.replace(/([a-z]|\/)*python(\w|)/gm, isPy); // this is definently needed
                  fs.writeFileSync(dir + '/' + v, py, {
                    encoding: 'utf8',
                  }); // write to file
                } else if (stat.isDirectory()) {
                  // must be dir?
                  // skip tests because we don't need them here
                  if (v !== 'test') {
                    _loop(dir + '/' + v);
                  }
                }
              });
            }
  
            configure.stdout.pipe(process.stdout);
            configure.stderr.pipe(process.stderr);
  
            // on error
            configure.on('error', function(err) {
              console.log('Error:', err);
              console.log('');
              console.log('Details:');
              console.log('command =', isPy, cfg, conf_args || '');
              console.log('cwd =', dir);
  
              var configure_path = path.join(dir, 'configure');
              var contains_configure = fs.existsSync(configure_path);
  
              console.log(
                'cwd contains configure,',
                contains_configure ? colors.green('yes') : colors.red('no'),
              );
  
              var configure_size = fs.statSync(configure_path).size;
  
              console.log(
                'configure is non-zero size,',
                configure_size > 0 ? colors.green('yes') : colors.red('no'),
              );
  
              _log('error', 'failed to launch configure.');
              process.exit(1);
            });
  
            // when it's finished
            configure.on('close', function() {
              if (isPy !== 'python') {
                /**
                 * Originally I thought this only applied to io.js,
                 * however I soon found out this affects node.js,
                 * so it is now mainstream.
                 */
                _log('preparing python');
  
                // loop over depends
                _loop(dir);
              }
  
              if (nodeMakeArgs === undefined) {
                nodeMakeArgs = [];
              }
  
              var platformMake = 'make';
              if (os.platform().match(/bsd$/) != null) {
                platformMake = 'gmake';
              }
  
              var make = spawn(platformMake, nodeMakeArgs, {
                cwd: dir,
              });
              make.stdout.pipe(process.stdout);
              make.stderr.pipe(process.stderr);
              make.on('error', function(err) {
                console.log(err);
                _log('error', 'failed to run make.');
                process.exit(1);
              });
              make.on('close', function() {
                next();
              });
            });
          },
        });
      }
      return true;
    }
  
    return false;
  }