rake-builder 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. data/Rakefile +8 -5
  2. data/examples/05_tests/Rakefile +3 -3
  3. data/examples/05_tests/include/units.h +2 -2
  4. data/lib/compiler.rb +25 -30
  5. data/lib/rake/builder.rb +135 -136
  6. data/lib/rake/builder/installer.rb +37 -0
  7. data/lib/rake/{local_config.rb → builder/local_config.rb} +13 -14
  8. data/lib/rake/builder/logger/formatter.rb +7 -1
  9. data/lib/rake/builder/presenters/makefile/builder_presenter.rb +66 -33
  10. data/lib/rake/builder/presenters/makefile_am/builder_presenter.rb +4 -4
  11. data/lib/rake/builder/qt_builder.rb +3 -8
  12. data/lib/rake/builder/task_definers/builder_task_definer.rb +1 -4
  13. data/lib/rake/builder/version.rb +1 -1
  14. data/lib/rake/{microsecond.rb → microsecond_task.rb} +22 -27
  15. data/lib/rake/once_task.rb +2 -7
  16. data/lib/rake/path.rb +1 -6
  17. data/spec/gather_rspec_coverage.rb +2 -0
  18. data/spec/spec_helper.rb +13 -98
  19. data/spec/unit/compiler_spec.rb +129 -0
  20. data/spec/unit/rake/builder/autoconf/version_spec.rb +62 -5
  21. data/spec/unit/rake/builder/configure_ac_spec.rb +53 -0
  22. data/spec/unit/rake/builder/install_spec.rb +101 -0
  23. data/spec/unit/rake/builder/local_config_spec.rb +53 -0
  24. data/spec/unit/rake/builder/logger/formatter_spec.rb +20 -0
  25. data/spec/unit/rake/builder/presenters/makefile/builder_presenter_spec.rb +163 -0
  26. data/spec/unit/rake/builder/presenters/makefile_am/builder_presenter_spec.rb +4 -2
  27. data/spec/unit/rake/builder/task_definers/builder_task_definer_spec.rb +6 -0
  28. data/spec/unit/rake/builder_spec.rb +391 -16
  29. data/spec/unit/rake/microsecond_task_spec.rb +63 -0
  30. metadata +39 -55
  31. data/examples/01_hello_world_cpp/vendor/bundle/gems/coderay-1.0.8/Rakefile +0 -35
  32. data/examples/01_hello_world_cpp/vendor/bundle/gems/json-1.7.6/Rakefile +0 -412
  33. data/examples/01_hello_world_cpp/vendor/bundle/gems/json-1.7.6/ext/json/ext/fbuffer/fbuffer.h +0 -185
  34. data/examples/01_hello_world_cpp/vendor/bundle/gems/json-1.7.6/ext/json/ext/generator/generator.c +0 -1427
  35. data/examples/01_hello_world_cpp/vendor/bundle/gems/json-1.7.6/ext/json/ext/generator/generator.h +0 -149
  36. data/examples/01_hello_world_cpp/vendor/bundle/gems/json-1.7.6/ext/json/ext/parser/parser.c +0 -2204
  37. data/examples/01_hello_world_cpp/vendor/bundle/gems/json-1.7.6/ext/json/ext/parser/parser.h +0 -77
  38. data/examples/01_hello_world_cpp/vendor/bundle/gems/method_source-0.8.1/Rakefile +0 -79
  39. data/examples/01_hello_world_cpp/vendor/bundle/gems/pry-0.9.11.3/Rakefile +0 -136
  40. data/examples/01_hello_world_cpp/vendor/bundle/gems/rake-10.0.3/Rakefile +0 -374
  41. data/examples/01_hello_world_cpp/vendor/bundle/gems/rake-10.0.3/doc/example/a.c +0 -6
  42. data/examples/01_hello_world_cpp/vendor/bundle/gems/rake-10.0.3/doc/example/b.c +0 -6
  43. data/examples/01_hello_world_cpp/vendor/bundle/gems/rake-10.0.3/doc/example/main.c +0 -11
  44. data/examples/01_hello_world_cpp/vendor/bundle/gems/slop-3.4.3/Rakefile +0 -29
  45. data/lib/rake/file_task_alias.rb +0 -24
  46. data/spec/c_project/main.c +0 -12
  47. data/spec/c_project/main.h +0 -6
  48. data/spec/c_project_spec.rb +0 -41
  49. data/spec/cpp_project/main.cpp +0 -12
  50. data/spec/cpp_project/main.h +0 -8
  51. data/spec/cpp_project_spec.rb +0 -203
  52. data/spec/generated_files_spec.rb +0 -65
  53. data/spec/libraries_spec.rb +0 -35
  54. data/spec/local_config_spec.rb +0 -95
  55. data/spec/logger_spec.rb +0 -25
  56. data/spec/microsecond_task_spec.rb +0 -32
  57. data/spec/objective_c_project/main.h +0 -1
  58. data/spec/objective_c_project/main.m +0 -18
  59. data/spec/objective_c_project_spec.rb +0 -72
  60. data/spec/paths_spec.rb +0 -19
  61. data/spec/project_spec.rb +0 -20
  62. data/spec/target_spec.rb +0 -48
data/Rakefile CHANGED
@@ -4,17 +4,20 @@ require 'rspec/core/rake_task'
4
4
 
5
5
  task :default => :spec
6
6
 
7
- RSpec::Core::RakeTask.new do | t |
7
+ RSpec::Core::RakeTask.new do |t|
8
8
  t.pattern = 'spec/**/*_spec.rb'
9
9
  end
10
10
 
11
11
  if RUBY_VERSION < '1.9'
12
-
13
- RSpec::Core::RakeTask.new( 'spec:rcov' ) do |t|
12
+ RSpec::Core::RakeTask.new('spec:rcov') do |t|
14
13
  t.pattern = 'spec/**/*_spec.rb'
15
14
  t.rcov = true
16
- t.rcov_opts = [ '--exclude', 'spec/,/gems/' ]
15
+ t.rcov_opts = ['--exclude', 'spec/,/gems/']
16
+ end
17
+ else
18
+ desc 'Run specs and create coverage output'
19
+ RSpec::Core::RakeTask.new('spec:coverage') do |t|
20
+ t.pattern = ['spec/gather_rspec_coverage.rb', 'spec/**/*_spec.rb']
17
21
  end
18
-
19
22
  end
20
23
 
@@ -5,15 +5,15 @@ require 'rake/builder'
5
5
  Rake::Builder.new do |builder|
6
6
  builder.target = 'unit'
7
7
  builder.source_search_paths = [ 'src' ]
8
- builder.header_search_paths = [ 'include' ]
8
+ builder.installable_headers = [ 'include' ]
9
9
  end
10
10
 
11
11
  Rake::Builder.new do |builder|
12
12
  builder.task_namespace = 'test'
13
13
  builder.target = 'test_unit'
14
14
  builder.source_search_paths = [ 'test', 'src/units.*' ]
15
- builder.header_search_paths = [ 'include' ]
15
+ builder.installable_headers = [ 'include' ]
16
16
  builder.objects_path = 'test'
17
- builder.compilation_options = '-DDEBUG'
17
+ builder.compilation_options = [ '-DDEBUG' ]
18
18
  end
19
19
 
@@ -1,8 +1,8 @@
1
1
  #ifndef __UNITS_H__
2
2
  #define __UNITS_H__
3
3
 
4
- #include <ostream>;
5
- #include <string>;
4
+ #include <ostream>
5
+ #include <string>
6
6
  using namespace std;
7
7
 
8
8
  class Unit
@@ -1,22 +1,20 @@
1
-
2
1
  module Compiler
3
-
4
2
  class Base
5
- EXTRA_PATHS = [ '/opt/local/include' ]
3
+ EXTRA_PATHS = ['/opt/local/include']
6
4
 
7
- def self.for( compiler )
8
- COMPILERS[ compiler ].new
5
+ def self.for(compiler)
6
+ COMPILERS[compiler].new
9
7
  end
10
8
 
11
9
  def initialize
12
10
  @paths = {}
13
11
  end
14
12
 
15
- def include_paths( headers )
13
+ def include_paths(headers)
16
14
  paths = []
17
- headers.each do | header |
18
- path = find_header( header )
19
- raise "Can't find header '#{ header }' in any known include path" if path.nil?
15
+ headers.each do |header|
16
+ path = find_header(header)
17
+ raise "Can't find header '#{header}' in any known include path" if path.nil?
20
18
  paths << path
21
19
  end
22
20
  paths.uniq
@@ -24,29 +22,27 @@ module Compiler
24
22
 
25
23
  private
26
24
 
27
- def find_header( header )
28
- EXTRA_PATHS.each do | path |
29
- if File.exist?( "#{ path }/#{ header }" )
25
+ def find_header(header)
26
+ EXTRA_PATHS.each do |path|
27
+ if File.exist?("#{path}/#{header}")
30
28
  return path
31
29
  end
32
30
  end
33
31
  nil
34
32
  end
35
-
36
33
  end
37
34
 
38
35
  class GCC < Base
39
-
40
- def self.framework_path( framework, qt_major )
41
- "/Library/Frameworks/#{ framework }.framework/Versions/#{ qt_major }/Headers"
36
+ def self.framework_path(framework, qt_major)
37
+ "/Library/Frameworks/#{framework}.framework/Versions/#{qt_major}/Headers"
42
38
  end
43
39
 
44
- def default_include_paths( language )
45
- return @paths[ language ] if @paths[ language ]
40
+ def default_include_paths(language)
41
+ return @paths[language] if @paths[language]
46
42
 
47
43
  paths = []
48
44
  # Below is the recommended(!) way of getting standard search paths from GCC
49
- output = `echo | LANG=C gcc -v -x #{ language } -E - 2>&1 1>/dev/null`
45
+ output = `echo | LANG=C gcc -v -x #{language} -E - 2>&1 1>/dev/null`
50
46
  collecting = false
51
47
  output.each_line do | line |
52
48
  case
@@ -61,24 +57,23 @@ module Compiler
61
57
  end
62
58
  end
63
59
 
64
- @paths[ language ] = paths
60
+ @paths[language] = paths
65
61
  end
66
62
 
67
- def missing_headers( include_paths, source_files )
68
- include_path = include_paths.map { | path | "-I#{ path }" }.join( ' ' )
69
- command = "makedepend -f- -- #{ include_path } -- #{ source_files.join( ' ' ) } 2>&1 1>/dev/null"
70
- output = `#{ command }`
63
+ def missing_headers(include_paths, source_files)
64
+ include_path = include_paths.map { |path| "-I#{path}"}.join(' ')
65
+ command = "makedepend -f- -- #{include_path} -- #{source_files.join(' ')} 2>&1 1>/dev/null"
66
+ output = `#{command}`
71
67
  missing = []
72
- output.each_line do | line |
73
- match = line.match( /cannot find include file "([^"]*)"/m )
74
- missing << match[ 1 ] if match
68
+ output.each_line do |line|
69
+ match = line.match(/cannot find include file "([^"]*)"/m)
70
+ missing << match[1] if match
75
71
  end
76
72
 
77
73
  missing
78
74
  end
79
-
80
75
  end
81
76
 
82
- COMPILERS = { :gcc => GCC }
83
-
77
+ COMPILERS = {:gcc => GCC}
84
78
  end
79
+
@@ -4,6 +4,8 @@ require 'rake'
4
4
  require 'rake/builder/autoconf/version'
5
5
  require 'rake/builder/configure_ac'
6
6
  require 'rake/builder/error'
7
+ require 'rake/builder/installer'
8
+ require 'rake/builder/local_config'
7
9
  require 'rake/builder/logger/formatter'
8
10
  require 'rake/builder/presenters/makefile/builder_presenter'
9
11
  require 'rake/builder/presenters/makefile_am/builder_presenter'
@@ -11,7 +13,7 @@ require 'rake/builder/presenters/makefile_am/builder_collection_presenter'
11
13
  require 'rake/builder/task_definers/builder_task_definer'
12
14
  require 'rake/builder/task_definers/builder_collection_task_definer'
13
15
  require 'rake/path'
14
- require 'rake/microsecond'
16
+ require 'rake/microsecond_task'
15
17
  require 'rake/once_task'
16
18
  require 'compiler'
17
19
 
@@ -112,12 +114,12 @@ module Rake
112
114
  attr_accessor :installable_headers
113
115
 
114
116
  def header_search_paths
115
- warn 'Deprecation notice: Rake::Builder#header_search_paths has be replaced by Rake::Builder#installable_headers'
117
+ warn 'Deprecation notice: Rake::Builder#header_search_paths has been replaced by Rake::Builder#installable_headers'
116
118
  installable_headers
117
119
  end
118
120
 
119
121
  def header_search_paths=(paths)
120
- warn 'Deprecation notice: Rake::Builder#header_search_paths has be replaced by Rake::Builder#installable_headers'
122
+ warn 'Deprecation notice: Rake::Builder#header_search_paths has been replaced by Rake::Builder#installable_headers'
121
123
  installable_headers = paths
122
124
  end
123
125
 
@@ -187,6 +189,7 @@ module Rake
187
189
  Rake::Builder::BuilderCollectionTaskDefiner.new.run
188
190
 
189
191
  def initialize(&block)
192
+ raise 'No block given' if block.nil?
190
193
  save_rakefile_info(block)
191
194
  set_defaults
192
195
  block.call(self)
@@ -195,14 +198,12 @@ module Rake
195
198
  self.class.instances << self
196
199
  end
197
200
 
198
- def run
199
- command = "cd #{rakefile_path} && #{target}"
200
- puts shell(command, Logger::INFO)
201
- end
201
+ ################################################
202
+ # main actions
202
203
 
203
204
  def build
204
205
  logger.debug "Building '#{target}'"
205
- system "rm -f #{target}"
206
+ File.unlink(target) if File.exist?(target)
206
207
  build_commands.each do |command|
207
208
  stdout, stderr = shell(command)
208
209
  raise BuildFailure.new("Error: command '#{command}' failed: #{stderr} #{stdout}") if not $?.success?
@@ -210,14 +211,40 @@ module Rake
210
211
  raise BuildFailure.new("'#{target}' not created") if not File.exist?(target)
211
212
  end
212
213
 
213
- def create_local_config
214
- logger.debug "Creating file '#{local_config }'"
215
- added_includes = compiler_data.include_paths(missing_headers)
216
- config = Rake::LocalConfig.new(local_config)
217
- config.include_paths = added_includes
218
- config.save
214
+ def run
215
+ old_dir = Dir.pwd
216
+ Dir.chdir rakefile_path
217
+ command = File.join('.', target)
218
+ begin
219
+ output, error = shell(command, ::Logger::INFO)
220
+ $stdout.print output
221
+ $stderr.print error
222
+ raise Exception.new("Running #{command} failed with status #{$?.exitstatus}") if not $?.success?
223
+ ensure
224
+ Dir.chdir old_dir
225
+ end
226
+ end
227
+
228
+ def clean
229
+ generated_files.each do |file|
230
+ File.unlink(file) if File.exist?(file)
231
+ end
219
232
  end
220
233
 
234
+ def install
235
+ destination = File.join(install_path, target_basename)
236
+ Rake::Builder::Installer.new.install target, destination
237
+ install_headers if target_type == :static_library
238
+ end
239
+
240
+ def uninstall
241
+ destination = File.join(install_path, target_basename)
242
+ Rake::Builder::Installer.new.uninstall destination
243
+ end
244
+
245
+ ################################################
246
+ # helpers invoked by tasks
247
+
221
248
  def create_makedepend_file
222
249
  logger.debug 'Creating makedepend file'
223
250
  system('which makedepend >/dev/null')
@@ -226,74 +253,80 @@ module Rake
226
253
  shell command
227
254
  end
228
255
 
229
- def load_local_config
230
- config = Rake::LocalConfig.new(local_config)
231
- config.load
232
- @include_paths += Rake::Path.expand_all_with_root(config.include_paths, rakefile_path)
233
- @compilation_options += config.compilation_options
234
- end
235
-
236
256
  def load_makedepend
237
- object_to_source = source_files.inject({}) do |memo, source|
238
- mapped_object = source.gsub('.' + source_file_extension, '.o')
239
- memo[mapped_object] = source
240
- memo
257
+ content = File.read(makedepend_file)
258
+ # Replace old-style files with full paths
259
+ if content =~ %r(^/)
260
+ create_makedepend_file
261
+ return load_makedepend
262
+ end
263
+
264
+ # makedepend assumes each .o files will be in the same path as its source
265
+ real_object_path = source_files.inject({}) do |a, source|
266
+ source_path_object = source.gsub('.' + source_file_extension, '.o')
267
+ correct_path_object = object_path(source)
268
+ a[source_path_object] = correct_path_object
269
+ a
241
270
  end
242
271
 
243
272
  object_header_dependencies = Hash.new { |h, v| h[v] = [] }
244
- File.open(makedepend_file).each_line do |line|
273
+ content.each_line do |line|
245
274
  next if line !~ /:\s/
246
- mapped_object_file = $`
275
+ source_path_object = $`
247
276
  header_files = $'.chomp
248
- source_file = object_to_source[mapped_object_file]
249
- object_file = object_path(source_file)
250
- object_header_dependencies[object_file] += header_files.split(' ')
277
+ object_path_name = real_object_path[source_path_object]
278
+ object_header_dependencies[object_path_name] += header_files.split(' ')
251
279
  end
280
+
252
281
  object_header_dependencies
253
282
  end
254
283
 
255
- def clean
256
- generated_files.each do |file|
257
- system "rm -f #{file}"
258
- end
284
+ def generated_headers
285
+ []
259
286
  end
260
287
 
261
- def install
262
- destination = File.join(install_path, target_basename)
263
- install_file(target, destination)
264
- install_headers if target_type == :static_library
288
+ # Raises an error if there are missing headers
289
+ def ensure_headers
290
+ missing = missing_headers
291
+ return if missing.size == 0
292
+
293
+ message = "Compilation cannot proceed as the following header files are missing:\n" + missing.join("\n")
294
+ raise Error.new(message)
265
295
  end
266
296
 
267
- def uninstall
268
- destination = File.join(install_path, target_basename)
269
- if not File.exist?(destination)
270
- logger.add(Logger::INFO, "The file '#{destination}' does not exist")
271
- return
272
- end
273
- begin
274
- shell "rm '#{destination}'", Logger::INFO
275
- rescue Errno::EACCES => e
276
- raise Error.new("You do not have permission to uninstall '#{destination}'\nTry re-running the command with 'sudo'", task_namespace)
277
- end
297
+ def load_local_config
298
+ config = Rake::Builder::LocalConfig.new(local_config)
299
+ config.load
300
+ @include_paths += config.include_paths
301
+ @compilation_options += config.compilation_options
302
+ end
303
+
304
+ def create_local_config
305
+ logger.debug "Creating file '#{local_config}'"
306
+ added_includes = compiler_data.include_paths(missing_headers)
307
+ config = Rake::Builder::LocalConfig.new(local_config)
308
+ config.include_paths = added_includes
309
+ config.save
278
310
  end
279
311
 
280
312
  def compile(source, object)
281
- logger.add(Logger::DEBUG, "Compiling '#{source}'")
313
+ logger.add(::Logger::DEBUG, "Compiling '#{source}'")
282
314
  command = "#{compiler} -c #{compiler_flags} -o #{object} #{source}"
283
315
  stdout, stderr = shell(command)
284
316
  raise BuildFailure.new("Error: command '#{command}' failed: #{stderr} #{stdout}") if not $?.success?
285
317
  end
286
318
 
287
- # Source files found in source_search_paths
288
- def source_files
289
- return @source_files if @source_files
290
- @source_files = find_files( @source_search_paths, @source_file_extension ).uniq.sort
291
- end
319
+ ################################################
320
+ # public attributes
292
321
 
293
322
  def is_library?
294
323
  [:static_library, :shared_library].include?(target_type)
295
324
  end
296
325
 
326
+ def target_basename
327
+ File.basename(@target)
328
+ end
329
+
297
330
  def primary_name
298
331
  Rake::Path.relative_path(target, rakefile_path, :initial_dot_slash => false)
299
332
  end
@@ -302,8 +335,15 @@ module Rake
302
335
  primary_name.gsub(%r(\.), '_')
303
336
  end
304
337
 
305
- def source_paths
306
- source_files.map{ |file| Rake::Path.relative_path(file, rakefile_path) }
338
+ # Source files found in source_search_paths
339
+ def source_files
340
+ return @source_files if @source_files
341
+
342
+ old_dir = Dir.pwd
343
+ Dir.chdir @rakefile_path
344
+ @source_files = Rake::Path.find_files(@source_search_paths, source_file_extension).uniq.sort
345
+ Dir.chdir old_dir
346
+ @source_files
307
347
  end
308
348
 
309
349
  def object_files
@@ -312,7 +352,7 @@ module Rake
312
352
 
313
353
  def object_path(source_path_name)
314
354
  o_name = File.basename(source_path_name).gsub('.' + source_file_extension, '.o')
315
- Rake::Path.expand_with_root(o_name, objects_path)
355
+ File.join(objects_path, o_name)
316
356
  end
317
357
 
318
358
  def compiler_flags
@@ -323,12 +363,14 @@ module Rake
323
363
  flags
324
364
  end
325
365
 
326
- def library_dependencies_list
327
- @library_dependencies.map { |lib| "-l#{lib}" }.join(' ')
366
+ def link_flags
367
+ flags = [ @linker_options, library_paths_list, library_dependencies_list ]
368
+ flags << architecture_option if RUBY_PLATFORM =~ /darwin/i
369
+ flags.join( " " )
328
370
  end
329
371
 
330
- def target_basename
331
- File.basename(@target)
372
+ def library_dependencies_list
373
+ @library_dependencies.map { |lib| "-l#{lib}" }.join(' ')
332
374
  end
333
375
 
334
376
  def makefile_name
@@ -340,25 +382,6 @@ module Rake
340
382
  "Makefile#{ extension }"
341
383
  end
342
384
 
343
- def generated_headers
344
- []
345
- end
346
-
347
- # Raises an error if there are missing headers
348
- def ensure_headers
349
- missing = missing_headers
350
- return if missing.size == 0
351
-
352
- message = "Compilation cannot proceed as the following header files are missing:\n" + missing.join("\n")
353
- raise Error.new(message)
354
- end
355
-
356
- def link_flags
357
- flags = [ @linker_options, library_paths_list, library_dependencies_list ]
358
- flags << architecture_option if RUBY_PLATFORM =~ /darwin/i
359
- flags.join( " " )
360
- end
361
-
362
385
  private
363
386
 
364
387
  # Lists headers referenced by the project's files or includes
@@ -373,21 +396,21 @@ module Rake
373
396
  def set_defaults
374
397
  @architecture = 'i386'
375
398
  @compiler_data = Compiler::Base.for(:gcc)
376
- @logger = Logger.new(STDOUT)
377
- @logger.level = Logger::UNKNOWN
378
- @logger.formatter = Formatter.new
399
+ @logger = ::Logger.new(STDOUT)
400
+ @logger.level = ::Logger::UNKNOWN
401
+ @logger.formatter = Rake::Builder::Logger::Formatter.new
379
402
  @programming_language = 'c++'
380
403
  @header_file_extension = 'h'
381
- @objects_path = @rakefile_path.dup
404
+ @objects_path = '.'
382
405
  @library_paths = []
383
406
  @library_dependencies = []
384
407
  @target_prerequisites = []
385
- @source_search_paths = [@rakefile_path.dup]
386
- @target = 'a.out'
408
+ @source_search_paths = ['.']
409
+ @target = './a.out'
387
410
  @generated_files = []
388
411
  @compilation_options = []
389
- @include_paths = [File.join(@rakefile_path.dup, 'include')]
390
- @installable_headers = [@rakefile_path.dup]
412
+ @include_paths = ['./include']
413
+ @installable_headers ||= []
391
414
  end
392
415
 
393
416
  def configure
@@ -402,34 +425,26 @@ module Rake
402
425
  @ranlib ||= KNOWN_LANGUAGES[ @programming_language ][ :ranlib ]
403
426
  @source_file_extension ||= KNOWN_LANGUAGES[ @programming_language ][ :source_file_extension ]
404
427
 
405
- @source_search_paths = Rake::Path.expand_all_with_root( @source_search_paths, @rakefile_path )
406
- @library_paths = Rake::Path.expand_all_with_root( @library_paths, @rakefile_path )
407
428
 
408
429
  raise Error.new( "The target name cannot be nil", task_namespace ) if @target.nil?
409
430
  raise Error.new( "The target name cannot be an empty string", task_namespace ) if @target == ''
410
- @objects_path = Rake::Path.expand_with_root( @objects_path, @rakefile_path )
411
431
 
412
- @target = File.expand_path( @target, @rakefile_path )
413
432
  @target_type ||= to_target_type( @target )
414
433
  raise Error.new( "Building #{ @target_type } targets is not supported", task_namespace ) if ! TARGET_TYPES.include?( @target_type )
415
434
  @generated_files << @target
416
435
 
417
436
  @install_path ||= default_install_path( @target_type )
418
- @installable_headers = Rake::Path.expand_all_with_root( @installable_headers, @rakefile_path )
419
437
 
420
438
  @linker_options ||= ''
421
- @include_paths += []
422
- @include_paths = Rake::Path.expand_all_with_root( @include_paths.uniq, @rakefile_path )
423
- @generated_files = Rake::Path.expand_all_with_root( @generated_files, @rakefile_path )
424
439
 
425
440
  @default_task ||= :build
426
441
  @target_prerequisites << @rakefile
427
- @local_config = Rake::Path.expand_with_root( '.rake-builder', @rakefile_path )
442
+ @local_config = '.rake-builder'
428
443
 
429
444
  @makedepend_file = @objects_path + '/.' + target_basename + '.depend.mf'
430
445
  @generated_files << @makedepend_file
431
446
 
432
- raise Error.new( "No source files found", task_namespace ) if source_files.length == 0
447
+ raise Error.new("No source files found", task_namespace) if source_files.size == 0
433
448
  end
434
449
 
435
450
  def to_target_type(target)
@@ -446,8 +461,7 @@ module Rake
446
461
  # Compiling and linking parameters
447
462
 
448
463
  def include_path
449
- paths = @include_paths.map{ | file | Rake::Path.relative_path( file, rakefile_path) }
450
- paths.map { |p| "-I#{ p }" }.join( ' ' )
464
+ @include_paths.map { |p| "-I#{p}" }.join(' ')
451
465
  end
452
466
 
453
467
  def architecture_option
@@ -483,11 +497,6 @@ module Rake
483
497
  def file_list(files)
484
498
  files.join(' ')
485
499
  end
486
-
487
- def find_files( paths, extension )
488
- files = Rake::Path.find_files( paths, extension )
489
- Rake::Path.expand_all_with_root( files, @rakefile_path )
490
- end
491
500
 
492
501
  def library_paths_list
493
502
  @library_paths.map { | path | "-L#{ path }" }.join( " " )
@@ -497,40 +506,39 @@ module Rake
497
506
  # TODO: make install_headers_path a configuration option
498
507
  install_headers_path = '/usr/local/include'
499
508
 
500
- project_headers.each do | installable_header |
509
+ installer = Rake::Builder::Installer.new
510
+ project_headers.each do |installable_header|
501
511
  destination_path = File.join( install_headers_path, installable_header[ :relative_path ] )
502
512
  begin
503
513
  `mkdir -p '#{ destination_path }'`
504
514
  rescue Errno::EACCES => e
505
515
  raise Error.new( "Permission denied to created directory '#{ destination_path }'", task_namespace )
506
516
  end
507
- install_file( installable_header[ :source_file ], destination_path )
517
+ installer.install installable_header[:source_file], destination_path
508
518
  end
509
519
  end
510
520
 
511
521
  def project_headers
512
- @installable_headers.reduce( [] ) do | memo, search |
513
- non_glob_search = ( search.match( /^([^\*\?]*)/ ) )[ 1 ]
522
+ @installable_headers.reduce([]) do |memo, search|
523
+ non_glob_search = (search.match(/^([^\*\?]*)/))[1]
514
524
  case
515
- when ( non_glob_search !~ /#{ @rakefile_path }/ )
525
+ when search.start_with?('/'), search.start_with?('..')
516
526
  # Skip paths that are not inside the project
517
- when File.file?( search )
518
- full_path = Rake::Path.expand_with_root( search, @rakefile_path )
519
- memo << { :source_file => search, :relative_path => '' }
520
- when File.directory?( search )
521
- FileList[ search + '/*.' + @header_file_extension ].each do | pathname |
522
- full_path = Rake::Path.expand_with_root( pathname, @rakefile_path )
523
- memo << { :source_file => pathname, :relative_path => '' }
527
+ when File.file?(search)
528
+ memo << {:source_file => search, :relative_path => ''}
529
+ when File.directory?(search)
530
+ FileList[search + '/*.' + @header_file_extension].each do |pathname|
531
+ memo << {:source_file => pathname, :relative_path => ''}
524
532
  end
525
- when ( search =~ /[\*\?]/ )
526
- FileList[ search ].each do | pathname |
527
- full_path = Rake::Path.expand_with_root( pathname, @rakefile_path )
528
- directory = File.dirname( full_path )
529
- relative = Rake::Path.relative_path( directory, non_glob_search )
530
- memo << { :source_file => pathname, :relative_path => relative }
533
+ when (search =~ /[\*\?]/)
534
+ FileList[search].each do |pathname|
535
+ full_path = Rake::Path.expand_with_root(pathname, @rakefile_path)
536
+ directory = File.dirname(full_path)
537
+ relative = Rake::Path.relative_path(directory, non_glob_search)
538
+ memo << {:source_file => pathname, :relative_path => relative}
531
539
  end
532
540
  else
533
- $stderr.puts "Bad search path: '${ search }'"
541
+ $stderr.puts "Bad search path: '#{search}'"
534
542
  end
535
543
  memo
536
544
  end
@@ -550,23 +558,14 @@ module Rake
550
558
  end
551
559
  end
552
560
 
553
- def install_file(source_pathname, destination_path)
554
- begin
555
- shell "cp '#{ source_pathname }' '#{ destination_path }'", Logger::INFO
556
- rescue Errno::EACCES => e
557
- source_filename = File.basename( source_pathname ) rescue '????'
558
- raise Error.new( "You do not have permission to install '#{ source_filename }' to '#{ destination_path }'\nTry\n $ sudo rake install", task_namespace )
559
- end
560
- end
561
-
562
- def shell(command, log_level = Logger::DEBUG)
561
+ def shell(command, log_level = ::Logger::DEBUG)
563
562
  @logger.add(log_level, command)
564
563
  originals = $stdout, $stderr
565
564
  stdout, stderr = StringIO.new, StringIO.new
566
565
  $stdout, $stderr = stdout, stderr
567
566
  system command, {:out => :out, :err => :err}
568
567
  $stdout, $stderr = *originals
569
- [stdout.read, stderr.read]
568
+ [stdout.string, stderr.string]
570
569
  end
571
570
  end
572
571
  end