aboutsummaryrefslogtreecommitdiff
path: root/ruby/Rakefile
blob: f1c5bc8c553850d99b3e2e08aa463ae3e910075d (plain) (blame)
1
2
3
4
5
6
7
8
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
require "rubygems"
require "rubygems/package_task"
require "rake/extensiontask" unless RUBY_PLATFORM == "java"
require "rake/testtask"

spec = Gem::Specification.load("google-protobuf.gemspec")

well_known_protos = %w[
  google/protobuf/any.proto
  google/protobuf/api.proto
  google/protobuf/duration.proto
  google/protobuf/empty.proto
  google/protobuf/field_mask.proto
  google/protobuf/source_context.proto
  google/protobuf/struct.proto
  google/protobuf/timestamp.proto
  google/protobuf/type.proto
  google/protobuf/wrappers.proto
]

# These are omitted for now because we don't support proto2.
proto2_protos = %w[
  google/protobuf/descriptor.proto
  google/protobuf/compiler/plugin.proto
]

genproto_output = []

# We won't have access to .. from within docker, but the proto files
# will be there, thanks to the :genproto rule dependency for gem:native.
unless ENV['IN_DOCKER'] == 'true'
  well_known_protos.each do |proto_file|
    input_file = "../src/" + proto_file
    output_file = "lib/" + proto_file.sub(/\.proto$/, "_pb.rb")
    genproto_output << output_file
    file output_file => input_file do |file_task|
      sh "../src/protoc -I../src --ruby_out=lib #{input_file}"
    end
  end
end

if RUBY_PLATFORM == "java"
  if `which mvn` == ''
    raise ArgumentError, "maven needs to be installed"
  end
  task :clean do
    system("mvn --batch-mode clean")
  end

  task :compile do
    system("mvn --batch-mode package")
  end
else
  Rake::ExtensionTask.new("protobuf_c", spec) do |ext|
    unless RUBY_PLATFORM =~ /darwin/
      # TODO: also set "no_native to true" for mac if possible. As is,
      # "no_native" can only be set if the RUBY_PLATFORM doing
      # cross-compilation is contained in the "ext.cross_platform" array.
      ext.no_native = true
    end
    ext.ext_dir = "ext/google/protobuf_c"
    ext.lib_dir = "lib/google"
    ext.cross_compile = true
    ext.cross_platform = [
      'x86-mingw32', 'x64-mingw32',
      'x86_64-linux', 'x86-linux',
      'universal-darwin'
    ]
  end

  task 'gem:windows' do
    require 'rake_compiler_dock'
    RakeCompilerDock.sh "bundle && IN_DOCKER=true rake cross native gem RUBY_CC_VERSION=2.5.0:2.4.0:2.3.0:2.2.2:2.1.6:2.0.0"
  end

  if RUBY_PLATFORM =~ /darwin/
    task 'gem:native' do
      system "rake genproto"
      system "rake cross native gem RUBY_CC_VERSION=2.5.0:2.4.0:2.3.0:2.2.2:2.1.6:2.0.0"
    end
  else
    task 'gem:native' => [:genproto, 'gem:windows']
  end
end


# Proto for tests.
genproto_output << "tests/generated_code.rb"
genproto_output << "tests/generated_code_proto2.rb"
genproto_output << "tests/test_import.rb"
genproto_output << "tests/test_import_proto2.rb"
genproto_output << "tests/test_ruby_package.rb"
genproto_output << "tests/test_ruby_package_proto2.rb"
genproto_output << "tests/basic_test.rb"
genproto_output << "tests/basic_test_proto2.rb"
file "tests/generated_code.rb" => "tests/generated_code.proto" do |file_task|
  sh "../src/protoc --ruby_out=. tests/generated_code.proto"
end

file "tests/generated_code_proto2.rb" => "tests/generated_code_proto2.proto" do |file_task|
  sh "../src/protoc --ruby_out=. tests/generated_code_proto2.proto"
end

file "tests/test_import.rb" => "tests/test_import.proto" do |file_task|
  sh "../src/protoc --ruby_out=. tests/test_import.proto"
end

file "tests/test_import_proto2.rb" => "tests/test_import_proto2.proto" do |file_task|
  sh "../src/protoc --ruby_out=. tests/test_import_proto2.proto"
end

file "tests/test_ruby_package.rb" => "tests/test_ruby_package.proto" do |file_task|
  sh "../src/protoc --ruby_out=. tests/test_ruby_package.proto"
end

file "tests/test_ruby_package_proto2.rb" => "tests/test_ruby_package_proto2.proto" do |file_task|
  sh "../src/protoc --ruby_out=. tests/test_ruby_package_proto2.proto"
end

file "tests/basic_test.rb" => "tests/basic_test.proto" do |file_task|
  sh "../src/protoc --ruby_out=. tests/basic_test.proto"
end

file "tests/basic_test_proto2.rb" => "tests/basic_test_proto2.proto" do |file_task|
  sh "../src/protoc --ruby_out=. tests/basic_test_proto2.proto"
end

task :genproto => genproto_output

task :clean do
  sh "rm -f #{genproto_output.join(' ')}"
end

Gem::PackageTask.new(spec) do |pkg|
end

Rake::TestTask.new(:test => :build) do |t|
  t.test_files = FileList["tests/*.rb"].exclude("tests/gc_test.rb", "tests/common_tests.rb")
end

# gc_test needs to be split out to ensure the generated file hasn't been
# imported by other tests.
Rake::TestTask.new(:gc_test => :build) do |t|
  t.test_files = FileList["tests/gc_test.rb"]
end

task :build => [:clean, :compile, :genproto]
task :default => [:build]

# vim:sw=2:et