autorake 2.0
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/LICENSE +34 -0
- data/README +15 -0
- data/lib/autorake.rb +129 -0
- data/lib/autorake/application.rb +138 -0
- data/lib/autorake/compile.rb +134 -0
- data/lib/autorake/configure.rb +59 -0
- data/lib/autorake/definition.rb +300 -0
- data/lib/autorake/directories.rb +57 -0
- data/lib/autorake/mkconfig.rb +107 -0
- data/lib/autorake/version.rb +23 -0
- data/samples/justinst/Rakefile +30 -0
- data/samples/justinst/mkrf_conf +20 -0
- data/samples/justinst/plugin/dial.vim +17 -0
- data/samples/justinst/plugin/ruby.vim +97 -0
- data/samples/justinst/plugin/yesno.vim +40 -0
- data/samples/plainc/Rakefile +27 -0
- data/samples/plainc/hello.c +20 -0
- data/samples/plainc/mkrf_conf +20 -0
- data/samples/rbextend/Rakefile +23 -0
- data/samples/rbextend/hello.c +43 -0
- data/samples/rbextend/hello.h +11 -0
- data/samples/rbextend/mkrf_conf +20 -0
- data/samples/rbextend/rbhello +10 -0
- metadata +91 -0
@@ -0,0 +1,59 @@
|
|
1
|
+
#
|
2
|
+
# autorake/configure.rb -- Configure scripts
|
3
|
+
#
|
4
|
+
|
5
|
+
require "autorake/directories"
|
6
|
+
require "yaml"
|
7
|
+
|
8
|
+
module Autorake
|
9
|
+
|
10
|
+
class Configuration
|
11
|
+
|
12
|
+
CONFIG_FILE = ".configure"
|
13
|
+
|
14
|
+
attr_reader :directories
|
15
|
+
attr_reader :features, :parameters
|
16
|
+
attr_reader :incdirs, :headers, :macros, :libdirs, :libs
|
17
|
+
|
18
|
+
def initialize environment, directories
|
19
|
+
@environment = {}
|
20
|
+
environment.each { |k,v| @environment[ k] = v }
|
21
|
+
@directories = directories
|
22
|
+
@features = {}
|
23
|
+
@parameters = {}
|
24
|
+
@incdirs = []
|
25
|
+
@headers = []
|
26
|
+
@macros = {}
|
27
|
+
@libdirs = []
|
28
|
+
@libs = []
|
29
|
+
end
|
30
|
+
|
31
|
+
def do_env
|
32
|
+
@environment.each { |k,v| ENV[ k] = v }
|
33
|
+
end
|
34
|
+
|
35
|
+
def dump
|
36
|
+
puts "Environment:"
|
37
|
+
@environment.each { |k,v| puts " #{k}=#{v}" }
|
38
|
+
puts "Directories:"
|
39
|
+
@directories.keys.each { |k| puts " #{k}=#{@directories.expanded k}" }
|
40
|
+
puts "Features:"
|
41
|
+
@features.each { |k,v| puts " #{k}=#{v}" }
|
42
|
+
puts "Parameters:"
|
43
|
+
@parameters.each { |k,v| puts " #{k}=#{v}" }
|
44
|
+
puts "Include directories:"
|
45
|
+
@incdirs.each { |d| puts " #{d}" }
|
46
|
+
puts "Header files:"
|
47
|
+
@headers.each { |h| puts " #{h}" }
|
48
|
+
puts "C Macros:"
|
49
|
+
@macros.each { |k,v| puts " #{k}=#{v}" }
|
50
|
+
puts "Library directories:"
|
51
|
+
@libdirs.each { |d| puts " #{d}" }
|
52
|
+
puts "Libraries:"
|
53
|
+
@libs.each { |l| puts " #{l}" }
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
@@ -0,0 +1,300 @@
|
|
1
|
+
#
|
2
|
+
# autorake/definition.rb -- Definitions to produce a config
|
3
|
+
#
|
4
|
+
|
5
|
+
require "autorake/compile"
|
6
|
+
require "autorake/configure"
|
7
|
+
|
8
|
+
module Autorake
|
9
|
+
|
10
|
+
class Definitions
|
11
|
+
|
12
|
+
attr_reader :environment, :directories, :features
|
13
|
+
def parameters ; @args[ :par] ; end
|
14
|
+
def incpath ; @args[ :inc] ; end
|
15
|
+
def libpath ; @args[ :lib] ; end
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@environment = {}
|
19
|
+
@directories = Directories.new
|
20
|
+
@features = {}
|
21
|
+
@args = { :par => {}, :inc => {}, :lib => {}, }
|
22
|
+
@checks = []
|
23
|
+
end
|
24
|
+
|
25
|
+
def dump
|
26
|
+
c = perform
|
27
|
+
c.dump
|
28
|
+
end
|
29
|
+
|
30
|
+
def perform
|
31
|
+
Compiler.quiet = true
|
32
|
+
c = Configuration.new @environment, @directories
|
33
|
+
c.do_env
|
34
|
+
c.features.update @features
|
35
|
+
c.incdirs.push std_incdir
|
36
|
+
c.libdirs.push std_libdir
|
37
|
+
af = @features.keys.map { |k| AddFeature.new k }
|
38
|
+
am = @args[ :par].map { |k,v| AddMacro.new k, v }
|
39
|
+
ai = @args[ :inc].map { |k,v| AddIncdir.new k, v }
|
40
|
+
al = @args[ :lib].map { |k,v| AddLibdir.new k, v }
|
41
|
+
[ af, am, ai, al, @checks].each { |a| a.each { |k| k.perform c } }
|
42
|
+
c
|
43
|
+
end
|
44
|
+
|
45
|
+
protected
|
46
|
+
|
47
|
+
def std_incdir ; @directories.expand "INCLUDE" ; end
|
48
|
+
def std_libdir ; @directories.expand "LIB" ; end
|
49
|
+
|
50
|
+
def directory name, dir
|
51
|
+
@directories[ name]= dir
|
52
|
+
end
|
53
|
+
|
54
|
+
def feature name, enabled = nil
|
55
|
+
name = name.to_sym
|
56
|
+
@current and raise "Features may not be nested."
|
57
|
+
@current = name
|
58
|
+
@features[ name] = enabled
|
59
|
+
yield if block_given?
|
60
|
+
ensure
|
61
|
+
@current = nil
|
62
|
+
end
|
63
|
+
def enable name, &block
|
64
|
+
feature name, true, &block
|
65
|
+
end
|
66
|
+
def disable name, &block
|
67
|
+
feature name, false, &block
|
68
|
+
end
|
69
|
+
|
70
|
+
def with name, val ; argdef :par, name, val ; end
|
71
|
+
|
72
|
+
def incdir name, dir ; argdef :inc, name, dir ; end
|
73
|
+
def libdir name, dir ; argdef :lib, name, dir ; end
|
74
|
+
|
75
|
+
def extending_ruby
|
76
|
+
if RUBY_VERSION < "1.9" then
|
77
|
+
incdir :ruby, RbConfig::CONFIG[ "topdir"]
|
78
|
+
else
|
79
|
+
h = RbConfig::CONFIG[ "rubyhdrdir"]
|
80
|
+
incdir :ruby, h
|
81
|
+
incdir :ruby_arch, (File.join h, RbConfig::CONFIG[ "arch"])
|
82
|
+
#incdir :ruby_backward, (File.join h, "ruby/backward")
|
83
|
+
end
|
84
|
+
libdir :ruby, RbConfig::CONFIG[ "libdir"]
|
85
|
+
l = RbConfig::CONFIG[ "LIBRUBY"]
|
86
|
+
l.slice! /\Alib/
|
87
|
+
l.slice! /\.so(?:\..*)?\z/
|
88
|
+
have_library l
|
89
|
+
end
|
90
|
+
|
91
|
+
def have_header name
|
92
|
+
c = CheckHeader.new @current, name
|
93
|
+
@checks.push c
|
94
|
+
end
|
95
|
+
|
96
|
+
def have_macro name
|
97
|
+
c = CheckMacro.new @current, name
|
98
|
+
@checks.push c
|
99
|
+
end
|
100
|
+
|
101
|
+
def have_func name
|
102
|
+
c = CheckFunction.new @current, name
|
103
|
+
@checks.push c
|
104
|
+
end
|
105
|
+
|
106
|
+
def have_library name
|
107
|
+
c = CheckLibrary.new @current, name
|
108
|
+
@checks.push c
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
def argdef type, name, dir
|
114
|
+
return unless dir
|
115
|
+
dir.chomp!
|
116
|
+
return if dir.empty?
|
117
|
+
name = "#@current/#{name}" if @current
|
118
|
+
@args[ type][ name.to_sym] = dir
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
|
124
|
+
class Add
|
125
|
+
def initialize feature, name
|
126
|
+
@feature, @name = feature, name
|
127
|
+
end
|
128
|
+
def perform config
|
129
|
+
@config = config
|
130
|
+
check! and set!
|
131
|
+
ensure
|
132
|
+
@config = nil
|
133
|
+
end
|
134
|
+
private
|
135
|
+
def check!
|
136
|
+
not @feature or
|
137
|
+
@config.features[ @feature]
|
138
|
+
end
|
139
|
+
def set!
|
140
|
+
end
|
141
|
+
def name_upcase
|
142
|
+
r = @name.to_s.upcase
|
143
|
+
r.gsub! /[^A-Z_]/, "_"
|
144
|
+
r
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
class AddFeature < Add
|
149
|
+
def initialize feature
|
150
|
+
super feature, feature
|
151
|
+
end
|
152
|
+
def set!
|
153
|
+
@config.macros[ "FEATURE_#{name_upcase}"] = true
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
class AddKeyVal < Add
|
158
|
+
def initialize key, val
|
159
|
+
x, y = key.to_s.split "/"
|
160
|
+
if y then
|
161
|
+
x = x.to_sym
|
162
|
+
else
|
163
|
+
x, y = nil, x
|
164
|
+
end
|
165
|
+
super x, y.to_sym
|
166
|
+
@val = val
|
167
|
+
end
|
168
|
+
private
|
169
|
+
def expanded
|
170
|
+
@config.directories.expand @val
|
171
|
+
end
|
172
|
+
end
|
173
|
+
class AddMacro < AddKeyVal
|
174
|
+
def set!
|
175
|
+
@config.parameters[ @name] = @val
|
176
|
+
@config.macros[ "WITH_#{name_upcase}"] = @val
|
177
|
+
end
|
178
|
+
end
|
179
|
+
class AddIncdir < AddKeyVal
|
180
|
+
def set!
|
181
|
+
@config.incdirs.push expanded
|
182
|
+
end
|
183
|
+
end
|
184
|
+
class AddLibdir < AddKeyVal
|
185
|
+
def set!
|
186
|
+
@config.libdirs.push expanded
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
class Check < Add
|
191
|
+
private
|
192
|
+
def check!
|
193
|
+
super or return
|
194
|
+
print "Checking for #{self.class::TYPE} #@name ... "
|
195
|
+
res = TmpFiles.open build_source do |t|
|
196
|
+
compile t
|
197
|
+
end
|
198
|
+
print "yes"
|
199
|
+
true
|
200
|
+
rescue Compiler::Error
|
201
|
+
print "no"
|
202
|
+
false
|
203
|
+
ensure
|
204
|
+
puts
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
class CheckHeader < Check
|
209
|
+
TYPE = "header"
|
210
|
+
private
|
211
|
+
def build_source
|
212
|
+
<<-SRC
|
213
|
+
#include <#@name>
|
214
|
+
SRC
|
215
|
+
end
|
216
|
+
def compile t
|
217
|
+
c = CompilerPP.new @config.incdirs, @config.macros, "-w"
|
218
|
+
c.cc t.cpp, t.src
|
219
|
+
end
|
220
|
+
def set!
|
221
|
+
@config.macros[ "HAVE_HEADER_#{name_upcase}"] = true
|
222
|
+
@config.headers.push @name
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
class CheckWithHeaders < Check
|
227
|
+
private
|
228
|
+
def build_source
|
229
|
+
src = ""
|
230
|
+
@config.headers.each { |i|
|
231
|
+
src << <<-SRC
|
232
|
+
#include <#{i}>
|
233
|
+
SRC
|
234
|
+
}
|
235
|
+
src
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
class CheckMacro < CheckWithHeaders
|
240
|
+
TYPE = "macro"
|
241
|
+
private
|
242
|
+
def build_source
|
243
|
+
super << <<-SRC
|
244
|
+
#ifndef #@name
|
245
|
+
#error not defined
|
246
|
+
#endif
|
247
|
+
SRC
|
248
|
+
end
|
249
|
+
def compile t
|
250
|
+
c = CompilerPP.new @config.incdirs, @config.macros, "-w"
|
251
|
+
c.cc t.cpp, t.src
|
252
|
+
end
|
253
|
+
def check!
|
254
|
+
super or raise "Macro not defined: #@name."
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
class CheckFunction < CheckWithHeaders
|
259
|
+
TYPE = "function"
|
260
|
+
private
|
261
|
+
def build_source
|
262
|
+
super << <<-SRC
|
263
|
+
void dummy( void)
|
264
|
+
{
|
265
|
+
void (*f)( void) = (void (*)( void)) #@name;
|
266
|
+
}
|
267
|
+
SRC
|
268
|
+
end
|
269
|
+
def compile t
|
270
|
+
c = CompilerC.new @config.incdirs, @config.macros, "-w"
|
271
|
+
c.cc t.obj, t.src
|
272
|
+
end
|
273
|
+
def set!
|
274
|
+
@config.macros[ "HAVE_FUNC_#{name_upcase}"] = true
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
class CheckLibrary < Check
|
279
|
+
TYPE = "library"
|
280
|
+
def build_source
|
281
|
+
<<-SRC
|
282
|
+
int main( int argc, char *argv[]) { return 0; }
|
283
|
+
SRC
|
284
|
+
end
|
285
|
+
def compile t
|
286
|
+
c = CompilerC.new @config.incdirs, @config.macros, "-w"
|
287
|
+
c.cc t.obj, t.src
|
288
|
+
l = Linker.new @config.libdirs, [ @name], "-w"
|
289
|
+
l.cc t.bin, t.obj
|
290
|
+
end
|
291
|
+
def check!
|
292
|
+
super or raise "Library missing: #@name."
|
293
|
+
end
|
294
|
+
def set!
|
295
|
+
@config.libs.push @name
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
end
|
300
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#
|
2
|
+
# autorake/directories.rb -- Directory shortcuts
|
3
|
+
#
|
4
|
+
|
5
|
+
module Autorake
|
6
|
+
|
7
|
+
class Directories < Hash
|
8
|
+
|
9
|
+
STD = {
|
10
|
+
:prefix => "/usr/local",
|
11
|
+
:eprefix => "PREFIX",
|
12
|
+
:cprefix => "EPREFIX",
|
13
|
+
:bin => "EPREFIX/bin",
|
14
|
+
:sbin => "EPREFIX/sbin",
|
15
|
+
:libexec => "EPREFIX/libexec",
|
16
|
+
:sysconf => "CPREFIX/etc",
|
17
|
+
:localstate => "/var",
|
18
|
+
:lib => "EPREFIX/lib",
|
19
|
+
:include => "PREFIX/include",
|
20
|
+
:data => "PREFIX/share",
|
21
|
+
:info => "DATA/info",
|
22
|
+
:locale => "DATA/locale",
|
23
|
+
:man => "DATA/man",
|
24
|
+
}
|
25
|
+
|
26
|
+
def initialize
|
27
|
+
super
|
28
|
+
update STD
|
29
|
+
end
|
30
|
+
|
31
|
+
def [] key
|
32
|
+
super key.to_sym
|
33
|
+
end
|
34
|
+
|
35
|
+
def []= key, value
|
36
|
+
super key.to_sym, value
|
37
|
+
end
|
38
|
+
|
39
|
+
def expanded key
|
40
|
+
expand self[ key]
|
41
|
+
end
|
42
|
+
|
43
|
+
def expand dir
|
44
|
+
case dir
|
45
|
+
when /\A[A-Z_]+/ then
|
46
|
+
(expand self[ $&.downcase]) + $'
|
47
|
+
when /\A:(\w+)/ then
|
48
|
+
(expand self[ $1]) + $'
|
49
|
+
else
|
50
|
+
dir
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
@@ -0,0 +1,107 @@
|
|
1
|
+
#
|
2
|
+
# autorake/mkconfig.rb -- Make configuration
|
3
|
+
#
|
4
|
+
|
5
|
+
require "autorake/definition"
|
6
|
+
require "autorake/application"
|
7
|
+
|
8
|
+
module Autorake
|
9
|
+
|
10
|
+
class <<self
|
11
|
+
def configure &block
|
12
|
+
d = Definitions.new
|
13
|
+
d.instance_eval &block
|
14
|
+
p = MkConfig.new d
|
15
|
+
p.run
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
class MkConfig < Application
|
22
|
+
|
23
|
+
attr_accessor :outfile
|
24
|
+
attr_bang :clean, :verbose
|
25
|
+
|
26
|
+
def initialize definition
|
27
|
+
@definition = definition
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def define_options
|
33
|
+
add_option %w(o outfile), "specify output file",
|
34
|
+
Configuration::CONFIG_FILE, :outfile=
|
35
|
+
add_option %w(c clean), "delete config file resp. -o outfile",
|
36
|
+
nil, :clean!
|
37
|
+
add_option %w(d dump), "just dump the results", nil, :dump
|
38
|
+
add_option %w(v verbose), "lots of ubly debugging information",
|
39
|
+
nil, :verbose!
|
40
|
+
super
|
41
|
+
@definition.directories.each { |k,v|
|
42
|
+
add_option %W(dir-#{k}), "set directory #{k}", v, :set_dir, k
|
43
|
+
}
|
44
|
+
@definition.features.each { |k,v|
|
45
|
+
de, dd = "[default]", nil
|
46
|
+
de, dd = dd, de unless v
|
47
|
+
add_option %W(enable-#{k}), "enable #{k} #{de}", nil,
|
48
|
+
:set_feature, k, true
|
49
|
+
add_option %W(disable-#{k}), "disable #{k} #{dd}", nil,
|
50
|
+
:set_feature, k, false
|
51
|
+
}
|
52
|
+
@definition.parameters.each { |k,v|
|
53
|
+
add_option %W(with-#{k}), "define a parameter and C macro #{k}", v,
|
54
|
+
:set_parm, k
|
55
|
+
}
|
56
|
+
@definition.incpath.each { |k,v|
|
57
|
+
add_option %W(incdir-#{k}), "include directory #{k}", v, :set_incdir, k
|
58
|
+
}
|
59
|
+
@definition.libpath.each { |k,v|
|
60
|
+
add_option %W(libdir-#{k}), "library directory #{k}", v, :set_libdir, k
|
61
|
+
}
|
62
|
+
end
|
63
|
+
|
64
|
+
def set_dir name, val
|
65
|
+
@definition.directories[ name] = val
|
66
|
+
end
|
67
|
+
|
68
|
+
def set_feature name, val
|
69
|
+
@definition.features[ name.to_sym] = val
|
70
|
+
end
|
71
|
+
|
72
|
+
def set_parm name, val
|
73
|
+
@definition.parameters[ name.to_sym] = val
|
74
|
+
end
|
75
|
+
|
76
|
+
def set_incdir name, val
|
77
|
+
@definition.incpath[ name.to_sym] = val
|
78
|
+
end
|
79
|
+
|
80
|
+
def set_libdir name, val
|
81
|
+
@definition.libpath[ name.to_sym] = val
|
82
|
+
end
|
83
|
+
|
84
|
+
def dump
|
85
|
+
@definition.dump
|
86
|
+
raise Done
|
87
|
+
end
|
88
|
+
|
89
|
+
def environ name, val
|
90
|
+
@definition.environment[ name] = val
|
91
|
+
end
|
92
|
+
|
93
|
+
def execute
|
94
|
+
if @clean then
|
95
|
+
File.unlink @outfile if File.file? @outfile
|
96
|
+
else
|
97
|
+
cfg = @definition.perform
|
98
|
+
File.open @outfile, "w" do |f|
|
99
|
+
f.write cfg.to_yaml
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|