Skip to content

Commit b4fe9dd

Browse files
authored
Merge pull request #1213 from natalie-lang/yarp
Integrate YARP
2 parents b28c199 + 4e9ccf8 commit b4fe9dd

32 files changed

+31234
-337
lines changed

.gitmodules

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
[submodule "ext/onigmo"]
22
path = ext/onigmo
33
url = https://github.com/k-takata/Onigmo.git
4-
[submodule "ext/natalie_parser"]
5-
path = ext/natalie_parser
6-
url = https://github.com/natalie-lang/natalie_parser
74
[submodule "ext/tm"]
85
path = ext/tm
96
url = https://github.com/seven1m/tm
107
[submodule "ext/zlib"]
118
path = ext/zlib
129
url = https://github.com/madler/zlib
10+
[submodule "ext/yarp"]
11+
path = ext/yarp
12+
url = https://github.com/ruby/yarp

Rakefile

Lines changed: 62 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ task default: :build
44

55
DEFAULT_BUILD_TYPE = 'debug'.freeze
66
SO_EXT = RUBY_PLATFORM =~ /darwin/ ? 'bundle' : 'so'
7+
SO_EXT2 = RUBY_PLATFORM =~ /darwin/ ? 'dylib' : 'so'
78
SRC_DIRECTORIES = Dir.new('src').children.select { |p| File.directory?(File.join('src', p)) }
89

910
desc 'Build Natalie'
@@ -13,12 +14,12 @@ task :build do
1314
end
1415

1516
desc 'Build Natalie with no optimization and all warnings (default)'
16-
task build_debug: %i[set_build_debug libnatalie parser_c_ext ctags] do
17+
task build_debug: %i[set_build_debug libnatalie yarp_c_ext ctags] do
1718
puts 'Build mode: debug'
1819
end
1920

2021
desc 'Build Natalie with release optimizations enabled and warnings off'
21-
task build_release: %i[set_build_release libnatalie parser_c_ext] do
22+
task build_release: %i[set_build_release libnatalie yarp_c_ext] do
2223
puts 'Build mode: release'
2324
end
2425

@@ -32,10 +33,6 @@ task :clean do
3233
rm_rf 'build/generated'
3334
rm_rf 'build/libnatalie_base.a'
3435
rm_rf "build/libnatalie_base.#{SO_EXT}"
35-
rm_rf 'build/natalie_parser'
36-
rm_rf 'build/libnatalie_parser.a'
37-
rm_rf "build/natalie_parser.#{SO_EXT}"
38-
rm_rf 'build/natalie_parser.bundle'
3936
rm_rf Rake::FileList['build/*.o']
4037
end
4138

@@ -96,8 +93,8 @@ end
9693
desc 'Build the self-hosted version of Natalie at bin/nat'
9794
task bootstrap: [:build, 'bin/nat']
9895

99-
desc 'Build MRI C Extension for the Natalie Parser'
100-
task parser_c_ext: ["build/natalie_parser.#{SO_EXT}", "build/libnatalie_parser.#{SO_EXT}"]
96+
desc 'Build MRI C Extension for YARP'
97+
task yarp_c_ext: ["build/librubyparser.#{SO_EXT2}", "build/yarp/ext/yarp/yarp.#{SO_EXT}"]
10198

10299
desc 'Show line counts for the project'
103100
task :cloc do
@@ -134,6 +131,38 @@ task tidy: %i[build tidy_internal]
134131
desc 'Lint GC visiting code'
135132
task gc_lint: %i[build gc_lint_internal]
136133

134+
YARP_TEMPLATED_SOURCES = [
135+
'ext/yarp/api_node.c',
136+
'src/token_type.c',
137+
'src/serialize.c',
138+
'src/node.c',
139+
'src/prettyprint.c',
140+
'lib/yarp/node.rb',
141+
'lib/yarp/serialize.rb',
142+
'lib/yarp/mutation_visitor.rb',
143+
'include/yarp/ast.h',
144+
].freeze
145+
146+
desc 'Generate YARP sources from templates (do this when updating YARP)'
147+
task :yarp_templated_sources do
148+
build_dir = File.expand_path('build/yarp', __dir__)
149+
rm_rf build_dir
150+
cp_r 'ext/yarp', build_dir
151+
sh <<-END
152+
cd #{build_dir} && \
153+
bundle install && \
154+
rake templates
155+
END
156+
gen_dir = File.join(__dir__, 'ext/yarp-generated')
157+
rm_rf gen_dir
158+
YARP_TEMPLATED_SOURCES.each do |src|
159+
full_dest = File.join(gen_dir, src)
160+
dir = File.split(full_dest).first
161+
mkdir_p dir unless File.exist?(dir)
162+
cp File.join(build_dir, src), full_dest
163+
end
164+
end
165+
137166
# # # # Docker Tasks (used for CI) # # # #
138167

139168
DOCKER_FLAGS =
@@ -256,7 +285,8 @@ task libnatalie: [
256285
:build_dir,
257286
'build/zlib/libz.a',
258287
'build/onigmo/lib/libonigmo.a',
259-
'build/libnatalie_parser.a',
288+
'build/librubyparser.a',
289+
"build/librubyparser.#{SO_EXT2}",
260290
'build/generated/numbers.rb',
261291
:primary_objects,
262292
:ruby_objects,
@@ -275,7 +305,6 @@ multitask ruby_objects: RUBY_OBJECT_FILES
275305
multitask special_objects: SPECIAL_OBJECT_FILES
276306

277307
file 'build/libnatalie.a' => %w[
278-
build/libnatalie_parser.a
279308
build/libnatalie_base.a
280309
build/onigmo/lib/libonigmo.a
281310
] do |t|
@@ -322,17 +351,6 @@ file 'build/zlib/libz.a' do
322351
SH
323352
end
324353

325-
file 'build/libnatalie_parser.a' => Rake::FileList['ext/natalie_parser/**/*.{hpp,cpp}'] do
326-
build_dir = File.expand_path('build/natalie_parser', __dir__)
327-
rm_rf build_dir
328-
cp_r 'ext/natalie_parser', build_dir
329-
sh <<-SH
330-
cd #{build_dir} && \
331-
BUILD=release rake library && \
332-
cp #{build_dir}/build/libnatalie_parser.a #{File.expand_path('build', __dir__)}
333-
SH
334-
end
335-
336354
file 'build/generated/numbers.rb' do |t|
337355
f1 = Tempfile.new(%w[numbers .cpp])
338356
f2 = Tempfile.create('numbers')
@@ -380,10 +398,6 @@ rule '.c.o' => 'src/%n' do |t|
380398
sh "#{cc} -g -fPIC -c -o #{t.name} #{t.source}"
381399
end
382400

383-
rule %r{natalie_parser/.*\.cpp\.o$} => ['src/natalie_parser/%n'] + HEADERS do |t|
384-
sh "#{cxx} #{cxx_flags.join(' ')} -std=#{STANDARD} -c -o #{t.name} #{t.source}"
385-
end
386-
387401
rule '.cpp.o' => ['src/%{build/,}X'] + HEADERS do |t|
388402
subdir = File.split(t.name).first
389403
mkdir_p subdir unless File.exist?(subdir)
@@ -394,27 +408,38 @@ rule '.rb.o' => ['.rb.cpp'] + HEADERS do |t|
394408
sh "#{cxx} #{cxx_flags.join(' ')} -std=#{STANDARD} -c -o #{t.name} #{t.source}"
395409
end
396410

397-
rule '.rb.cpp' => ['src/%{build\/generated/,}X', "build/natalie_parser.#{SO_EXT}"] do |t|
411+
rule '.rb.cpp' => ['src/%{build\/generated/,}X'] do |t|
398412
subdir = File.split(t.name).first
399413
mkdir_p subdir unless File.exist?(subdir)
400414
sh "bin/natalie --write-obj #{t.name} #{t.source}"
401415
end
402416

403-
file "build/natalie_parser.#{SO_EXT}" => 'build/libnatalie_parser.a' do
404-
build_dir = File.expand_path('build/natalie_parser', __dir__)
417+
file "build/librubyparser.#{SO_EXT2}" => ['build/librubyparser.a']
418+
419+
file 'build/librubyparser.a' => ["build/yarp/ext/yarp/yarp.#{SO_EXT}"] do
420+
build_dir = File.expand_path('build/yarp', __dir__)
421+
cp "#{build_dir}/build/librubyparser.a", File.expand_path('build', __dir__)
422+
cp "#{build_dir}/build/librubyparser.#{SO_EXT2}", File.expand_path('build', __dir__)
423+
end
424+
425+
file "build/yarp/ext/yarp/yarp.#{SO_EXT}" => Rake::FileList['ext/yarp/**/*.{h,c,rb}'] do
426+
build_dir = File.expand_path('build/yarp', __dir__)
427+
rm_rf build_dir
428+
cp_r 'ext/yarp', build_dir
429+
Rake::FileList['ext/yarp-generated/**/*.{rb,c,h}'].each do |path|
430+
dest = File.join(build_dir, path.sub(%r{^ext/yarp-generated}, ''))
431+
cp path, dest
432+
end
433+
File.write(File.join(build_dir, 'rakelib/test.rake'), '') # disable this task since it tries to load ruby_memcheck
405434
sh <<-SH
406435
cd #{build_dir} && \
407-
rake parser_c_ext && \
408-
cp #{build_dir}/ext/natalie_parser/natalie_parser.#{SO_EXT} #{File.expand_path('build', __dir__)}
436+
make && \
437+
cd ext/yarp && \
438+
ruby extconf.rb && \
439+
make
409440
SH
410441
end
411442

412-
# FIXME: should we rename to libnatalie_parser in the NatalieParser project?
413-
file "build/libnatalie_parser.#{SO_EXT}" => "build/natalie_parser.#{SO_EXT}" do |t|
414-
build_dir = File.expand_path('build/natalie_parser', __dir__)
415-
sh "cp #{build_dir}/ext/natalie_parser/natalie_parser.#{SO_EXT} #{File.expand_path('build', __dir__)}/libnatalie_parser.#{SO_EXT}"
416-
end
417-
418443
task :tidy_internal do
419444
sh "clang-tidy --warnings-as-errors='*' #{PRIMARY_SOURCES.exclude('src/dtoa.c')}"
420445
end
@@ -479,6 +504,6 @@ def include_paths
479504
File.expand_path('ext/tm/include', __dir__),
480505
File.expand_path('build', __dir__),
481506
File.expand_path('build/onigmo/include', __dir__),
482-
File.expand_path('build/natalie_parser/include', __dir__),
507+
File.expand_path('build/yarp/include', __dir__),
483508
]
484509
end

ext/natalie_parser

Lines changed: 0 additions & 1 deletion
This file was deleted.

ext/yarp

Submodule yarp added at 1ba8243

0 commit comments

Comments
 (0)