extlz4 0.2.4.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 79289896ae954100abb7a0a20312abefc1206134
4
+ data.tar.gz: 2328b0e92f682b0ec3b006eb88e70cd221eda360
5
+ SHA512:
6
+ metadata.gz: 4cede1dccaf6955f460f8e458dadf0dc8f27ad11a76dcb5438086320d79bc5f159ea2f9b183224110a89c93061e364feb35053bc938e60881ced44e44d5d4b95
7
+ data.tar.gz: 2e867e0857b9c253c3e4260e31913685429eadbe9785db89576dc556fcb184507ffd5f8b095e5fecc754ae57f1d40f28fbb2a401d459be09b1e93e1dd24ba614
@@ -0,0 +1,116 @@
1
+ # extlz4-0.2.4.2 (平成30年1月7日 日曜日)
2
+
3
+ * バージョン番号の改定のみ
4
+
5
+ * extlz4-0.2.4.1 を誤って gem yank してしまったため、バージョン番号を改定しました。
6
+
7
+
8
+ # extlz4-0.2.4.1 (平成30年1月7日 日曜日)
9
+
10
+ * LZ4 Frame Stream の伸長処理が間違っていたため修正
11
+
12
+
13
+ # extlz4-0.2.4 (平成30年1月7日 日曜日)
14
+
15
+ * Fix compilation error under Windows 10 (#1) (thanks to @pyjarrett)
16
+ * Upgrade lz4 to 1.8.0
17
+
18
+
19
+ # extlz4-0.2.3 (平成29年4月16日 日曜日)
20
+
21
+ * ``LZ4::BlockEncoder#update`` と ``LZ4::BlockDecoder#update`` を nogvl 化
22
+
23
+
24
+ # extlz4-0.2.2 (平成29年4月15日 土曜日)
25
+
26
+ * ``LZ4::FrameEncoder.new`` のフレームブロックサイズに対する既定値を
27
+ ``LZ4F_max4MB`` から ``LZ4F_default`` へと修正
28
+
29
+ * LZ4HC に関する定数を追加
30
+
31
+ * 外部シンボルの可視性を抑制するように修正
32
+
33
+ * コンパイラが "-fvisibility=hidden" を利用できる (gcc や clang などの)
34
+ 場合、extlz4.so が持つ外部シンボルを必要最低限度となるように修正しました。
35
+
36
+ * **(BUGFIX)** ``LZ4::BlockEncoder``、``LZ4::BlockDecoder`` が SEGV
37
+ を起こしていた問題の修正
38
+
39
+ * **(BUGFIX)** ``LZ4::BlockEncoder``、``LZ4::BlockDecoder``、
40
+ ``LZ4::FrameEncoder``、``LZ4::FrameDecoder`` がメモリリークを起こしていた問題の修正
41
+
42
+
43
+ # extlz4-0.2.1 (平成27年10月16日 金曜日)
44
+
45
+ * lz4 ライブラリを r131 (https://github.com/Cyan4973/lz4/tree/r131) に更新
46
+ * LZ4\_compress\_fast に対応
47
+ * LZ4::BlockEncoder.compressbound の不具合修正
48
+
49
+ 引数として与えられた整数値を ruby レベルから C レベルに変換し、その値を
50
+ ruby レベルの文字列オブジェクト (RString) として扱っていました。
51
+ この不具合を修正しています。
52
+
53
+
54
+ # extlz4-0.2 (2015-04-19)
55
+
56
+ ## いくつかの名称の変更
57
+
58
+ * ストリームをフレーム (frame) に変更しました。
59
+ * これまで extlz4 において raw\*\*\* と呼んできた名称を block\*\*\* に変更しました。
60
+
61
+ ## LZ4 ストリームの独自実装から LZ4 Frame API への移行
62
+
63
+ * LZ4.encode、LZ4.decode の引数は互換性を失いました。
64
+ * LZ4 Frame API による圧縮・伸長処理を行うためのクラスは
65
+ LZ4::Encoder と LZ4::Decoder として利用できます。
66
+ * 独自実装版は LZ4::StreamEncoder、LZ4::StreamDecoder のまま残されました。
67
+ * ***これらのクラスは将来的に廃止される予定です。***
68
+ * 利用する場合は ``require "extlz4/oldstream"`` とする必要があります。
69
+ * ruby gems の xxhash-0.3 を必要とします。
70
+ * 以前の LZ4.encode は LZ4.encode\_old、LZ4.decode は LZ4.decode\_old
71
+ として利用できます。
72
+
73
+ ## 新しい LZ4 Block Streaming API への移行
74
+
75
+ * ``LZ4_create()`` 系から ``LZ4_createStream()`` 系の API に移行しました。
76
+ * ``LZ4_decompress_safe_withPrefix64k()`` から ``LZ4_createStreamDecode()`` 系の API に移行しました。
77
+ * LZ4::RawStreamEncoder が LZ4::BlockEncoder になりました。
78
+ * LZ4::RawStreamDecoder が LZ4::BlockDecoder になりました。
79
+
80
+ ## セーフレベルの確認処理を削除
81
+
82
+ * セーフレベルの確認処理を削除しました。
83
+
84
+ 今まではセーフレベルが4以上の場合に汚染状態を移す必要のある場合は、
85
+ SecurityError 例外を発生させていましたが、この方針を変更して常に
86
+ 汚染状態を伝搬させるだけの処理にしました。
87
+
88
+
89
+ # extlz4-0.1.1 (2014-06-01)
90
+
91
+ ## 不具合の修正
92
+
93
+ * lib/extlz4.rb: ストリーム圧縮時に、未圧縮ブロックの格納サイズが常に圧縮した時のサイズを格納してしまい、不正な lz4 ストリームを生成していましたが、これを修正しました。
94
+
95
+ extlz4-0.1 で作成した lz4 ストリームファイルは圧縮前のファイルを削除する前に検査して、整合性を確認して下さい。
96
+
97
+ また、これ以降 extlz4-0.1 の利用はしないで下さい。
98
+
99
+ * `bin/extlz4 --fix-extlz4-0.1-bug <filename>` で不正な lz4 ストリームファイルを修正できます。修正したファイル名は "fixed-" + &lt;指定したファイル名&gt; の形となります。
100
+
101
+ * lib/extlz4.rb: ブロック依存ストリーム生成の場合、高効率圧縮時に圧縮レベルが常に規定値になっていましたが、これを変動するように修正しました。
102
+
103
+ * lib/extlz4.rb (`LZ4::StreamEncoder#initialize`): `block_encode` / `RawStreamEncoder#update` に渡す `level` の値が [nil, 0 .. 16] になるように修正しました。
104
+
105
+ * bin/extlz4: lz4 ストリーム検査の時、標準入力を利用した場合でも『-f』スイッチが必要となっていましたが、これを不要とするように修正しました。
106
+
107
+ ## メモリ使用量の改善
108
+
109
+ * lib/extlz4.rb: File#read に常に同じ文字列オブジェクトを渡し、さらに String#slice 系のメソッドを StringIO#read へ置き換えることで、常に同じ文字列オブジェクトを再利用するように修正しました。
110
+
111
+ これによって ruby-2.1 系で数10GBを大きく超えるデータを扱う場合でも、利用するメモリ量の低減が期待できます。
112
+
113
+
114
+ # extlz4-0.1 (2014-04-29)
115
+
116
+ ## 初犯
data/LICENSE ADDED
@@ -0,0 +1,24 @@
1
+ Copyright (c) 2013, dearblue. All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or
4
+ without modification, are permitted provided that the following
5
+ conditions are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright
8
+ notice, this list of conditions and the following disclaimer.
9
+ 2. Redistributions in binary form must reproduce the above copyright
10
+ notice, this list of conditions and the following disclaimer in
11
+ the documentation and/or other materials provided with the
12
+ distribution.
13
+
14
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,203 @@
1
+
2
+ # extlz4 - LZ4 for ruby
3
+
4
+ 圧縮伸張ライブラリ [lz4 (https://github.com/lz4/lz4/)](https://github.com/lz4/lz4/) の非公式 ruby バインディングライブラリです。
5
+
6
+ LZ4 データストリームを圧縮・伸張できます。lz4-cli で扱うことが出来ます。
7
+
8
+ ``` shell:shell
9
+ $ dmesg | ruby -r extlz4 -e 'LZ4.encode_file($stdin.binmode, $stdout.binmode)' | lz4c -d | more
10
+ ```
11
+
12
+ ほかの ruby 向けの lz4 バインディングライブラリとしては KOMIYA Atsushi さんによる [lz4-ruby (http://rubygems.org/gems/lz4-ruby)](http://rubygems.org/gems/lz4-ruby) があります。
13
+
14
+
15
+ ## SUMMARY (概要)
16
+
17
+ * package name: extlz4
18
+ * author: dearblue (mailto:dearblue@users.noreply.github.com)
19
+ * report issue to: <https://github.com/dearblue/ruby-extlz4/issues>
20
+ * how to install: `gem install extlz4`
21
+ * version: 0.2.4.2
22
+ * product quality: technical preview
23
+ * licensing: BSD-2-Clause License
24
+ * dependency gems: none
25
+ * dependency external c libraries: none
26
+ * bundled external c libraries:
27
+ * lz4-1.8 <https://github.com/lz4/lz4/tree/v1.8.0>
28
+ under [BSD 2-Clause license](https://github.com/lz4/lz4/tree/v1.8.0/LICENSE)
29
+ by [Yann Collet](https://github.com/Cyan4973)
30
+
31
+
32
+ ## ATTENTIONS (注意事項)
33
+
34
+ * Many documents are written in japanese.
35
+
36
+ (ドキュメントの多くは日本語で記述されています)
37
+
38
+
39
+ ## extlz4-0.1 による不正な lz4 ストリームを出力する不具合について
40
+
41
+ extlz4-0.1 に不正な lz4 ストリームを出力する不具合がありました。
42
+
43
+ 詳しく説明すると、ブロックデータとともに格納時ブロックデータサイズも出力しますが、常に圧縮後のデータサイズを出力していました。圧縮していない (圧縮後のデータサイズが圧縮前のデータサイズを上回った) 場合であれば、圧縮前のデータサイズを出力するべきところですが、そうはなっていません。
44
+
45
+ これによって無圧縮ブロックデータが正しく読み込めず、ひいてはそのブロック以降のデータが正しく読み込めないということになります。
46
+
47
+ extlz4-0.1.1 でその不具合の修正を行いました。
48
+
49
+ また、不正な lz4 ストリームファイルを生成しなおかつオリジナルファイルも失われた場合は、同梱してある `bin/extlz4` プログラムに `--fix-extlz4-0.1-bug` を指定することで正しい lz4 ストリームファイルを出力できます。
50
+
51
+ extlz4 --fix-extlz4-0.1-bug <file>...
52
+
53
+ 出力ファイル名は、入力ファイル名の頭に "fixed-" を追加したものとなります。
54
+
55
+ 必要であれば `-f` スイッチが利用できます。
56
+
57
+ `-k` スイッチは無視されます。修復した lz4 ストリームファイルが正しいかを検査したあとで不正な lz4 ストリームファイルと差し替えて下さい。
58
+
59
+ 修復できるのはあくまで extlz4-0.1 のこの不具合に起因するファイルのみとなります。
60
+
61
+
62
+ ## FEATURES (機能)
63
+
64
+ * Generic LZ4 frame data process
65
+ * Decode LZ4 Frame data : LZ4.decode
66
+ * Encode LZ4 Frame data : LZ4.encode
67
+ * Generic LZ4 frame data file process
68
+ * Decode LZ4 Frame data file : LZ4.decode\_file
69
+ * Encode LZ4 Frame data file : LZ4.encode\_file
70
+ * LZ4 block data process
71
+ * Decode LZ4 block data : LZ4.block\_decode
72
+ * Encode LZ4 block data : LZ4.block\_encode (supporting high compression level)
73
+ * Streaming Decode LZ4 block data : LZ4.block\_stream\_decode and LZ4::BlockDecoder#update
74
+ * Streaming Encode LZ4 block data : LZ4.block\_stream\_encode and LZ4::BlockEncoder#update (supporting high compression level)
75
+
76
+
77
+ ## ABOUT TAINT STATE AND SECURITY (汚染状態とセキュリティについて)
78
+
79
+ extlz4 はオブジェクト間での汚染状態を一方向伝播します。
80
+
81
+ オブジェクトの汚染伝播については『入力 -> 出力』となり、
82
+ ストリーム処理の場合は『入力 -> 圧縮器・伸張器 -> 出力』というようになります。
83
+
84
+ セキュリティレベルによる処理の拒否は行いません。
85
+
86
+
87
+ ## EXAMPLES (用例)
88
+
89
+ First, load extlz4. (最初に extlz4 を読み込んでください)
90
+
91
+ ``` ruby:ruby
92
+ require "extlz4"
93
+ ```
94
+
95
+ ### Decoding (伸張処理)
96
+
97
+ ``` ruby:ruby
98
+ uncompressed_data_string = LZ4.decode(compressed_data_string)
99
+ ```
100
+
101
+ ### Encoding (通常圧縮処理)
102
+
103
+ ``` ruby:ruby
104
+ compressed_data_string = LZ4.encode(uncompressed_data_string)
105
+ ```
106
+
107
+ ### High compression encoding (高圧縮処理)
108
+
109
+ ``` ruby:ruby
110
+ compressed_data_string = LZ4.encode(uncompressed_data_string, 9)
111
+ ```
112
+
113
+ ### Frame decoding
114
+
115
+ ``` ruby:ruby
116
+ File.open("sample.txt.lz4", "rb") do |file|
117
+ LZ4.decode(file) do |lz4|
118
+ lz4.read(50) # read 50 bytes as string
119
+ lz4.getc # read 1 byte as integer
120
+ lz4.read # read rest bytes as string
121
+ end
122
+ end
123
+ ```
124
+
125
+ ### Frame encoding by high compression
126
+
127
+ ``` ruby:ruby
128
+ File.open("sample.txt.lz4", "wb") do |file|
129
+ LZ4.encode(file, 9) do |lz4|
130
+ lz4 << "#{Time.now}: abcdefghijklmnopqrstuvwxyz\n"
131
+ lz4.write "#{Time.now}: abcdefghijklmnopqrstuvwxyz\n"
132
+ end
133
+ end
134
+ ```
135
+
136
+ ### Frame encoding without block
137
+
138
+ ``` ruby:ruby
139
+ file = File.open("sample.txt.lz4", "wb")
140
+ lz4 = LZ4.encode(file)
141
+ lz4 << "abcdefghijklmnopqrstuvwxyz\n"
142
+ lz4.close # VERY IMPORTANT!
143
+ ```
144
+
145
+ ### Block data processing (fast compression encoding and decoding)
146
+
147
+ ``` ruby:ruby
148
+ src = "abcdefg" * 100
149
+ lz4data = LZ4.block_encode(src)
150
+ data = LZ4.block_decode(lz4data)
151
+ p src == data # => true
152
+ ```
153
+
154
+ ### Block data processing (high compression encoding and decoding)
155
+
156
+ ``` ruby:ruby
157
+ src = "abcdefg" * 100
158
+ level = 8
159
+ lz4data = LZ4.block_encode(level, src)
160
+ data = LZ4.block_decode(lz4data)
161
+ p src == data # => true
162
+ ```
163
+
164
+ ### Block data processing (high speed encoding)
165
+
166
+ ``` ruby:ruby
167
+ src = "abcdefg" * 100
168
+ level = -19 # transform to one's complement as acceleration
169
+ lz4data = LZ4.block_encode(level, src)
170
+ ```
171
+
172
+ ### Block stream data processing (high compression encoding and decoding)
173
+
174
+ ``` ruby:ruby
175
+ level = 8 # (OPTIONAL PARAMETER)
176
+ predict = "abcdefg" # with preset dictionary (OPTIONAL PARAMETER)
177
+ encoder = LZ4.block_stream_encode(level, predict)
178
+
179
+ src = "abcdefg" * 100
180
+ lz4data1 = encoder.update(src)
181
+
182
+ decoder = LZ4.block_stream_decode(predict)
183
+
184
+ data = decoder.update(lz4data1)
185
+ p src == data # => true
186
+
187
+ src2 = "ABCDEFG" * 100
188
+ lz4data2 = encoder.update(src2)
189
+ p "lz4data1.bytesize" => lz4data1.bytesize,
190
+ "lz4data2.bytesize" => lz4data2.bytesize
191
+
192
+ data = decoder.update(lz4data2)
193
+ p src2 == data # => true
194
+ ```
195
+
196
+
197
+ ## BONUS (おまけ)
198
+
199
+ コマンドラインプログラムとして ``extlz4`` が追加されます。
200
+
201
+ これは lz4 と同程度の機能を持ちます (車輪の再発明とも言う)。
202
+
203
+ とはいえ、引数のとり方を変えてあり、gzip のような形で利用できます。
@@ -0,0 +1,212 @@
1
+
2
+ require "pathname"
3
+ require "rake/clean"
4
+
5
+ docnames = "{README,LICENSE,CHANGELOG,Changelog,HISTORY}"
6
+ doctypes = "{,.txt,.rd,.rdoc,.md,.markdown}"
7
+ cexttypes = "{c,C,cc,cxx,cpp,h,H,hh}"
8
+
9
+ DOC = FileList["#{docnames}{,.ja}#{doctypes}"] +
10
+ FileList["{contrib,ext}/**/#{docnames}{,.ja}#{doctypes}"] +
11
+ FileList["ext/**/*.#{cexttypes}"]
12
+ EXT = FileList["ext/**/*"]
13
+ BIN = FileList["bin/*"]
14
+ LIB = FileList["lib/**/*.rb"]
15
+ SPEC = FileList["spec/**/*"]
16
+ TEST = FileList["test/**/*"]
17
+ EXAMPLE = FileList["examples/**/*"]
18
+ GEMSTUB_SRC = "gemstub.rb"
19
+ RAKEFILE = [File.basename(__FILE__), GEMSTUB_SRC]
20
+ EXTRA = []
21
+ EXTCONF = FileList["ext/**/extconf.rb"]
22
+ EXTCONF.reject! { |n| !File.file?(n) }
23
+ EXTMAP = {}
24
+
25
+ load GEMSTUB_SRC
26
+
27
+ EXTMAP.dup.each_pair do |dir, name|
28
+ EXTMAP[Pathname.new(dir).cleanpath.to_s] = Pathname.new(name).cleanpath.to_s
29
+ end
30
+
31
+ GEMSTUB.extensions += EXTCONF
32
+ GEMSTUB.executables += FileList["bin/*"].map { |n| File.basename n }
33
+ GEMSTUB.executables.sort!
34
+
35
+ PACKAGENAME = "#{GEMSTUB.name}-#{GEMSTUB.version}"
36
+ GEMFILE = "#{PACKAGENAME}.gem"
37
+ GEMSPEC = "#{PACKAGENAME}.gemspec"
38
+
39
+ GEMSTUB.files += DOC + EXT + EXTCONF + BIN + LIB + SPEC + TEST + EXAMPLE + RAKEFILE + EXTRA
40
+ GEMSTUB.files.sort!
41
+ if GEMSTUB.rdoc_options.nil? || GEMSTUB.rdoc_options.empty?
42
+ readme = %W(.md .markdown .rd .rdoc .txt #{""}).map { |ext| "README#{ext}" }.find { |m| DOC.find { |n| n == m } }
43
+ GEMSTUB.rdoc_options = %w(--charset UTF-8) + (readme ? %W(-m #{readme}) : [])
44
+ end
45
+ GEMSTUB.extra_rdoc_files += DOC + LIB + EXT.reject { |n| n.include?("/externals/") || !%w(.h .hh .c .cc .cpp .cxx).include?(File.extname(n)) }
46
+ GEMSTUB.extra_rdoc_files.sort!
47
+
48
+ GEMSTUB_TRYOUT = GEMSTUB.dup
49
+ GEMSTUB_TRYOUT.version = "#{GEMSTUB.version}#{Time.now.strftime(".TRYOUT.%Y%m%d.%H%M%S")}"
50
+ PACKAGENAME_TRYOUT = "#{GEMSTUB.name}-#{GEMSTUB_TRYOUT.version}"
51
+ GEMFILE_TRYOUT = "#{PACKAGENAME_TRYOUT}.gem"
52
+ GEMSPEC_TRYOUT = "#{PACKAGENAME_TRYOUT}.gemspec"
53
+
54
+ CLEAN << GEMSPEC << GEMSPEC_TRYOUT
55
+ CLOBBER << GEMFILE
56
+
57
+ task :default => :tryout do
58
+ $stderr.puts <<-EOS
59
+ #{__FILE__}:#{__LINE__}:
60
+ \ttype ``rake release'' to build release package.
61
+ EOS
62
+ end
63
+
64
+ desc "build tryout package"
65
+ task :tryout
66
+
67
+ desc "build release package"
68
+ task :release => :all
69
+
70
+ unless EXTCONF.empty?
71
+ RUBYSET ||= (ENV["RUBYSET"] || "").split(",")
72
+
73
+ if RUBYSET.nil? || RUBYSET.empty?
74
+ $stderr.puts <<-EOS
75
+ #{__FILE__}:
76
+ |
77
+ | If you want binary gem package, launch rake with ``RUBYSET`` enviroment
78
+ | variable for set ruby interpreters by comma separated.
79
+ |
80
+ | e.g.) $ rake RUBYSET=ruby
81
+ | or) $ rake RUBYSET=ruby21,ruby22,ruby23
82
+ |
83
+ EOS
84
+ else
85
+ platforms = RUBYSET.map { |ruby| `#{ruby} --disable-gems -e "puts RUBY_PLATFORM"`.chomp }
86
+ platforms1 = platforms.uniq
87
+ unless platforms1.size == 1 && !platforms1[0].empty?
88
+ abort <<-EOS
89
+ #{__FILE__}:#{__LINE__}: different platforms:
90
+ #{RUBYSET.zip(platforms).map { |ruby, platform| "%24s => %s" % [ruby, platform] }.join("\n")}
91
+ ABORTED.
92
+ EOS
93
+ end
94
+ PLATFORM = platforms1[0]
95
+
96
+ RUBY_VERSIONS = RUBYSET.map do |ruby|
97
+ ver = `#{ruby} --disable-gems -e "puts RUBY_VERSION"`.slice(/\d+\.\d+/)
98
+ raise "failed ruby checking - ``#{ruby}''" unless $?.success?
99
+ [ver, ruby]
100
+ end
101
+
102
+ SOFILES_SET = RUBY_VERSIONS.map { |(ver, ruby)|
103
+ EXTCONF.map { |extconf|
104
+ extdir = Pathname.new(extconf).cleanpath.dirname.to_s
105
+ case
106
+ when soname = EXTMAP[extdir.sub(/^ext\//i, "")]
107
+ soname = soname.sub(/\.so$/i, "")
108
+ when extdir == "ext" || extdir == "."
109
+ soname = GEMSTUB.name
110
+ else
111
+ soname = File.basename(extdir)
112
+ end
113
+
114
+ [ruby, File.join("lib", "#{soname.sub(/(?<=\/)|^(?!.*\/)/, "#{ver}/")}.so"), extconf]
115
+ }
116
+ }.flatten(1)
117
+ SOFILES = SOFILES_SET.map { |(ruby, sopath, extconf)| sopath }
118
+
119
+ GEMSTUB_NATIVE = GEMSTUB.dup
120
+ GEMSTUB_NATIVE.files += SOFILES
121
+ GEMSTUB_NATIVE.platform = Gem::Platform.new(PLATFORM).to_s
122
+ GEMSTUB_NATIVE.extensions.clear
123
+ GEMFILE_NATIVE = "#{GEMSTUB_NATIVE.name}-#{GEMSTUB_NATIVE.version}-#{GEMSTUB_NATIVE.platform}.gem"
124
+ GEMSPEC_NATIVE = "#{GEMSTUB_NATIVE.name}-#{GEMSTUB_NATIVE.platform}.gemspec"
125
+
126
+ task :all => ["native-gem", GEMFILE]
127
+
128
+ desc "build binary gem package"
129
+ task "native-gem" => GEMFILE_NATIVE
130
+
131
+ desc "generate binary gemspec"
132
+ task "native-gemspec" => GEMSPEC_NATIVE
133
+
134
+ file GEMFILE_NATIVE => DOC + EXT + EXTCONF + BIN + LIB + SPEC + TEST + EXAMPLE + SOFILES + RAKEFILE + [GEMSPEC_NATIVE] do
135
+ sh "gem build #{GEMSPEC_NATIVE}"
136
+ end
137
+
138
+ file GEMSPEC_NATIVE => RAKEFILE do
139
+ File.write(GEMSPEC_NATIVE, GEMSTUB_NATIVE.to_ruby, mode: "wb")
140
+ end
141
+
142
+ desc "build c-extension libraries"
143
+ task "sofiles" => SOFILES
144
+
145
+ SOFILES_SET.each do |(ruby, soname, extconf)|
146
+ sodir = File.dirname(soname)
147
+ makefile = File.join(sodir, "Makefile")
148
+
149
+ CLEAN << GEMSPEC_NATIVE << sodir
150
+ CLOBBER << GEMFILE_NATIVE
151
+
152
+ directory sodir
153
+
154
+ desc "generate Makefile for binary extension library"
155
+ file makefile => [sodir, extconf] do
156
+ rel_extconf = Pathname.new(extconf).relative_path_from(Pathname.new(sodir)).to_s
157
+ cd sodir do
158
+ sh *%W"#{ruby} #{rel_extconf} --ruby=#{ruby} #{ENV["EXTCONF"]}"
159
+ end
160
+ end
161
+
162
+ desc "build binary extension library"
163
+ file soname => [makefile] + EXT do
164
+ cd sodir do
165
+ sh "make"
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
171
+
172
+
173
+ task :all => GEMFILE
174
+ task :tryout => GEMFILE_TRYOUT
175
+
176
+ desc "generate local rdoc"
177
+ task :rdoc => DOC + LIB do
178
+ sh *(%w(rdoc) + GEMSTUB.rdoc_options + DOC + LIB)
179
+ end
180
+
181
+ desc "launch rspec"
182
+ task rspec: :all do
183
+ sh "rspec"
184
+ end
185
+
186
+ desc "build gem package"
187
+ task gem: GEMFILE
188
+
189
+ desc "generate gemspec"
190
+ task gemspec: GEMSPEC
191
+
192
+ desc "print package name"
193
+ task "package-name" do
194
+ puts PACKAGENAME
195
+ end
196
+
197
+ file GEMFILE => DOC + EXT + EXTCONF + BIN + LIB + SPEC + TEST + EXAMPLE + RAKEFILE + [GEMSPEC] do
198
+ sh "gem build #{GEMSPEC}"
199
+ end
200
+
201
+ file GEMFILE_TRYOUT => DOC + EXT + EXTCONF + BIN + LIB + SPEC + TEST + EXAMPLE + RAKEFILE + [GEMSPEC_TRYOUT] do
202
+ #file GEMFILE_TRYOUT do
203
+ sh "gem build #{GEMSPEC_TRYOUT}"
204
+ end
205
+
206
+ file GEMSPEC => RAKEFILE do
207
+ File.write(GEMSPEC, GEMSTUB.to_ruby, mode: "wb")
208
+ end
209
+
210
+ file GEMSPEC_TRYOUT => RAKEFILE do
211
+ File.write(GEMSPEC_TRYOUT, GEMSTUB_TRYOUT.to_ruby, mode: "wb")
212
+ end