extlz4 0.2.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/HISTORY.ja.md +116 -0
- data/LICENSE +24 -0
- data/README.md +203 -0
- data/Rakefile +212 -0
- data/bin/extlz4 +220 -0
- data/contrib/lz4/INSTALL +15 -0
- data/contrib/lz4/LICENSE +11 -0
- data/contrib/lz4/NEWS +231 -0
- data/contrib/lz4/README.md +114 -0
- data/contrib/lz4/circle.yml +39 -0
- data/contrib/lz4/lib/LICENSE +24 -0
- data/contrib/lz4/lib/README.md +73 -0
- data/contrib/lz4/lib/liblz4.pc.in +14 -0
- data/contrib/lz4/lib/lz4.c +1478 -0
- data/contrib/lz4/lib/lz4.h +463 -0
- data/contrib/lz4/lib/lz4frame.c +1669 -0
- data/contrib/lz4/lib/lz4frame.h +391 -0
- data/contrib/lz4/lib/lz4frame_static.h +143 -0
- data/contrib/lz4/lib/lz4hc.c +807 -0
- data/contrib/lz4/lib/lz4hc.h +278 -0
- data/contrib/lz4/lib/lz4opt.h +366 -0
- data/contrib/lz4/lib/xxhash.c +894 -0
- data/contrib/lz4/lib/xxhash.h +293 -0
- data/examples/frameapi.rb +43 -0
- data/ext/blockapi.c +1046 -0
- data/ext/depend +4 -0
- data/ext/extconf.rb +60 -0
- data/ext/extlz4.c +69 -0
- data/ext/extlz4.h +109 -0
- data/ext/frameapi.c +780 -0
- data/ext/hashargs.c +151 -0
- data/ext/hashargs.h +110 -0
- data/ext/lz4_amalgam.c +31 -0
- data/gemstub.rb +40 -0
- data/lib/extlz4.rb +327 -0
- data/lib/extlz4/compat.rb +12 -0
- data/lib/extlz4/fix-0.1bug.rb +96 -0
- data/lib/extlz4/oldstream.rb +529 -0
- data/lib/extlz4/version.rb +3 -0
- data/test/common.rb +18 -0
- data/test/test_blockapi.rb +105 -0
- data/test/test_frameapi.rb +59 -0
- metadata +126 -0
checksums.yaml
ADDED
@@ -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
|
data/HISTORY.ja.md
ADDED
@@ -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-" + <指定したファイル名> の形となります。
|
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.
|
data/README.md
ADDED
@@ -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 のような形で利用できます。
|
data/Rakefile
ADDED
@@ -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
|