@@ -4,6 +4,7 @@ task default: :build
4
4
5
5
DEFAULT_BUILD_TYPE = 'debug' . freeze
6
6
SO_EXT = RUBY_PLATFORM =~ /darwin/ ? 'bundle' : 'so'
7
+ SO_EXT2 = RUBY_PLATFORM =~ /darwin/ ? 'dylib' : 'so'
7
8
SRC_DIRECTORIES = Dir . new ( 'src' ) . children . select { |p | File . directory? ( File . join ( 'src' , p ) ) }
8
9
9
10
desc 'Build Natalie'
@@ -13,12 +14,12 @@ task :build do
13
14
end
14
15
15
16
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
17
18
puts 'Build mode: debug'
18
19
end
19
20
20
21
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
22
23
puts 'Build mode: release'
23
24
end
24
25
@@ -32,10 +33,6 @@ task :clean do
32
33
rm_rf 'build/generated'
33
34
rm_rf 'build/libnatalie_base.a'
34
35
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'
39
36
rm_rf Rake ::FileList [ 'build/*.o' ]
40
37
end
41
38
96
93
desc 'Build the self-hosted version of Natalie at bin/nat'
97
94
task bootstrap : [ :build , 'bin/nat' ]
98
95
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 } " ]
101
98
102
99
desc 'Show line counts for the project'
103
100
task :cloc do
@@ -134,6 +131,38 @@ task tidy: %i[build tidy_internal]
134
131
desc 'Lint GC visiting code'
135
132
task gc_lint : %i[ build gc_lint_internal ]
136
133
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
+
137
166
# # # # Docker Tasks (used for CI) # # # #
138
167
139
168
DOCKER_FLAGS =
@@ -256,7 +285,8 @@ task libnatalie: [
256
285
:build_dir ,
257
286
'build/zlib/libz.a' ,
258
287
'build/onigmo/lib/libonigmo.a' ,
259
- 'build/libnatalie_parser.a' ,
288
+ 'build/librubyparser.a' ,
289
+ "build/librubyparser.#{ SO_EXT2 } " ,
260
290
'build/generated/numbers.rb' ,
261
291
:primary_objects ,
262
292
:ruby_objects ,
@@ -275,7 +305,6 @@ multitask ruby_objects: RUBY_OBJECT_FILES
275
305
multitask special_objects : SPECIAL_OBJECT_FILES
276
306
277
307
file 'build/libnatalie.a' => %w[
278
- build/libnatalie_parser.a
279
308
build/libnatalie_base.a
280
309
build/onigmo/lib/libonigmo.a
281
310
] do |t |
@@ -322,17 +351,6 @@ file 'build/zlib/libz.a' do
322
351
SH
323
352
end
324
353
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
-
336
354
file 'build/generated/numbers.rb' do |t |
337
355
f1 = Tempfile . new ( %w[ numbers .cpp ] )
338
356
f2 = Tempfile . create ( 'numbers' )
@@ -380,10 +398,6 @@ rule '.c.o' => 'src/%n' do |t|
380
398
sh "#{ cc } -g -fPIC -c -o #{ t . name } #{ t . source } "
381
399
end
382
400
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
-
387
401
rule '.cpp.o' => [ 'src/%{build/,}X' ] + HEADERS do |t |
388
402
subdir = File . split ( t . name ) . first
389
403
mkdir_p subdir unless File . exist? ( subdir )
@@ -394,27 +408,38 @@ rule '.rb.o' => ['.rb.cpp'] + HEADERS do |t|
394
408
sh "#{ cxx } #{ cxx_flags . join ( ' ' ) } -std=#{ STANDARD } -c -o #{ t . name } #{ t . source } "
395
409
end
396
410
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 |
398
412
subdir = File . split ( t . name ) . first
399
413
mkdir_p subdir unless File . exist? ( subdir )
400
414
sh "bin/natalie --write-obj #{ t . name } #{ t . source } "
401
415
end
402
416
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
405
434
sh <<-SH
406
435
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
409
440
SH
410
441
end
411
442
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
-
418
443
task :tidy_internal do
419
444
sh "clang-tidy --warnings-as-errors='*' #{ PRIMARY_SOURCES . exclude ( 'src/dtoa.c' ) } "
420
445
end
@@ -479,6 +504,6 @@ def include_paths
479
504
File . expand_path ( 'ext/tm/include' , __dir__ ) ,
480
505
File . expand_path ( 'build' , __dir__ ) ,
481
506
File . expand_path ( 'build/onigmo/include' , __dir__ ) ,
482
- File . expand_path ( 'build/natalie_parser /include' , __dir__ ) ,
507
+ File . expand_path ( 'build/yarp /include' , __dir__ ) ,
483
508
]
484
509
end
0 commit comments