lib/bootsnap/setup.rb



require_relative '../bootsnap'

env = ENV['RAILS_ENV'] || ENV['RACK_ENV'] || ENV['ENV']
development_mode = ['', nil, 'development'].include?(env)

# only enable on 'ruby' (MRI), POSIX (darin, linux, *bsd), and >= 2.3.0
enable_cc = \
  RUBY_ENGINE == 'ruby' && \
  RUBY_PLATFORM =~ /darwin|linux|bsd/ && \
  RUBY_VERSION                    # "1.9.3"
    .split('.')                   # ["1", "9", "3"]
    .map(&:to_i)                  # [1, 9, 3]
    .zip([2, 3, -1])              # [[1, 2], [9, 3], [3, -1]]
    .map { |a, b| a <=> b }       # [-1, 1, 1]
    .detect { |e| !e.zero? }      # -1
    .==(1)                        # false

cache_dir = ENV['BOOTSNAP_CACHE_DIR']
unless cache_dir
  config_dir_frame = caller.detect do |line|
    line.include?('/config/')
  end

  unless config_dir_frame
    $stderr.puts "[bootsnap/setup] couldn't infer cache directory! Either:"
    $stderr.puts "[bootsnap/setup]   1. require bootsnap/setup from your application's config directory; or"
    $stderr.puts "[bootsnap/setup]   2. Define the environment variable BOOTSNAP_CACHE_DIR"

    raise "couldn't infer bootsnap cache directory"
  end

  path = config_dir_frame.split(/:\d+:/).first
  path = File.dirname(path) until File.basename(path) == 'config'
  app_root = File.dirname(path)

  cache_dir = File.join(app_root, 'tmp', 'cache')
end

Bootsnap.setup(
  cache_dir:            cache_dir,
  development_mode:     development_mode,
  load_path_cache:      true,
  autoload_paths_cache: true, # assume rails. open to PRs to impl. detection
  disable_trace:        false,
  compile_cache_iseq:   enable_cc,
  compile_cache_yaml:   enable_cc
)