xot 0.1.11 → 0.1.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/LICENSE +21 -0
- data/README.md +1 -1
- data/Rakefile +8 -13
- data/VERSION +1 -1
- data/ext/xot/extconf.rb +2 -3
- data/ext/xot/tester.cpp +55 -7
- data/include/xot.h +5 -3
- data/include/xot/debug.h +6 -1
- data/include/xot/defs.h +2 -3
- data/include/xot/exception.h +18 -6
- data/include/xot/noncopyable.h +30 -0
- data/include/xot/pimpl.h +10 -18
- data/include/xot/ref.h +25 -58
- data/include/xot/string.h +9 -0
- data/include/xot/time.h +3 -1
- data/include/xot/util.h +68 -13
- data/lib/xot.rb +5 -1
- data/lib/xot/bit_flag.rb +28 -15
- data/lib/xot/bit_flag_accessor.rb +78 -0
- data/lib/xot/bit_util.rb +19 -0
- data/lib/xot/const_symbol_accessor.rb +59 -0
- data/lib/xot/extconf.rb +8 -7
- data/lib/xot/module.rb +4 -19
- data/lib/xot/rake.rb +302 -127
- data/lib/xot/rake/alias_task.rb +34 -0
- data/lib/xot/rake/escalation.rb +32 -0
- data/lib/xot/rake/util.rb +255 -0
- data/lib/xot/setter.rb +2 -1
- data/lib/xot/universal_accessor.rb +40 -0
- data/src/debug.cpp +3 -3
- data/src/string.cpp +33 -2
- data/src/time.cpp +16 -8
- data/test/test_bit_flag.rb +1 -10
- data/test/test_bit_flag_accessor.rb +64 -0
- data/test/test_bit_util.rb +18 -0
- data/test/test_const_symbol_accessor.rb +56 -0
- data/test/test_universal_accessor.rb +51 -0
- data/xot.gemspec +3 -6
- metadata +28 -45
- data/task/ext.rake +0 -76
- data/task/gem.rake +0 -51
- data/task/lib.rake +0 -92
- data/task/mac.rake +0 -45
- data/task/test.rake +0 -35
data/lib/xot/rake.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
|
4
|
-
require 'erb'
|
5
4
|
require 'rbconfig'
|
6
|
-
require '
|
5
|
+
require 'rake/loaders/makefile'
|
6
|
+
require 'rake/testtask'
|
7
|
+
require 'xot/rake/alias_task'
|
8
|
+
require 'xot/rake/util'
|
9
|
+
#require 'xot/rake/escalation'
|
7
10
|
|
8
11
|
|
9
12
|
module Xot
|
@@ -12,142 +15,337 @@ module Xot
|
|
12
15
|
module Rake
|
13
16
|
|
14
17
|
|
15
|
-
def
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
def srcs_map ()
|
19
|
+
paths = glob("#{src_dir}/**/*.{#{src_exts.join ','}}") +
|
20
|
+
erbs_map.values.grep(/\.(#{src_exts.join '|'})$/)
|
21
|
+
paths.reject! {|path| excluded? path}
|
22
|
+
paths.reject! {|path| path =~ %r(/win32/)} unless win32?
|
23
|
+
paths.reject! {|path| path =~ %r(/osx/)} unless osx?
|
24
|
+
paths.reject! {|path| path =~ %r(/ios/)} unless ios?
|
25
|
+
make_path_map paths, src_ext_map
|
19
26
|
end
|
20
27
|
|
21
|
-
def
|
22
|
-
paths = []
|
23
|
-
|
24
|
-
|
25
|
-
end
|
26
|
-
paths
|
28
|
+
def erbs_map ()
|
29
|
+
paths = glob *[inc_dir, src_dir].map {|s| "#{s}/**/*.erb"}
|
30
|
+
paths.reject! {|path| excluded? path}
|
31
|
+
make_path_map paths, {".erb" => ""}
|
27
32
|
end
|
28
33
|
|
29
|
-
def
|
30
|
-
|
34
|
+
def vendor_srcs_map (*dirs)
|
35
|
+
dirs = src_dirs if dirs.empty?
|
36
|
+
paths = dirs.map {|dir| glob "#{dir}/**/*.{#{src_exts.join ','}}"}.flatten
|
37
|
+
paths.reject! {|path| excluded? path}
|
38
|
+
make_path_map paths.flatten, src_ext_map
|
31
39
|
end
|
32
40
|
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
41
|
+
def src_ext_map (to = '.o')
|
42
|
+
Hash[*src_exts.map {|ext| [".#{ext}", to]}.flatten]
|
43
|
+
end
|
44
|
+
|
45
|
+
def defs ()
|
46
|
+
env_array :DEFS, []
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_alones ()
|
50
|
+
env :TESTS_ALONE, []
|
40
51
|
end
|
41
52
|
|
42
|
-
def
|
43
|
-
|
44
|
-
return '' if max == 0
|
45
|
-
(1..max).map(&block).join(sep)
|
53
|
+
def test_excludes ()
|
54
|
+
env :TESTS_EXCLUDE, []
|
46
55
|
end
|
47
56
|
|
48
|
-
def
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
57
|
+
def build_native_library ()
|
58
|
+
outname = "lib#{target_name}.a"
|
59
|
+
out = File.join lib_dir, outname
|
60
|
+
erbs = erbs_map
|
61
|
+
srcs = srcs_map
|
62
|
+
depend = 'depend.mf'
|
63
|
+
|
64
|
+
alias_task :erb => 'lib:erb'
|
65
|
+
alias_task :lib => out
|
66
|
+
alias_task :clean => 'lib:clean'
|
67
|
+
|
68
|
+
namespace :lib do
|
69
|
+
desc "compile sources"
|
70
|
+
alias_task :compile => srcs.values
|
71
|
+
|
72
|
+
desc "convert erb sources"
|
73
|
+
alias_task :erb => erbs.values
|
74
|
+
|
75
|
+
desc "link #{out}"
|
76
|
+
file out => srcs.values do
|
77
|
+
next if srcs.values.empty?
|
78
|
+
objs = srcs.values + vendor_srcs_map.values
|
79
|
+
sh %( rm -f #{out} )
|
80
|
+
sh %( #{ar} #{arflags} #{out} #{objs.join " "} )
|
81
|
+
end
|
82
|
+
|
83
|
+
desc "create #{depend}"
|
84
|
+
file depend => erbs.values do
|
85
|
+
sh %( #{cxx} -M #{cppflags} #{srcs.keys.join ' '} > #{depend} )
|
86
|
+
input = open(depend) {|f| f.read}
|
87
|
+
open(depend, 'w') do |output|
|
88
|
+
output << input.gsub(/\w+\.o/, src_dir + '/\0')
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
import depend if File.exist? depend
|
93
|
+
|
94
|
+
srcs.each do |src, obj|
|
95
|
+
desc "compile #{src}"
|
96
|
+
file obj => [:vendor, depend, src] + erbs.values do
|
97
|
+
sh %( #{cxx} -c #{cppflags} #{cxxflags} -o #{obj} #{src} )
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
erbs.each do |erb, to|
|
102
|
+
desc "compile #{erb}"
|
103
|
+
file to => erb do
|
104
|
+
print "#{erb}: compiling to #{to} ..."
|
105
|
+
compile_erb erb, to
|
106
|
+
puts "ok"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
task :clean do
|
111
|
+
tmps = srcs.values + erbs.values
|
112
|
+
sh %( rm -rf #{out} #{depend} #{tmps.join ' '} )
|
54
113
|
end
|
55
|
-
[path, convpath]
|
56
114
|
end
|
57
|
-
Hash[*paths.flatten]
|
58
115
|
end
|
59
116
|
|
60
|
-
def
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
117
|
+
def build_ruby_extension (dlname: 'native', dlext: 'so')
|
118
|
+
dlname = env :DLNAME, dlname
|
119
|
+
dlext = env :DLEXT, RbConfig::CONFIG['DLEXT'] || dlext
|
120
|
+
|
121
|
+
extconf = File.join ext_dir, 'extconf.rb'
|
122
|
+
makefile = File.join ext_dir, 'Makefile'
|
123
|
+
depend = File.join ext_dir, 'depend.mf'
|
124
|
+
|
125
|
+
outname = "#{dlname}.#{dlext}"
|
126
|
+
extout = File.join ext_dir, outname
|
127
|
+
libout = File.join ext_lib_dir, outname
|
128
|
+
|
129
|
+
srcs = FileList["#{ext_dir}/**/*.cpp"]
|
130
|
+
libs = modules.map {|m| "#{m.lib_dir}/lib#{m.name.downcase}.a"}
|
131
|
+
|
132
|
+
alias_task :ext => libout
|
133
|
+
alias_task :clean => 'ext:clean'
|
134
|
+
alias_task :clobber => 'ext:clobber'
|
135
|
+
|
136
|
+
namespace :ext do
|
137
|
+
desc "build #{libout}"
|
138
|
+
file libout => extout do
|
139
|
+
sh %( cp #{extout} #{libout} )
|
140
|
+
end
|
141
|
+
|
142
|
+
desc "build #{extout}"
|
143
|
+
file extout => [:lib, makefile] do
|
144
|
+
sh %( cd #{ext_dir} && make )
|
145
|
+
end
|
146
|
+
|
147
|
+
desc "create #{makefile}"
|
148
|
+
file makefile => [extconf, depend] + libs do
|
149
|
+
sh %( cd #{ext_dir} && ruby #{File.basename extconf} )
|
150
|
+
end
|
151
|
+
|
152
|
+
desc "create #{depend}"
|
153
|
+
file depend => srcs do
|
154
|
+
inc = inc_dirs.map {|s| " -I#{s}"}.join
|
155
|
+
src = srcs.map {|cpp| File.basename cpp}.join ' '
|
156
|
+
dep = File.basename depend
|
157
|
+
sh %( cd #{ext_dir} && #{cxx} -M #{cppflags} #{inc} #{src} > #{dep} )
|
158
|
+
end
|
159
|
+
|
160
|
+
task :clean do
|
161
|
+
sh %( cd #{ext_dir} && make clean ) if File.exist? makefile
|
162
|
+
sh %( rm -rf #{libout} )
|
163
|
+
end
|
164
|
+
|
165
|
+
task :clobber do
|
166
|
+
sh %( cd #{ext_dir} && make distclean ) if File.exist? makefile
|
167
|
+
sh %( rm -rf #{makefile} #{depend} )
|
168
|
+
end
|
70
169
|
end
|
71
170
|
end
|
72
171
|
|
73
|
-
def
|
74
|
-
|
75
|
-
[root, RbConfig::CONFIG['rubyarchhdrdir'] || "#{root}/#{RUBY_PLATFORM}"]
|
76
|
-
end
|
172
|
+
def test_ruby_extension ()
|
173
|
+
alias_task :test => [:ext, 'test:full', 'test:alones']
|
77
174
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
175
|
+
namespace :test do
|
176
|
+
::Rake::TestTask.new :full do |t|
|
177
|
+
t.libs << lib_dir
|
178
|
+
t.test_files = FileList["#{test_dir}/**/test_*.rb"] - test_alones - test_excludes
|
179
|
+
t.verbose = true
|
180
|
+
end
|
84
181
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
a
|
182
|
+
task :alones do
|
183
|
+
test_alones.each do |rb|
|
184
|
+
next if test_excludes.include? rb
|
185
|
+
sh %( ruby #{rb} )
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
93
189
|
end
|
94
190
|
|
95
|
-
def
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
191
|
+
def build_ruby_gem ()
|
192
|
+
gemspec = "#{target_name}.gemspec"
|
193
|
+
gemname = env :GEMNAME, target_name
|
194
|
+
gemver = env :GEMVERSION, target.version
|
195
|
+
gemfile = "#{gemname}-#{gemver}.gem"
|
196
|
+
|
197
|
+
alias_task :gem => gemfile
|
198
|
+
alias_task :clean => 'gem:clean'
|
199
|
+
alias_task :install => 'gem:install'
|
200
|
+
alias_task :uninstall => 'gem:uninstall'
|
201
|
+
alias_task :upload => 'gem:upload'
|
202
|
+
|
203
|
+
namespace :gem do
|
204
|
+
file gemfile => [:ext, :doc, gemspec] do
|
205
|
+
sh %( gem build #{gemspec} )
|
206
|
+
end
|
100
207
|
|
101
|
-
|
102
|
-
|
103
|
-
s << ' -Wno-unknown-pragmas'
|
104
|
-
s << ' ' << RbConfig::CONFIG['debugflags'] if debug?
|
105
|
-
s << ' -stdlib=libc++ -mmacosx-version-min=10.7' if clang?
|
106
|
-
s.gsub! /-O\d?/, '-O0' if debug?
|
107
|
-
s
|
108
|
-
end
|
208
|
+
desc "test gem"
|
209
|
+
alias_task :test => [:install, :uninstall]
|
109
210
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
s
|
115
|
-
end
|
211
|
+
desc "install gem"
|
212
|
+
task :install => gemfile do
|
213
|
+
sh %( gem install #{gemfile} )
|
214
|
+
end
|
116
215
|
|
117
|
-
|
118
|
-
|
119
|
-
|
216
|
+
desc "uninstall gem"
|
217
|
+
task :uninstall do
|
218
|
+
sh %( gem uninstall -x --version #{gemver} #{gemname} )
|
219
|
+
end
|
120
220
|
|
121
|
-
|
122
|
-
|
123
|
-
|
221
|
+
desc "upload gem"
|
222
|
+
task :upload => :install do
|
223
|
+
sh %( gem push #{gemfile} )
|
224
|
+
end
|
124
225
|
|
125
|
-
|
126
|
-
|
226
|
+
task :clean do
|
227
|
+
sh %( rm -f #{gemfile} )
|
228
|
+
end
|
229
|
+
end
|
127
230
|
end
|
128
231
|
|
129
|
-
def
|
130
|
-
|
131
|
-
|
232
|
+
def build_application ()
|
233
|
+
bindir = env :BINDIR, 'bin'
|
234
|
+
bin = "#{bindir}/#{target_name}"
|
235
|
+
appdir = "#{target.name}.app"
|
236
|
+
appbindir = "#{appdir}/Contents/MacOS"
|
237
|
+
out = "#{appbindir}/#{target.name}"
|
238
|
+
tmps = [appdir]
|
132
239
|
|
133
|
-
|
134
|
-
|
135
|
-
|
240
|
+
alias_task :app => out
|
241
|
+
alias_task :clean => 'app:clean'
|
242
|
+
|
243
|
+
namespace :app do
|
244
|
+
task :run => :app do
|
245
|
+
sh %( ruby #{bin} )
|
246
|
+
end
|
247
|
+
|
248
|
+
file out => [bin, appbindir] do
|
249
|
+
sh %( cp #{bin} #{appbindir} )
|
250
|
+
end
|
251
|
+
|
252
|
+
directory appbindir
|
136
253
|
|
137
|
-
|
138
|
-
|
254
|
+
task :clean do
|
255
|
+
sh %( rm -rf #{tmps.join ' '} )
|
256
|
+
end
|
257
|
+
end
|
139
258
|
end
|
140
259
|
|
141
|
-
def
|
142
|
-
|
260
|
+
def use_external_library (
|
261
|
+
repos, branch: nil, tag: nil,
|
262
|
+
incdir: nil, srcdir: nil, excludes: [],
|
263
|
+
submodules: [], post_submodules: nil)
|
264
|
+
|
265
|
+
excludes = [excludes].flatten
|
266
|
+
|
267
|
+
name = repos[%r{/([^/]+?)(:?\.git)?$}, 1]
|
268
|
+
dir = "#{vendor_dir}/#{name}"
|
269
|
+
incdir = dir + (incdir ? "/#{incdir}" : '')
|
270
|
+
srcdir = dir + (srcdir ? "/#{srcdir}" : '')
|
271
|
+
|
272
|
+
append_env 'INCDIRS', incdir
|
273
|
+
append_env 'SRCDIRS', srcdir
|
274
|
+
append_env 'EXCLUDES', excludes unless excludes.empty?
|
275
|
+
|
276
|
+
alias_task :vendor => "vendor:#{name}"
|
277
|
+
alias_task :clobber => "vendor:#{name}:clobber"
|
278
|
+
|
279
|
+
namespace :vendor do
|
280
|
+
desc "setup #{name} library"
|
281
|
+
alias_task name => dir
|
282
|
+
|
283
|
+
namespace name do
|
284
|
+
desc "clone #{name}"
|
285
|
+
file dir do
|
286
|
+
opts = '--depth=1'
|
287
|
+
opts += " --branch=#{branch || tag}" if branch || tag
|
288
|
+
opts += " --recursive" if submodules.empty?
|
289
|
+
sh %( git clone #{opts} #{repos} #{dir} )
|
290
|
+
unless submodules.empty?
|
291
|
+
Dir.chdir dir do
|
292
|
+
submodules.each do |path|
|
293
|
+
sh %( git submodule init #{path} )
|
294
|
+
end
|
295
|
+
sh %( git submodule update --depth=1 )
|
296
|
+
sh post_submodules if post_submodules
|
297
|
+
end
|
298
|
+
end
|
299
|
+
vendor_srcs_map(srcdir).each do |src, obj|
|
300
|
+
sh %( #{cxx} -c #{cppflags} #{cxxflags} -o #{obj} #{src} )
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
desc "update #{name} library"
|
305
|
+
task :update => ["vendor:#{name}:clobber", "vendor:#{name}"]
|
306
|
+
|
307
|
+
desc "delete #{name} library"
|
308
|
+
task :clobber do
|
309
|
+
sh %( rm -rf #{dir} )
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
143
313
|
end
|
144
314
|
|
145
|
-
def
|
146
|
-
|
315
|
+
def use_boost_library (modules = [], branch: nil, tag: nil)
|
316
|
+
default_modules = %w[tools/build libs/config]
|
317
|
+
use_external_library 'https://github.com/boostorg/boost',
|
318
|
+
branch: branch,
|
319
|
+
tag: tag,
|
320
|
+
srcdir: 'NOSRC',
|
321
|
+
submodules: default_modules | modules.map {|mod| "libs/#{mod}"},
|
322
|
+
post_submodules: './bootstrap.sh && ./b2 headers'
|
147
323
|
end
|
148
324
|
|
149
|
-
def
|
150
|
-
|
325
|
+
def define_placeholder_tasks ()
|
326
|
+
desc "delete temporary files"
|
327
|
+
alias_task :clean
|
328
|
+
|
329
|
+
desc "delete all generated files"
|
330
|
+
alias_task :clobber => :clean
|
331
|
+
|
332
|
+
desc "build native library"
|
333
|
+
alias_task :lib
|
334
|
+
|
335
|
+
desc "build ruby extension"
|
336
|
+
alias_task :ext
|
337
|
+
|
338
|
+
desc "build ruby gem"
|
339
|
+
alias_task :gem
|
340
|
+
|
341
|
+
desc "generate documentations"
|
342
|
+
alias_task :doc
|
343
|
+
|
344
|
+
desc "run all tests"
|
345
|
+
alias_task :test
|
346
|
+
|
347
|
+
desc "setup all external libraries"
|
348
|
+
alias_task :vendor
|
151
349
|
end
|
152
350
|
|
153
351
|
|
@@ -157,29 +355,6 @@ module Xot
|
|
157
355
|
end# Xot
|
158
356
|
|
159
357
|
|
160
|
-
|
161
|
-
module Rake
|
162
|
-
class Application
|
163
|
-
alias invoke_task_org invoke_task
|
358
|
+
include Xot::Rake
|
164
359
|
|
165
|
-
|
166
|
-
invoke_task_org *args, &block
|
167
|
-
rescue RuntimeError => e
|
168
|
-
if e.message =~ /don't\s+know\s+.*\s+task\s+/i
|
169
|
-
escalate_tasks
|
170
|
-
else
|
171
|
-
raise
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
def escalate_tasks ()
|
176
|
-
Dir.chdir '..' do
|
177
|
-
cmd = "rake #{ARGV.join ' '}"
|
178
|
-
$stderr.puts "(in #{Dir.pwd}) #{cmd}"
|
179
|
-
system cmd
|
180
|
-
end
|
181
|
-
exit 0
|
182
|
-
end
|
183
|
-
end
|
184
|
-
end
|
185
|
-
end
|
360
|
+
define_placeholder_tasks
|