rant 0.5.6 → 0.5.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/NEWS +12 -0
  2. data/README +3 -3
  3. data/Rantfile +7 -1
  4. data/doc/Untitled-1~ +7 -0
  5. data/doc/command.rdoc +1 -1
  6. data/doc/csharp.rdoc +49 -72
  7. data/doc/csharp.rdoc~ +37 -0
  8. data/doc/csharp_deprecated.rdoc +73 -0
  9. data/doc/homepage/index.html +5 -8
  10. data/doc/homepage/index.html~ +134 -0
  11. data/doc/sys.rdoc +14 -0
  12. data/lib/rant/coregen.rb~ +262 -0
  13. data/lib/rant/csharp/base_compiler_adapter.rb +125 -0
  14. data/lib/rant/csharp/base_compiler_adapter.rb~ +105 -0
  15. data/lib/rant/csharp/compiler_adapter_factory.rb +40 -0
  16. data/lib/rant/csharp/compiler_adapter_factory.rb~ +39 -0
  17. data/lib/rant/csharp/csc_compiler.rb +15 -0
  18. data/lib/rant/csharp/csc_compiler.rb~ +39 -0
  19. data/lib/rant/csharp/gmcs_compiler.rb +9 -0
  20. data/lib/rant/csharp/gmcs_compiler.rb~ +10 -0
  21. data/lib/rant/csharp/mcs_compiler.rb +13 -0
  22. data/lib/rant/csharp/mcs_compiler.rb~ +40 -0
  23. data/lib/rant/csharp/msc_compiler.rb~ +39 -0
  24. data/lib/rant/import/csharp.rb +48 -0
  25. data/lib/rant/import/csharp.rb~ +58 -0
  26. data/lib/rant/import/nunittest.rb +32 -0
  27. data/lib/rant/import/resgen.rb +21 -0
  28. data/lib/rant/import/resgen.rb~ +20 -0
  29. data/lib/rant/init.rb +1 -1
  30. data/lib/rant/rantlib.rb +1 -0
  31. data/lib/rant/rantlib.rb~ +1376 -0
  32. data/lib/rant/rantsys.rb +6 -0
  33. data/run_import +1 -1
  34. data/run_rant +1 -1
  35. data/test/import/package/test_package.rb~ +628 -0
  36. data/test/rule.rf +4 -0
  37. data/test/test_filetask.rb~ +97 -0
  38. data/test/test_rule.rb +10 -0
  39. data/test/test_sys_methods.rb +22 -0
  40. data/test/units/csharp/test_base_compiler_adapter.rb +107 -0
  41. data/test/units/csharp/test_base_compiler_adapter.rb~ +73 -0
  42. data/test/units/csharp/test_compiler_adapter_factory.rb +66 -0
  43. data/test/units/csharp/test_compiler_adapter_factory.rb~ +66 -0
  44. data/test/units/csharp/test_csc_compiler.rb +23 -0
  45. data/test/units/csharp/test_csc_compiler.rb~ +23 -0
  46. data/test/units/csharp/test_gmsc_compiler.rb +19 -0
  47. data/test/units/csharp/test_gmsc_compiler.rb~ +19 -0
  48. data/test/units/csharp/test_msc_compiler.rb +23 -0
  49. data/test/units/csharp/test_msc_compiler.rb~ +23 -0
  50. data/test/units/csharp_test_helper.rb +6 -0
  51. data/test/units/import/test_csharp.rb +127 -0
  52. data/test/units/import/test_csharp.rb~ +126 -0
  53. data/test/units/import/test_nunittest.rb +122 -0
  54. data/test/units/import/test_resgen.rb +107 -0
  55. data/test/units/import/test_resgen.rb~ +88 -0
  56. metadata +269 -224
@@ -607,6 +607,20 @@ standard output:
607
607
  sys.root_dir?("C:/") # true
608
608
  sys.root_dir?("bin") # false
609
609
 
610
+ * <b>absolute_path?(path)</b>
611
+
612
+ Returns true if the given path is an absolute path, false otherwise.
613
+
614
+ Examples:
615
+
616
+ # on all systems:
617
+ sys.absolute_path?("/home/me/main.c") # true
618
+ sys.absolute_path?("main.c") # false
619
+
620
+ # on windows:
621
+ sys.absolute_path?("C:\\Programs") # true
622
+ sys.absolute_path?("C:/Programs") # true
623
+
610
624
  == See also
611
625
 
612
626
  Rantfile basics::
@@ -0,0 +1,262 @@
1
+
2
+ # coregen.rb - Generators available in all Rantfiles.
3
+ #
4
+ # Copyright (C) 2005 Stefan Lang <langstefan@gmx.at>
5
+
6
+ module Rant
7
+ module Generators
8
+ class Task
9
+ def self.rant_gen(rac, ch, args, &block)
10
+ unless args.size == 1
11
+ rac.abort("Task takes only one argument " +
12
+ "which has to be like one given to the " +
13
+ "`task' function")
14
+ end
15
+ rac.prepare_task(args.first, nil, ch) { |name,pre,blk|
16
+ rac.node_factory.new_custom(rac, name, pre, block)
17
+ }
18
+ end
19
+ end
20
+ class Directory
21
+ # Generate a task for making a directory path.
22
+ # Prerequisites can be given, which will be added as
23
+ # prerequistes for the _last_ directory.
24
+ #
25
+ # A special feature is used if you provide a block: The
26
+ # block will be called after complete directory creation.
27
+ # After the block execution, the modification time of the
28
+ # directory will be updated.
29
+ def self.rant_gen(rac, ch, args, &block)
30
+ case args.size
31
+ when 1
32
+ name, pre = rac.normalize_task_arg(args.first, ch)
33
+ self.task(rac, ch, name, pre, &block)
34
+ when 2
35
+ basedir = args.shift
36
+ if basedir.respond_to? :to_str
37
+ basedir = basedir.to_str
38
+ else
39
+ rac.abort_at(ch,
40
+ "Directory: basedir argument has to be a string.")
41
+ end
42
+ name, pre = rac.normalize_task_arg(args.first, ch)
43
+ self.task(rac, ch, name, pre, basedir, &block)
44
+ else
45
+ rac.abort_at(ch, "Directory takes one argument, " +
46
+ "which should be like one given to the `task' command.")
47
+ end
48
+ end
49
+
50
+ # Returns the task which creates the last directory
51
+ # element (and has all other necessary directories as
52
+ # prerequisites).
53
+ def self.task(rac, ch, name, prerequisites=[], basedir=nil, &block)
54
+ dirs = ::Rant::Sys.split_all(name)
55
+ if dirs.empty?
56
+ rac.abort_at(ch,
57
+ "Not a valid directory name: `#{name}'")
58
+ end
59
+ path = basedir
60
+ last_task = nil
61
+ task_block = nil
62
+ desc_for_last = rac.pop_desc
63
+ dirs.each { |dir|
64
+ pre = [path]
65
+ pre.compact!
66
+ if dir.equal?(dirs.last)
67
+ rac.cx.desc desc_for_last
68
+
69
+ # add prerequisites to pre
70
+ # if prerequisites is a FileList: there is
71
+ # only one save (no later removal) way to add
72
+ # an entry: with <<
73
+ dp = prerequisites.dup
74
+ pre.each { |elem| dp << elem }
75
+ pre = dp
76
+
77
+ task_block = block
78
+ end
79
+ path = path.nil? ? dir : File.join(path, dir)
80
+ last_task = rac.prepare_task({:__caller__ => ch,
81
+ path => pre}, task_block) { |name,pre,blk|
82
+ rac.node_factory.new_dir(rac, name, pre, blk)
83
+ }
84
+ }
85
+ last_task
86
+ end
87
+ end # class Directory
88
+ class SourceNode
89
+ def self.rant_gen(rac, ch, args)
90
+ unless args.size == 1
91
+ rac.abort_at(ch, "SourceNode takes one argument.")
92
+ end
93
+ if block_given?
94
+ rac.abort_at(ch, "SourceNode doesn't take a block.")
95
+ end
96
+ rac.prepare_task(args.first, nil, ch) { |name, pre, blk|
97
+ rac.node_factory.new_source(rac, name, pre, blk)
98
+ }
99
+ end
100
+ end
101
+ class Rule
102
+ # Generate a rule by installing an at_resolve hook for
103
+ # +rac+.
104
+ def self.rant_gen(rac, ch, args, &block)
105
+ unless args.size == 1
106
+ rac.abort_at(ch, "Rule takes only one argument.")
107
+ end
108
+ rac.abort_at(ch, "Rule: block required.") unless block
109
+ arg = args.first
110
+ target = nil
111
+ src_arg = nil
112
+ if Symbol === arg
113
+ target = ".#{arg}"
114
+ elsif arg.respond_to? :to_str
115
+ target = arg.to_str
116
+ elsif Regexp === arg
117
+ target = arg
118
+ elsif Hash === arg && arg.size == 1
119
+ arg.each_pair { |target, src_arg| }
120
+ src_arg = src_arg.to_str if src_arg.respond_to? :to_str
121
+ target = target.to_str if target.respond_to? :to_str
122
+ src_arg = ".#{src_arg}" if Symbol === src_arg
123
+ target = ".#{target}" if Symbol === target
124
+ else
125
+ rac.abort_at(ch, "Rule argument " +
126
+ "has to be a hash with one key-value pair.")
127
+ end
128
+ esc_target = nil
129
+ target_rx = case target
130
+ when String
131
+ esc_target = Regexp.escape(target)
132
+ /#{esc_target}$/
133
+ when Regexp
134
+ target
135
+ else
136
+ rac.abort_at(ch, "rule target has " +
137
+ "to be a string or regular expression")
138
+ end
139
+ src_proc = case src_arg
140
+ when String, Array
141
+ unless String === target
142
+ rac.abort(ch, "rule target has to be " +
143
+ "a string if source is a string")
144
+ end
145
+ if src_arg.kind_of? String
146
+ lambda { |name|
147
+ name.sub(/#{esc_target}$/, src_arg)
148
+ }
149
+ else
150
+ lambda { |name|
151
+ src_arg.collect { |s_src|
152
+ s_src = ".#{s_src}" if Symbol === s_src
153
+ name.sub(/#{esc_target}$/, s_src)
154
+ }
155
+ }
156
+ end
157
+ when Proc: src_arg
158
+ when nil: lambda { |name| [] }
159
+ else
160
+ rac.abort_at(ch, "rule source has to be a " +
161
+ "String, Array or Proc")
162
+ end
163
+ rac.resolve_hooks <<
164
+ (block.arity == 2 ? Hook : FileHook).new(
165
+ rac, ch, target_rx, src_proc, block)
166
+ nil
167
+ end
168
+ class Hook
169
+ attr_accessor :target_rx
170
+ def initialize(rant, ch, target_rx, src_proc, block)
171
+ @rant = rant
172
+ @ch = ch
173
+ @target_rx = target_rx
174
+ @src_proc = src_proc
175
+ @block = block
176
+ end
177
+ def call(target, rel_project_dir)
178
+ if @target_rx =~ target
179
+ have_src = true
180
+ src = @src_proc[target]
181
+ if src.respond_to? :to_ary
182
+ have_src = src.to_ary.all? { |s|
183
+ have_src?(rel_project_dir, s)
184
+ }
185
+ else
186
+ have_src = have_src?(rel_project_dir, src)
187
+ end
188
+ if have_src
189
+ create_nodes(rel_project_dir, target, src)
190
+ end
191
+ end
192
+ end
193
+ alias [] call
194
+ private
195
+ def have_src?(rel_project_dir, name)
196
+ return true unless
197
+ @rant.rec_save_resolve(name, self, rel_project_dir).empty?
198
+ test(?e, @rant.abs_path(rel_project_dir, name))
199
+ end
200
+ def create_nodes(rel_project_dir, target, deps)
201
+ @rant.goto_project_dir rel_project_dir
202
+ case nodes = @block[target, deps]
203
+ when Array: nodes
204
+ when Node: [nodes]
205
+ else
206
+ @rant.abort_at(@ch, "Block has to " +
207
+ "return Node or array of Nodes.")
208
+ end
209
+ end
210
+ end
211
+ class FileHook < Hook
212
+ private
213
+ def have_src?(rel_project_dir, name)
214
+ test(?e, @rant.abs_path(rel_project_dir, name)) or
215
+ @rant.rec_save_resolve(name, self, rel_project_dir
216
+ ).any? { |t| t.file_target? }
217
+ end
218
+ def create_nodes(rel_project_dir, target, deps)
219
+ @rant.goto_project_dir rel_project_dir
220
+ t = @rant.file(:__caller__ => @ch,
221
+ target => deps, &@block)
222
+ [t]
223
+ end
224
+ end
225
+ end # class Rule
226
+ class Action
227
+ def self.rant_gen(rac, ch, args, &block)
228
+ case args.size
229
+ when 0:
230
+ unless (rac[:tasks] || rac[:stop_after_load])
231
+ yield
232
+ end
233
+ when 1:
234
+ rx = args.first
235
+ unless rx.kind_of? Regexp
236
+ rac.abort_at(ch, "Action: argument has " +
237
+ "to be a regular expression.")
238
+ end
239
+ rac.resolve_hooks << self.new(rac, block, rx)
240
+ nil
241
+ else
242
+ rac.abort_at(ch, "Action: too many arguments.")
243
+ end
244
+ end
245
+ def initialize(rant, block, rx)
246
+ @rant = rant
247
+ @subdir = @rant.current_subdir
248
+ @block = block
249
+ @rx = rx
250
+ end
251
+ def call(target, rel_project_dir)
252
+ if target =~ @rx
253
+ @rant.resolve_hooks.delete(self)
254
+ @rant.goto_project_dir @subdir
255
+ @block.call
256
+ @rant.resolve(target, rel_project_dir)
257
+ end
258
+ end
259
+ alias [] call
260
+ end
261
+ end # module Generators
262
+ end # module Rant
@@ -0,0 +1,125 @@
1
+ # Helper method to add a to_cs_arg method to a class (yay meta!)
2
+ def add_to_cs_arg_method klass, &block
3
+ klass.instance_eval { define_method :to_cs_arg, &block }
4
+ end
5
+
6
+ def add_to_cmd_array klass, &block
7
+ klass.instance_eval { define_method :to_cmd_array, &block}
8
+ end
9
+
10
+ # Methods to convert types into arguments for the compiler
11
+ add_to_cs_arg_method(Object) do |key, compiler|
12
+ compiler.string_argument(key, self.to_s)
13
+ end
14
+
15
+ add_to_cs_arg_method(TrueClass) do |key, compiler|
16
+ compiler.boolean_argument(key, true)
17
+ end
18
+
19
+ add_to_cs_arg_method(FalseClass) do |key, compiler|
20
+ compiler.boolean_argument(key, false)
21
+ end
22
+
23
+ add_to_cs_arg_method(Array) do |key, compiler|
24
+ self.collect {|x| x.to_cs_arg(key, compiler) }
25
+ end
26
+
27
+ add_to_cmd_array(Object) do |context|
28
+ [context.sys.sp(self.to_s)]
29
+ end
30
+
31
+ add_to_cmd_array(Array) do |context|
32
+ self.collect {|x| context.sys.sp(x) }
33
+ end
34
+
35
+ add_to_cmd_array(Rant::FileList) do |context|
36
+ [self.arglist]
37
+ end
38
+
39
+ module Rant::CSharp
40
+ class BaseCompilerAdapter
41
+ attr_accessor :bin
42
+ attr_accessor :switch_map
43
+
44
+ def initialize bin = ""
45
+ @bin = bin
46
+ @switch_map = {}
47
+ raise Exception.new("Must specify an executable") if !@bin ||
48
+ @bin.length == 0
49
+ end
50
+
51
+ def cmd target, cs_args, context
52
+ @context = context
53
+
54
+ if !target || target.length == 0
55
+ raise Exception.new("Target must be specified and have a length " +
56
+ "greater than 0")
57
+ end
58
+
59
+ # Generic argument processing
60
+ args = []
61
+ sources = cs_args.delete(:sources)
62
+ cs_args[:target] ||= guess_target(target)
63
+
64
+ cs_args.each_key do |key|
65
+ args.push(cs_args[key].to_cs_arg(key, self))
66
+ end
67
+
68
+ src_list = sources.to_cmd_array(context)
69
+
70
+ ([bin, outfile(target)] + args.flatten + src_list).join(' ')
71
+ end
72
+
73
+ # Map rant arguments to compiler arguments
74
+ def map_arg arg
75
+ switch_map[arg] ? switch_map[arg] : arg
76
+ end
77
+
78
+ def outfile target
79
+ string_argument "out", target
80
+ end
81
+
82
+ def boolean_argument arg, on
83
+ switch = map_arg(arg)
84
+ ret = "#{self.argument_prefix}#{switch}"
85
+ ret += on ? "" : "-"
86
+ end
87
+
88
+ def string_argument arg, value
89
+ switch = map_arg(arg)
90
+ # Assume all string arguments except target are
91
+ # files
92
+ value = @context.sys.sp(value) if arg != :target
93
+
94
+ "#{self.argument_prefix}#{switch}:#{value}"
95
+ end
96
+
97
+ def argument_prefix
98
+ ""
99
+ end
100
+
101
+ # Try to automatically guess the type of output file
102
+ # based on the extension
103
+ def guess_target outfile
104
+ target = "library"
105
+
106
+ ext = outfile.match(/\.([^\.]+)$/)
107
+ ext = ext[1] if ext
108
+
109
+ if ext
110
+ case ext.downcase
111
+ when "netmodule"
112
+ target = map_target("module")
113
+ when "exe"
114
+ target = map_target("winexe")
115
+ end
116
+ end
117
+ target
118
+ end
119
+
120
+ # Allows subclasses to override default target names
121
+ def map_target target
122
+ target
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,105 @@
1
+ # Helper method to add a to_cs_arg method to a class (yay meta!)
2
+ def add_to_cs_arg_method klass, &block
3
+ klass.instance_eval { define_method :to_cs_arg, &block }
4
+ end
5
+
6
+ def add_to_cmd_array klass, &block
7
+ klass.instance_eval { define_method :to_cmd_array, &block}
8
+ end
9
+
10
+ # Methods to convert types into arguments for the compiler
11
+ add_to_cs_arg_method(Object) {|key, compiler| compiler.string_argument(key, self.to_s) }
12
+ add_to_cs_arg_method(TrueClass) {|key, compiler| compiler.boolean_argument(key, true) }
13
+ add_to_cs_arg_method(FalseClass) {|key, compiler| compiler.boolean_argument(key, false) }
14
+ add_to_cs_arg_method(Array) {|key, compiler| self.collect {|x| x.to_cs_arg(key, compiler) } }
15
+
16
+ add_to_cmd_array(Object) { |context| [context.sys.sp(self.to_s)] }
17
+ add_to_cmd_array(Array) { |context| self.collect {|x| context.sys.sp(x) }}
18
+ add_to_cmd_array(Rant::FileList) { |context| [self.arglist] }
19
+
20
+ module Rant::CSharp
21
+ class BaseCompilerAdapter
22
+ attr_accessor :bin
23
+ attr_accessor :switch_map
24
+
25
+ def initialize bin = ""
26
+ @bin = bin
27
+ @switch_map = {}
28
+ raise Exception.new("Must specify an executable") if !@bin || @bin.length == 0
29
+ end
30
+
31
+ def cmd target, cs_args, context
32
+ @context = context
33
+
34
+ if !target || target.length == 0
35
+ raise Exception.new("Target must be specified and have a length " +
36
+ "greater than 0")
37
+ end
38
+
39
+ # Generic argument processing
40
+ args = []
41
+ sources = cs_args.delete(:sources)
42
+ cs_args[:target] ||= guess_target(target)
43
+
44
+ cs_args.each_key do |key|
45
+ args.push(cs_args[key].to_cs_arg(key, self))
46
+ end
47
+
48
+ src_list = sources.to_cmd_array(context)
49
+
50
+ ([bin, outfile(target)] + args.flatten + src_list).join(' ')
51
+ end
52
+
53
+ # Map rant arguments to compiler arguments
54
+ def map_arg arg
55
+ switch_map[arg] ? switch_map[arg] : arg
56
+ end
57
+
58
+ def outfile target
59
+ string_argument "out", target
60
+ end
61
+
62
+ def boolean_argument arg, on
63
+ switch = map_arg(arg)
64
+ ret = "#{self.argument_prefix}#{switch}"
65
+ ret += on ? "" : "-"
66
+ end
67
+
68
+ def string_argument arg, value
69
+ switch = map_arg(arg)
70
+ # Assume all string arguments except target are
71
+ # files
72
+ value = @context.sys.sp(value) if arg != :target
73
+
74
+ "#{self.argument_prefix}#{switch}:#{value}"
75
+ end
76
+
77
+ def argument_prefix
78
+ ""
79
+ end
80
+
81
+ # Try to automatically guess the type of output file
82
+ # based on the extension
83
+ def guess_target outfile
84
+ target = "library"
85
+
86
+ ext = outfile.match(/\.([^\.]+)$/)
87
+ ext = ext[1] if ext
88
+
89
+ if ext
90
+ case ext.downcase
91
+ when "netmodule"
92
+ target = map_target("module")
93
+ when "exe"
94
+ target = map_target("winexe")
95
+ end
96
+ end
97
+ target
98
+ end
99
+
100
+ # Allows subclasses to override default target names
101
+ def map_target target
102
+ target
103
+ end
104
+ end
105
+ end