Module: AntlrGemerator

Defined in:
lib/antlr-gemerator.rb,
lib/antlr-gemerator/version.rb,
lib/antlr-gemerator/template.rb

Defined Under Namespace

Classes: Template

Constant Summary collapse

VERSION =
'2.1.0'

Class Method Summary collapse

Class Method Details

.create(options) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/antlr-gemerator.rb', line 9

def create(options)
  root_dir = '.'
  lib_dir = File.join(root_dir, 'lib')
  ext_dir = File.join(root_dir, 'ext')

  # ANTLR does weird things if the grammar file isn't in the current
  # working directory
  grammars = options[:grammar].map do |g|
    local_g = File.join(root_dir, File.basename(g))
    FileUtils.cp(g, local_g)
    local_g
  end

  generator = Antlr4Native::Generator.new(
    grammar_files:      grammars,
    output_dir:         ext_dir,
    parser_root_method: options[:root]
  )

  bindings = {
    gem_name:            generator.gem_name,
    ext_name:            generator.ext_name,
    gem_namespace:       generator.capitalize(generator.parser_ns),
    gem_author_name:     options[:author],
    gem_author_email:    options[:email],
    gem_homepage:        options[:homepage] || '',
    gem_description:     options[:desc],
    grammar_files_array: grammars,
    root_method:         options[:root]
  }

  # root level files
  render 'gitignore.erb', File.join(root_dir, '.gitignore'), bindings
  render 'Gemfile.erb', File.join(root_dir, 'Gemfile'), bindings
  render 'gemspec.erb', File.join(root_dir, "#{bindings[:gem_name]}.gemspec"), bindings
  render 'Rakefile.erb', File.join(root_dir, 'Rakefile'), bindings

  # lib
  mkdir File.join(lib_dir, bindings[:gem_name])

  render 'entrypoint.rb.erb', File.join(lib_dir, "#{bindings[:gem_name]}.rb"), bindings
  render 'version.rb.erb', File.join(lib_dir, bindings[:gem_name], 'version.rb'), bindings

  # ext
  antlr_version = Antlr4Native::Generator::ANTLR_VERSION
  antlr_upstream_dir = File.join(ext_dir, bindings[:gem_name], 'antlr4-upstream')

  mkdir File.join(ext_dir, bindings[:gem_name])

  extension_dir = File.join(ext_dir, bindings[:gem_name])
  extconf_path = File.join(extension_dir, 'extconf.rb')
  render 'extconf.rb.erb', extconf_path, bindings

  run 'git init', root_dir

  # git is very stupid and won't let me pass a tag to git submodule add
  run "git submodule add https://github.com/antlr/antlr4 #{antlr_upstream_dir}", root_dir
  Dir.chdir(antlr_upstream_dir) { run "git checkout #{antlr_version}" }

  generator.generate

  bx 'bundle install', root_dir

  # build
  bx "ruby extconf.rb", extension_dir
  run "make -j #{Etc.nprocessors}", extension_dir
end