mkmf-lite 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +5 -0
- data/lib/mkmf/lite.rb +79 -4
- data/lib/mkmf/templates/check_sizeof.erb +10 -0
- data/mkmf-lite.gemspec +1 -1
- data/test/test_mkmf_lite.rb +26 -1
- metadata +7 -8
data/CHANGES
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
= 0.2.2 - 6-Dec-2011
|
2
|
+
* Added the check_sizeof method.
|
3
|
+
* If CONFIG['COMMON_HEADERS'] is blank then stdio.h and stdlib.h are
|
4
|
+
used instead. On MS Windows the windows.h header is also used.
|
5
|
+
|
1
6
|
= 0.2.1 - 21-Jan-2011
|
2
7
|
* Minor platform detection adjustments for MS Windows.
|
3
8
|
|
data/lib/mkmf/lite.rb
CHANGED
@@ -3,10 +3,16 @@ require 'rbconfig'
|
|
3
3
|
require 'tmpdir'
|
4
4
|
require 'ptools'
|
5
5
|
|
6
|
+
if File::ALT_SEPARATOR && RUBY_VERSION.to_f < 1.9
|
7
|
+
require 'win32/open3'
|
8
|
+
else
|
9
|
+
require 'open3'
|
10
|
+
end
|
11
|
+
|
6
12
|
module Mkmf
|
7
13
|
module Lite
|
8
14
|
# The version of the mkmf-lite library
|
9
|
-
MKMF_LITE_VERSION = '0.2.
|
15
|
+
MKMF_LITE_VERSION = '0.2.2'
|
10
16
|
|
11
17
|
@@cpp_command = Config::CONFIG['CC'] || Config::CONFIG['CPP']
|
12
18
|
@@cpp_outfile = Config::CONFIG['CPPOUTFILE'] || "-o conftest.i"
|
@@ -62,7 +68,7 @@ module Mkmf
|
|
62
68
|
end
|
63
69
|
|
64
70
|
# Checks whether or not the struct of type +struct_type+ contains the
|
65
|
-
# +struct_member+.
|
71
|
+
# +struct_member+. If it does not, or the struct type cannot be found,
|
66
72
|
# then false is returned.
|
67
73
|
#
|
68
74
|
# An optional list of +headers+ may be specified, in addition to the
|
@@ -76,6 +82,27 @@ module Mkmf
|
|
76
82
|
try_to_compile(code)
|
77
83
|
end
|
78
84
|
|
85
|
+
# Returns the sizeof +type+ using +headers+, or common headers if no
|
86
|
+
# headers are specified.
|
87
|
+
#
|
88
|
+
# If this method fails an error is raised. This could happen if the type
|
89
|
+
# can't be found and/or the header files do not include the indicated type.
|
90
|
+
#
|
91
|
+
# Example:
|
92
|
+
#
|
93
|
+
# class Foo
|
94
|
+
# include Mkmf::Lite
|
95
|
+
# utsname = check_sizeof('struct utsname', 'sys/utsname.h')
|
96
|
+
# end
|
97
|
+
#
|
98
|
+
def check_sizeof(type, headers = [])
|
99
|
+
headers = get_header_string(headers)
|
100
|
+
erb = ERB.new(read_template('check_sizeof.erb'))
|
101
|
+
code = erb.result(binding)
|
102
|
+
|
103
|
+
try_to_execute(code)
|
104
|
+
end
|
105
|
+
|
79
106
|
private
|
80
107
|
|
81
108
|
# Take an array of header file names (or convert it to an array if it's a
|
@@ -92,8 +119,13 @@ module Mkmf
|
|
92
119
|
|
93
120
|
common_headers = Config::CONFIG['COMMON_HEADERS']
|
94
121
|
|
95
|
-
|
96
|
-
headers
|
122
|
+
if common_headers.nil? || common_headers.empty?
|
123
|
+
if headers.empty?
|
124
|
+
headers = ['stdio.h', 'stdlib.h']
|
125
|
+
headers += 'windows.h' if File::ALT_SEPARATOR
|
126
|
+
end
|
127
|
+
else
|
128
|
+
headers += common_headers.split
|
97
129
|
end
|
98
130
|
|
99
131
|
headers = headers.flatten.uniq
|
@@ -102,6 +134,49 @@ module Mkmf
|
|
102
134
|
headers
|
103
135
|
end
|
104
136
|
|
137
|
+
# Create a temporary bit of C source code in the temp directory, and
|
138
|
+
# try to compile it. If it succeeds attempt to run the generated code.
|
139
|
+
# The code generated is expected to print a number to STDOUT, which
|
140
|
+
# is then grabbed and returned as an integer.
|
141
|
+
#
|
142
|
+
# Note that $stderr is temporarily redirected to the null device because
|
143
|
+
# we don't actually care about the reason for failure, though a Ruby
|
144
|
+
# error is raised if the compilation step fails.
|
145
|
+
#
|
146
|
+
def try_to_execute(code)
|
147
|
+
begin
|
148
|
+
result = 0
|
149
|
+
|
150
|
+
stderr_orig = $stderr.dup
|
151
|
+
|
152
|
+
Dir.chdir(Dir.tmpdir){
|
153
|
+
File.open(@@cpp_srcfile, 'w'){ |fh| fh.write(code) }
|
154
|
+
|
155
|
+
command = @@cpp_command + ' '
|
156
|
+
command += @@cpp_outfile + ' '
|
157
|
+
command += @@cpp_srcfile
|
158
|
+
|
159
|
+
$stderr.reopen(File.null)
|
160
|
+
|
161
|
+
if system(command)
|
162
|
+
Open3.popen3("./conftest.i") do |stdin, stdout, stderr|
|
163
|
+
stdin.close
|
164
|
+
stderr.close
|
165
|
+
result = stdout.gets.chomp.to_i
|
166
|
+
end
|
167
|
+
else
|
168
|
+
raise "Failed to compile source code:\n===\n" + code + "==="
|
169
|
+
end
|
170
|
+
}
|
171
|
+
ensure
|
172
|
+
File.delete(@@cpp_srcfile) if File.exists?(@@cpp_srcfile)
|
173
|
+
File.delete(@@cpp_outfile) if File.exists?(@@cpp_outfile)
|
174
|
+
$stderr.reopen(stderr_orig)
|
175
|
+
end
|
176
|
+
|
177
|
+
result
|
178
|
+
end
|
179
|
+
|
105
180
|
# Create a temporary bit of C source code in the temp directory, and
|
106
181
|
# try to compile it. If it succeeds, return true. Otherwise, return
|
107
182
|
# false.
|
data/mkmf-lite.gemspec
CHANGED
@@ -3,7 +3,7 @@ require 'rubygems'
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = 'mkmf-lite'
|
5
5
|
spec.summary = 'A lighter version of mkmf designed for use as a library'
|
6
|
-
spec.version = '0.2.
|
6
|
+
spec.version = '0.2.2'
|
7
7
|
spec.author = 'Daniel J. Berger'
|
8
8
|
spec.license = 'Artistic 2.0'
|
9
9
|
spec.email = 'djberg96@gmail.com'
|
data/test/test_mkmf_lite.rb
CHANGED
@@ -22,7 +22,7 @@ class TC_Mkmf_Lite < Test::Unit::TestCase
|
|
22
22
|
end
|
23
23
|
|
24
24
|
test "version information" do
|
25
|
-
assert_equal('0.2.
|
25
|
+
assert_equal('0.2.2', MKMF_LITE_VERSION)
|
26
26
|
end
|
27
27
|
|
28
28
|
test "have_header basic functionality" do
|
@@ -82,6 +82,31 @@ class TC_Mkmf_Lite < Test::Unit::TestCase
|
|
82
82
|
}
|
83
83
|
end
|
84
84
|
|
85
|
+
test "check_sizeof basic functionality" do
|
86
|
+
assert_respond_to(self, :check_sizeof)
|
87
|
+
assert_nothing_raised{ check_sizeof('struct passwd', 'pwd.h') }
|
88
|
+
end
|
89
|
+
|
90
|
+
test "check_sizeof requires at least one argument" do
|
91
|
+
assert_raise(ArgumentError){ check_sizeof }
|
92
|
+
assert_raise(ArgumentError){ check_sizeof('struct passwd', 'pw_name', 1) }
|
93
|
+
end
|
94
|
+
|
95
|
+
test "check_sizeof accepts a maximum of two arguments" do
|
96
|
+
assert_raise(ArgumentError){ check_sizeof('div_t', 'stdlib.h', 1) }
|
97
|
+
end
|
98
|
+
|
99
|
+
test "check_sizeof works with one or two arguments" do
|
100
|
+
assert_nothing_raised{ check_sizeof('div_t') }
|
101
|
+
assert_nothing_raised{ check_sizeof('div_t', 'stdlib.h') }
|
102
|
+
end
|
103
|
+
|
104
|
+
test "check_sizeof returns an integer value" do
|
105
|
+
size = check_sizeof('struct passwd', 'pwd.h')
|
106
|
+
assert_kind_of(Integer, size)
|
107
|
+
assert_true(size > 0)
|
108
|
+
end
|
109
|
+
|
85
110
|
def teardown
|
86
111
|
@st_type = nil
|
87
112
|
@st_member = nil
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mkmf-lite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 19
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 2
|
10
|
+
version: 0.2.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Daniel J. Berger
|
@@ -15,8 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
19
|
-
default_executable:
|
18
|
+
date: 2011-12-06 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: ptools
|
@@ -61,6 +60,7 @@ extra_rdoc_files:
|
|
61
60
|
files:
|
62
61
|
- CHANGES
|
63
62
|
- lib/mkmf/lite.rb
|
63
|
+
- lib/mkmf/templates/check_sizeof.erb
|
64
64
|
- lib/mkmf/templates/have_func.erb
|
65
65
|
- lib/mkmf/templates/have_func_pointer.erb
|
66
66
|
- lib/mkmf/templates/have_header.erb
|
@@ -70,7 +70,6 @@ files:
|
|
70
70
|
- Rakefile
|
71
71
|
- README
|
72
72
|
- test/test_mkmf_lite.rb
|
73
|
-
has_rdoc: true
|
74
73
|
homepage: http://www.rubyforge.org/projects/shards
|
75
74
|
licenses:
|
76
75
|
- Artistic 2.0
|
@@ -100,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
100
99
|
requirements: []
|
101
100
|
|
102
101
|
rubyforge_project: shards
|
103
|
-
rubygems_version: 1.
|
102
|
+
rubygems_version: 1.8.10
|
104
103
|
signing_key:
|
105
104
|
specification_version: 3
|
106
105
|
summary: A lighter version of mkmf designed for use as a library
|