code: function eaccesFallback (err) {
      var noretry = '--node_gyp_internal_noretry'
      if (-1 !== argv.indexOf(noretry)) return cb(err)
      var tmpdir = os.tmpdir()
      gyp.devDir = path.resolve(tmpdir, '.node-gyp')
      log.warn('EACCES', 'user "%s" does not have permission to access the dev dir "%s"', os.userInfo().username, devDir)
      log.warn('EACCES', 'attempting to reinstall using temporary dev dir "%s"', gyp.devDir)
      if (process.cwd() == tmpdir) {
        log.verbose('tmpdir == cwd', 'automatically will remove dev files after to save disk space')
        gyp.todo.push({ name: 'remove', args: argv })
      }
      gyp.commands.install([noretry].concat(argv), cb)
    }
docs: The EACCES fallback is a workaround for npm's `sudo` behavior, where
  it drops the permissions before invoking any child processes (like
  node-gyp). So what happens is the "nobody" user doesn't have
  permission to create the dev dir. As a fallback, make the tmpdir() be
  the dev dir for this installation. This is not ideal, but at least
  the compilation will succeed...