rake-builder 0.7.0 → 0.8.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.
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