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
@@ -0,0 +1,37 @@
1
+ require 'fileutils'
2
+
3
+ class Rake::Builder
4
+ class Installer
5
+ def install(source_pathname, destination_path)
6
+ ensure_file_exists source_pathname
7
+ raise "The path '#{destination_path}' does not exist" unless File.exist?(destination_path)
8
+ raise "'#{destination_path}' is not a directory" unless File.directory?(destination_path)
9
+ ensure_directory_writable destination_path, "Cannot copy files to the directory '#{destination_path}'"
10
+ filename = File.basename(source_pathname)
11
+ destination_pathname = File.join(destination_path, filename)
12
+ if File.file?(destination_pathname) and not File.writable?(destination_pathname)
13
+ raise "The file '#{destination_pathname}' cannot be overwritten"
14
+ end
15
+
16
+ FileUtils.copy_file source_pathname, destination_path
17
+ end
18
+
19
+ def uninstall(installed_pathname)
20
+ return unless File.exist?(installed_pathname)
21
+ ensure_directory_writable File.dirname(installed_pathname)
22
+ File.unlink installed_pathname
23
+ end
24
+
25
+ private
26
+
27
+ def ensure_file_exists(pathname)
28
+ raise "File '#{pathname}' does not exist" unless File.exist?(pathname)
29
+ end
30
+
31
+ def ensure_directory_writable(path, message = nil)
32
+ message ||= "The directory '#{path}' is not writable"
33
+ raise message unless File.writable?(path)
34
+ end
35
+ end
36
+ end
37
+
@@ -1,43 +1,42 @@
1
1
  require 'yaml'
2
2
 
3
- module Rake
4
-
3
+ class Rake::Builder
5
4
  class LocalConfig
6
-
7
5
  VERSIONS = ['1.0', '1.1']
8
6
 
9
7
  attr_accessor :include_paths
10
8
  attr_accessor :compilation_options
11
9
 
12
- def initialize( file_name )
10
+ def initialize(file_name)
13
11
  @file_name = file_name
14
12
  @include_paths = []
15
13
  @compilation_options = []
16
14
  end
17
15
 
18
16
  def load
19
- config = YAML.load_file( @file_name )
17
+ config = YAML.load_file(@file_name)
20
18
 
21
- version = config[:rake_builder][:config_file][:version]
22
- @include_paths = config[:include_paths]
23
- @compilation_options = config[:compilation_options]
24
- if not VERSIONS.find_index(version)
19
+ version = config[:rake_builder][:config_file][:version]
20
+ if not VERSIONS.include?(version)
25
21
  raise Rake::Builder::Error.new('Config file version incorrect')
26
22
  end
23
+ @include_paths = config[:include_paths]
24
+ @compilation_options = config[:compilation_options]
27
25
  end
28
26
 
29
27
  def save
30
- File.open( @file_name, 'w' ) do | file |
28
+ File.open(@file_name, 'w') do |file|
31
29
  file.write config.to_yaml
32
30
  end
33
31
  end
34
32
 
35
33
  def config
36
- { :rake_builder => { :config_file => { :version => VERSIONS[-1] } },
34
+ {
35
+ :rake_builder => {:config_file => {:version => VERSIONS[-1]}},
37
36
  :include_paths => @include_paths,
38
- :compilation_options => @compilation_options }
37
+ :compilation_options => @compilation_options
38
+ }
39
39
  end
40
-
41
40
  end
42
-
43
41
  end
42
+
@@ -1,5 +1,11 @@
1
+ require 'logger'
2
+
1
3
  class Rake::Builder
2
- class Formatter < Logger::Formatter
4
+ module Logger; end
5
+ end
6
+
7
+ module Rake::Builder::Logger
8
+ class Formatter < ::Logger::Formatter
3
9
  def call(severity, time, progname, msg)
4
10
  msg2str(msg) << "\n"
5
11
  end
@@ -4,44 +4,84 @@ module Rake::Builder::Presenters::Makefile
4
4
  class BuilderPresenter
5
5
  def initialize(builder)
6
6
  @builder = builder
7
+ check_target_type
7
8
  end
8
9
 
9
10
  def to_s
10
- objects = @builder.object_files.collect { |f| f.sub(@builder.objects_path, '$(OBJECT_DIR)') }
11
- objects_list = objects.join( ' ' )
12
- case @builder.target_type
11
+ check_target_type
12
+
13
+ variables = main_variables
14
+ rules = main_rules
15
+
16
+ source_groups = group_files_by_path(@builder.source_files)
17
+ source_groups.each.with_index do |gp, i|
18
+ variables << "SOURCE_#{i + 1} = #{gp[0]}\n"
19
+ rules << <<EOT
20
+
21
+ $(OBJECT_DIR)/%.o: $(SOURCE_#{i + 1})/%.cpp
22
+ $(COMPILER) -c $(COMPILER_FLAGS) -o $@ $<
23
+ EOT
24
+ end
25
+ variables + rules
26
+ end
27
+
28
+ def save
29
+ File.open(@builder.makefile_name, 'w') do |file|
30
+ file.write to_s
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def target_type
37
+ @builder.target_type
38
+ end
39
+
40
+ def target_name
41
+ case target_type
42
+ when :executable
43
+ 'EXECUTABLE_TARGET'
44
+ when :static_library
45
+ 'LIB_TARGET'
46
+ when :shared_library
47
+ 'LIB_TARGET'
48
+ end
49
+ end
50
+
51
+ def target_ref
52
+ "$(#{target_name})"
53
+ end
54
+
55
+ def target_actions
56
+ case target_type
13
57
  when :executable
14
- target_name = 'EXECUTABLE_TARGET'
15
- target_ref = "$(#{target_name})"
16
- target_actions =
17
58
  " $(LINKER) $(LINK_FLAGS) -o #{target_ref} $(OBJECTS)
18
59
  "
19
60
  when :static_library
20
- target_name = 'LIB_TARGET'
21
- target_ref = "$(#{target_name})"
22
- target_actions =
23
61
  " rm -f #{target_ref}
24
62
  ar -cq #{target_ref} $(OBJECTS)
25
63
  ranlib #{target_ref}
26
64
  "
27
65
  when :shared_library
28
- target_name = 'LIB_TARGET'
29
- target_ref = "$(#{target_name})"
30
- target_actions =
31
66
  " $(LINKER) -shared -o #{target_ref} $(OBJECTS) $(LINK_FLAGS)
32
67
  "
33
68
  end
69
+ end
34
70
 
35
- variables = <<EOT
71
+ def main_variables
72
+ <<EOT
36
73
  COMPILER = #{@builder.compiler}
37
74
  COMPILER_FLAGS = #{@builder.compiler_flags}
38
75
  LINKER = #{@builder.linker}
39
76
  LINK_FLAGS = #{@builder.link_flags}
40
77
  OBJECT_DIR = #{@builder.objects_path}
41
78
  OBJECTS = #{objects_list}
42
- #{ target_name } = #{@builder.target}
79
+ #{target_name} = #{@builder.target}
43
80
  EOT
44
- rules = <<EOT
81
+ end
82
+
83
+ def main_rules
84
+ <<EOT
45
85
 
46
86
  all: #{target_ref}
47
87
 
@@ -52,30 +92,23 @@ clean:
52
92
  #{target_ref}: $(OBJECTS)
53
93
  #{target_actions}
54
94
  EOT
95
+ end
55
96
 
56
- source_groups = group_files_by_path(@builder.source_files)
57
- source_groups.each.with_index do | gp, i |
58
- variables << "SOURCE_#{i + 1} = #{gp[0]}\n"
59
- rules << <<EOT
60
-
61
- $(OBJECT_DIR)/%.o: $(SOURCE_#{i + 1})/%.cpp
62
- $(COMPILER) -c $(COMPILER_FLAGS) -o $@ $<
63
- EOT
64
- end
65
- variables + rules
97
+ def objects_list
98
+ objects = @builder.object_files.map { |f| f.sub(@builder.objects_path, '$(OBJECT_DIR)') }
99
+ objects.join(' ')
66
100
  end
67
101
 
68
- def save
69
- File.open(@builder.makefile_name, 'w') do |file|
70
- file.write to_s
102
+ def group_files_by_path(files)
103
+ files.group_by do |f|
104
+ m = f.match(/(.*?)?\/?([^\/]+)$/)
105
+ m[1]
71
106
  end
72
107
  end
73
108
 
74
- def group_files_by_path( files )
75
- files.group_by do | f |
76
- m = f.match( /(.*?)?\/?([^\/]+)$/ )
77
- m[ 1 ]
78
- end
109
+ def check_target_type
110
+ return if [:executable, :shared_library, :static_library].include?(target_type)
111
+ raise "Unknown build target type '#{target_type}'"
79
112
  end
80
113
  end
81
114
  end
@@ -1,4 +1,4 @@
1
- module Rake; class Builder; module Presenters; module MakefileAm
1
+ module Rake::Builder::Presenters::MakefileAm
2
2
  class BuilderPresenter
3
3
  attr_accessor :builder
4
4
 
@@ -7,13 +7,13 @@ module Rake; class Builder; module Presenters; module MakefileAm
7
7
  end
8
8
 
9
9
  def to_s
10
- [sources, cpp_flags, ld_flags, libraries, ''].compact.join("/n")
10
+ [sources, cpp_flags, ld_flags, libraries, ''].compact.join("\n")
11
11
  end
12
12
 
13
13
  private
14
14
 
15
15
  def sources
16
- "#{builder.label}_SOURCES = #{builder.source_paths.join(' ')}"
16
+ "#{builder.label}_SOURCES = #{builder.source_files.join(' ')}"
17
17
  end
18
18
 
19
19
  def cpp_flags
@@ -36,5 +36,5 @@ module Rake; class Builder; module Presenters; module MakefileAm
36
36
  end
37
37
  end
38
38
  end
39
- end; end; end; end
39
+ end
40
40
 
@@ -47,8 +47,6 @@ module Rake
47
47
 
48
48
  super
49
49
 
50
- @resource_files = Rake::Path.expand_all_with_root( @resource_files, @rakefile_path )
51
- @ui_files = Rake::Path.expand_all_with_root( @ui_files, @rakefile_path )
52
50
  @compilation_options += [ '-pipe', '-g', '-gdwarf-2', '-Wall', '-W' ]
53
51
  @include_paths << @objects_path # for UI headers
54
52
  end
@@ -161,8 +159,7 @@ module Rake
161
159
  end
162
160
 
163
161
  def ui_header_path( ui_file )
164
- header_name = 'ui_' + File.basename( ui_file ).gsub( '.ui', '.h' )
165
- Rake::Path.expand_with_root( header_name, @objects_path )
162
+ 'ui_' + File.basename(ui_file).gsub('.ui', '.h')
166
163
  end
167
164
 
168
165
  # MOC
@@ -191,8 +188,7 @@ module Rake
191
188
  end
192
189
 
193
190
  def moc_pathname( header_name )
194
- moc_name = 'moc_' + File.basename( header_name ).gsub( '.' + @header_file_extension, '.cpp' )
195
- Rake::Path.expand_with_root( moc_name, @objects_path )
191
+ 'moc_' + File.basename(header_name).gsub('.' + @header_file_extension, '.cpp')
196
192
  end
197
193
 
198
194
  # Resources
@@ -214,8 +210,7 @@ module Rake
214
210
  end
215
211
 
216
212
  def qrc_pathname( resource_name )
217
- qrc_name = 'qrc_' + File.basename( resource_name ).gsub( '.qrc', '.cpp' )
218
- Rake::Path.expand_with_root( qrc_name, @objects_path )
213
+ 'qrc_' + File.basename(resource_name).gsub('.qrc', '.cpp')
219
214
  end
220
215
 
221
216
  end
@@ -1,6 +1,3 @@
1
- require 'rake/file_task_alias'
2
- require 'rake/local_config'
3
-
4
1
  include Rake::DSL
5
2
 
6
3
  class Rake::Builder
@@ -71,7 +68,7 @@ class Rake::Builder
71
68
  @builder.create_local_config
72
69
  end
73
70
 
74
- once_task :load_local_config => scoped_task(@builder.local_config) do
71
+ once_task :load_local_config => @builder.local_config do
75
72
  @builder.load_local_config
76
73
  end
77
74
 
@@ -2,7 +2,7 @@ module Rake
2
2
  class Builder
3
3
  module VERSION #:nodoc:
4
4
  MAJOR = 0
5
- MINOR = 7
5
+ MINOR = 8
6
6
  TINY = 0
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY].join('.')
@@ -1,16 +1,25 @@
1
- require 'rubygems' if RUBY_VERSION < '1.9'
2
- require 'rake/tasklib'
3
1
  require 'fileutils'
4
2
 
5
3
  module Rake
6
-
7
4
  module Microsecond
8
- # Compensate for file systems with 1s resolution
9
-
10
- class FileTask < Task
11
-
5
+ class Base < Task
12
6
  attr_accessor :timestamp
13
7
 
8
+ def prerequisites_needed?
9
+ prerequisites.any? do |n|
10
+ task = application[n]
11
+ if task.is_a?(Rake::FileTask) or
12
+ task.is_a?(self.class)
13
+ task.timestamp > @timestamp
14
+ else
15
+ task.needed?
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ # Compensate for file systems with 1s resolution
22
+ class FileTask < Base
14
23
  def self.define_task( *args, &block )
15
24
  task = super( *args, &block )
16
25
  task.timestamp = nil
@@ -20,32 +29,21 @@ module Rake
20
29
  def needed?
21
30
  return true if not File.exist?(self.name)
22
31
  @timestamp = File.stat(self.name).mtime if @timestamp.nil?
23
- self.prerequisites.any? do |n|
24
- task = application[n]
25
- if task.is_a?(Rake::FileTask) or
26
- task.is_a?(self.class)
27
- task.timestamp > @timestamp
28
- else
29
- task.needed?
30
- end
31
- end
32
+ prerequisites_needed?
32
33
  end
33
34
 
34
35
  def execute(*args)
35
36
  @timestamp = Time.now
36
37
  super(*args)
37
38
  end
38
-
39
39
  end
40
40
 
41
- class DirectoryTask < Task
42
-
41
+ class DirectoryTask < Base
43
42
  include FileUtils
44
43
 
45
- attr_accessor :timestamp
46
44
  attr_accessor :path
47
45
 
48
- def self.define_task( *args, &block )
46
+ def self.define_task(*args, &block)
49
47
  task = super(*args, &block)
50
48
  task.path = args[0]
51
49
  task.timestamp = nil
@@ -53,11 +51,11 @@ module Rake
53
51
  end
54
52
 
55
53
  def needed?
56
- exists = File.directory?(self.path)
57
- if exists && @timestamp.nil?
54
+ return true if not File.directory?(self.path)
55
+ if @timestamp.nil?
58
56
  @timestamp = File.stat(self.path).mtime
59
57
  end
60
- ! exists
58
+ prerequisites_needed?
61
59
  end
62
60
 
63
61
  def execute(*args)
@@ -65,11 +63,8 @@ module Rake
65
63
  @timestamp = Time.now
66
64
  super(*args)
67
65
  end
68
-
69
66
  end
70
-
71
67
  end
72
-
73
68
  end
74
69
 
75
70
  def microsecond_file(*args, &block)
@@ -1,16 +1,13 @@
1
- require 'rubygems' if RUBY_VERSION < '1.9'
2
1
  require 'rake/tasklib'
3
2
 
4
3
  module Rake
5
-
6
4
  # A task whick is no longer needed after its first invocation
7
5
  class OnceTask < Task
8
-
9
6
  attr_accessor :invoked
10
7
  attr_accessor :timestamp
11
8
 
12
- def self.define_task( *args, &block )
13
- task = super( *args, &block )
9
+ def self.define_task(*args, &block)
10
+ task = super(*args, &block)
14
11
  task.timestamp = nil
15
12
  task.invoked = false
16
13
  task
@@ -25,9 +22,7 @@ module Rake
25
22
  def needed?
26
23
  ! @invoked
27
24
  end
28
-
29
25
  end
30
-
31
26
  end
32
27
 
33
28
  def once_task(*args, &block)