-
Notifications
You must be signed in to change notification settings - Fork 5
/
Rakefile
149 lines (136 loc) · 5.15 KB
/
Rakefile
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
# frozen_string_literal: true
require "bundler/gem_tasks"
require "rspec/core/rake_task"
RSpec::Core::RakeTask.new(:spec)
require "rake/extensiontask"
Rake::ExtensionTask.new("gps_pvt") do |ext|
ext.lib_dir = "lib/gps_pvt"
end
require "yard"
YARD::Rake::YardocTask.new do |t|
#t.files = ['lib/**/*.rb', 'ext/**/*_wrap.cxx']
t.options = ['--embed-mixins']
#t.stats_options = ['--list-undoc']
end
namespace :git do
task :version do
@git_version ||= proc{
res = Gem::Version::new(`git --version`.match(/\d+\.\d+\.\d+/)[0])
res.instance_eval{
cmp_orig = self.method(:<=>)
define_singleton_method(:<=>){|arg|
cmp_orig.call(arg.kind_of?(String) ? Gem::Version::new(arg) : arg)
}
}
res
}.call
end
namespace :submodules do
desc "Initialize git submodules"
task :init => ["git:version"] do
sh "git submodule init"
# for sparse-checkout; @see https://stackoverflow.com/a/59521050/15992898
`git config --file .gitmodules --name-only --get-regexp path`.lines.each{|str|
# list submodule; @see https://stackoverflow.com/a/23490756/15992898
next unless str =~ /submodule\.(.+)\.path/
repo_dir = $1
sh "git clone -n #{`git config submodule.#{repo_dir}.url`.chomp} #{repo_dir}"
}
{
'ext/ninja-scan-light' => [
# From git 2.37.0, cone mode, which denies part of pattern like .ignore, is its default.
# @see https://git-scm.com/docs/git-sparse-checkout/2.37.0#_internalscone_mode_handling
(@git_version < "2.37.0") ? "sparse-checkout init" : nil, # same as "git -C #{repo} config core.sparseCheckout true"
# same as #{repo}/.git/info/sparse-checkout
"sparse-checkout set #{'--no-cone' if @git_version >= "2.37.0"}" \
+ (<<-__SPARSE_PATTERNS__).lines.collect{|str| str.chomp.gsub(/^ */, ' ')}.join,
tool/param/
tool/util/text_helper.h
tool/util/bit_counter.h
tool/algorithm/integral.h
tool/algorithm/interpolate.h
tool/navigation/GPS*
tool/navigation/SBAS*
tool/navigation/QZSS*
tool/navigation/GLONASS*
tool/navigation/coordinate.h
tool/navigation/EGM.h
tool/navigation/MagneticField.h
tool/navigation/NTCM.h
tool/navigation/RINEX.h
tool/navigation/RINEX_Clock.h
tool/navigation/WGS84.h
tool/navigation/SP3.h
tool/navigation/ANTEX.h
tool/swig/SylphideMath.i
tool/swig/GPS.i
tool/swig/Coordinate.i
tool/swig/makefile
tool/swig/extconf.rb
tool/swig/spec/GPS_spec.rb
tool/swig/spec/SylphideMath_spec.rb
__SPARSE_PATTERNS__
].compact
}.each{|repo, commands|
commands.each{|str| sh "git -C #{repo} #{str}"}
}
sh "git submodule absorbgitdirs" # Move #{repo}/.git to .git/modules/#{repo}/.git
sh "git submodule update"
# if already checked out, then git -C #{repo} read-tree -mu HEAD
end
end
end
desc "Generate SWIG wrapper codes"
task :swig do
out_base_dir = File::join(File::dirname(__FILE__), 'ext', 'gps_pvt')
[
File::join(File::dirname(__FILE__), 'ext', 'ninja-scan-light', 'tool', 'swig'),
].each{|swig_dir|
Dir::chdir(swig_dir){
Dir::glob("*.i"){|src|
mod_name = File::basename(src, '.*')
out_dir = File::join(out_base_dir, mod_name)
sh "mkdir -p #{out_dir}"
wrapper = File::join(out_dir, "#{mod_name}_wrap.cxx")
sh [:make, :clean, wrapper,
"BUILD_DIR=#{out_dir}",
"SWIGFLAGS='-c++ -ruby -prefix \"GPS_PVT::\"#{" -D__MINGW__" if ENV["MSYSTEM"]}'"].join(' ')
open(wrapper, 'r+'){|io|
lines = io.read.lines.collect{|line|
line.sub(/rb_require\(\"([^\"]+)\"\)/){ # from camel to underscore downcase style
"rb_require(\"#{$1.sub('GPS_PVT', 'gps_pvt')}\")"
}
}
io.rewind
io.write(lines.join)
}
}
}
}
end
desc "Update upl.json.gz by using upl/*.asn"
task "upl.json" do
parser_dir = File::join(File::dirname(__FILE__), 'lib', 'gps_pvt', 'asn1')
upl_dir = File::join(parser_dir, '..', 'upl')
upl_files = Dir::glob(File::join(upl_dir, '*.asn'))
chdir(parser_dir){
sh [:racc, 'asn1.y', '--debug'].join(' ')
require 'zlib'
Zlib::GzipWriter.wrap(open(File::join(upl_dir, 'upl.json.gz'), 'w')){|gz|
json_str = `#{['ruby', 'asn1.tab.rb', *upl_files].join(' ')}`
puts "generating JSON => #{json_str.gsub(/\s+/, ' ').slice(0, 100)} ... "
gz.write json_str
}
remove_file('asn1.tab.rb')
}
end
file "ext/ninja-scan-light/tool" do |t|
Rake::Task["git:submodules:init"].invoke
end
GitHubChangelogGenerator::RakeTask.new :changelog do |config|
%r|github\.com/([^/]+)/([^/]+)| =~ Bundler::load_gemspec(
Dir::glob(File::join(File::dirname(__FILE__), '*.gemspec')).first).homepage
config.user = $1
config.project = $2
end if (begin; require 'github_changelog_generator/task'; rescue Exception; false; end)
task :default => ["ext/ninja-scan-light/tool", :compile, :spec]