rake-builder 0.0.14 → 0.0.15

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,11 +1,12 @@
1
- module Rake
1
+ require 'rake/tasklib'
2
2
 
3
- class Builder
3
+ module Rake
4
+ class Builder < TaskLib
4
5
 
5
6
  module VERSION #:nodoc:
6
- MAJOR = 0
7
- MINOR = 0
8
- TINY = 14
7
+ MAJOR = 0
8
+ MINOR = 0
9
+ TINY = 15
9
10
 
10
11
  STRING = [ MAJOR, MINOR, TINY ].join('.')
11
12
  end
@@ -13,3 +14,4 @@ module Rake
13
14
  end
14
15
 
15
16
  end
17
+
@@ -4,35 +4,38 @@ module Rake
4
4
 
5
5
  class LocalConfig
6
6
 
7
- attr_accessor :config
7
+ VERSIONS = ['1.0', '1.1']
8
+
9
+ attr_accessor :include_paths
10
+ attr_accessor :compilation_options
8
11
 
9
12
  def initialize( file_name )
10
- @file_name = file_name
11
- @config = { :rake_builder => { :config_file => { :version=> '1.0' } },
12
- :include_paths => [] }
13
+ @file_name = file_name
14
+ @include_paths = []
15
+ @compilation_options = []
13
16
  end
14
17
 
15
18
  def load
16
- @config = YAML.load_file( @file_name )
17
-
18
- version = @config[ :rake_builder ][ :config_file ][ :version ]
19
- raise Rake::Builder::BuilderError.new( 'Config file version missing' ) if version.nil?
19
+ config = YAML.load_file( @file_name )
20
20
 
21
- @config[ :include_paths ] ||= []
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)
25
+ raise Rake::Builder::BuilderError.new('Config file version incorrect')
26
+ end
22
27
  end
23
28
 
24
29
  def save
25
30
  File.open( @file_name, 'w' ) do | file |
26
- file.write @config.to_yaml
31
+ file.write config.to_yaml
27
32
  end
28
33
  end
29
34
 
30
- def include_paths
31
- @config[ :include_paths ]
32
- end
33
-
34
- def include_paths=( include_paths )
35
- @config[ :include_paths ] = include_paths
35
+ def config
36
+ { :rake_builder => { :config_file => { :version => VERSIONS[-1] } },
37
+ :include_paths => @include_paths,
38
+ :compilation_options => @compilation_options }
36
39
  end
37
40
 
38
41
  end
@@ -0,0 +1,70 @@
1
+ require 'rubygems' if RUBY_VERSION < '1.9'
2
+ require 'rake/tasklib'
3
+ require 'fileutils'
4
+
5
+ module Rake
6
+
7
+ module Microsecond
8
+ # Compensate for file systems with 1s resolution
9
+
10
+ class FileTask < Task
11
+
12
+ attr_accessor :timestamp
13
+
14
+ def self.define_task( *args, &block )
15
+ task = super( *args, &block )
16
+ task.timestamp = nil
17
+ task
18
+ end
19
+
20
+ def needed?
21
+ return true if ! File.exist?( self.name )
22
+ @timestamp = File.stat( self.name ).mtime if @timestamp.nil?
23
+ return self.prerequisites.any? { | n | ! application[n].timestamp.nil? && application[n].timestamp > @timestamp }
24
+ end
25
+
26
+ def execute(*args)
27
+ @timestamp = Time.now
28
+ super(*args)
29
+ end
30
+
31
+ end
32
+
33
+ class DirectoryTask < Task
34
+
35
+ include FileUtils
36
+
37
+ attr_accessor :timestamp
38
+
39
+ def self.define_task( *args, &block )
40
+ task = super( *args, &block )
41
+ task.timestamp = nil
42
+ task
43
+ end
44
+
45
+ def needed?
46
+ exists = File.directory?( self.name )
47
+ @timestamp = File.stat( self.name ).mtime if exists
48
+ ! exists
49
+ end
50
+
51
+ def execute(*args)
52
+ mkdir_p self.name, :verbose => false
53
+ @timestamp = Time.now
54
+ super(*args)
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+
63
+ def microsecond_file(*args, &block)
64
+ Rake::Microsecond::FileTask.define_task(*args, &block)
65
+ end
66
+
67
+ def microsecond_directory(*args, &block)
68
+ Rake::Microsecond::DirectoryTask.define_task(*args, &block)
69
+ end
70
+
@@ -0,0 +1,36 @@
1
+ require 'rubygems' if RUBY_VERSION < '1.9'
2
+ require 'rake/tasklib'
3
+
4
+ module Rake
5
+
6
+ # A task whick is no longer needed after its first invocation
7
+ class OnceTask < Task
8
+
9
+ attr_accessor :invoked
10
+ attr_accessor :timestamp
11
+
12
+ def self.define_task( *args, &block )
13
+ task = super( *args, &block )
14
+ task.timestamp = nil
15
+ task.invoked = false
16
+ task
17
+ end
18
+
19
+ def execute(*args)
20
+ @timestamp = Time.now
21
+ @invoked = true
22
+ super(*args)
23
+ end
24
+
25
+ def needed?
26
+ ! @invoked
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+ def once_task(*args, &block)
34
+ Rake::OnceTask.define_task(*args, &block)
35
+ end
36
+
@@ -32,8 +32,18 @@ module Rake
32
32
  paths.map{ |path| expand_with_root( path, root ) }
33
33
  end
34
34
 
35
- def self.subtract_prefix( prefix, path )
36
- path[ prefix.size .. -1 ]
35
+ def self.relative_path( path, prefix, options = {} )
36
+ return path if prefix.nil?
37
+ m = path.match( /^#{ prefix }\/?/ )
38
+ if ! m.nil?
39
+ if options[ :initial_dot_slash ]
40
+ "./#{ m.post_match }"
41
+ else
42
+ m.post_match
43
+ end
44
+ else
45
+ path
46
+ end
37
47
  end
38
48
 
39
49
  end
@@ -1,17 +1,23 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
1
+ load File.dirname(__FILE__) + '/spec_helper.rb'
2
2
 
3
3
  describe 'when building a C project' do
4
4
 
5
5
  include RakeBuilderHelper
6
6
 
7
7
  before( :all ) do
8
- @test_output_file = Rake::Path.expand_with_root( 'rake-c-testfile.txt', SPEC_PATH )
8
+ @test_output_file = Rake::Path.expand_with_root( 'rake-c-testfile.txt', RakeBuilderHelper::SPEC_PATH )
9
9
  end
10
10
 
11
11
  before( :each ) do
12
12
  Rake::Task.clear
13
13
  @project = c_task( :executable )
14
- @expected_generated = Rake::Path.expand_all_with_root( [ './main.o', @project.makedepend_file, @project.target ], SPEC_PATH )
14
+ @expected_generated = Rake::Path.expand_all_with_root(
15
+ [
16
+ './main.o',
17
+ @project.makedepend_file, @project.target
18
+ ],
19
+ RakeBuilderHelper::SPEC_PATH
20
+ )
15
21
  `rm -f #{ @test_output_file }`
16
22
  `rm -f #{ @project.target }`
17
23
  end
@@ -19,14 +25,15 @@ describe 'when building a C project' do
19
25
  after( :each ) do
20
26
  Rake::Task[ 'clean' ].invoke
21
27
  `rm -f #{ @test_output_file }`
28
+ `rm -f '#{ @project.local_config }'`
22
29
  end
23
30
 
24
- it 'builds the program with \'build\'' do
31
+ it "builds the program with 'build'" do
25
32
  Rake::Task[ 'build' ].invoke
26
33
  exist?( @project.target ).should be_true
27
34
  end
28
35
 
29
- it 'runs the program with \'run\'' do
36
+ it "runs the program with 'run'" do
30
37
  Rake::Task[ 'run' ].invoke
31
38
  exist?( @test_output_file ).should be_true
32
39
  end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
1
+ load File.dirname(__FILE__) + '/spec_helper.rb'
2
2
 
3
3
  describe 'when building an executable' do
4
4
 
@@ -6,10 +6,10 @@ describe 'when building an executable' do
6
6
 
7
7
  before( :all ) do
8
8
  @test_output_file = Rake::Path.expand_with_root(
9
- 'rake-builder-testfile.txt', SPEC_PATH )
9
+ 'rake-builder-testfile.txt', RakeBuilderHelper::SPEC_PATH )
10
10
  @expected_target = Rake::Path.expand_with_root(
11
11
  RakeBuilderHelper::TARGET[ :executable ],
12
- SPEC_PATH )
12
+ RakeBuilderHelper::SPEC_PATH )
13
13
  end
14
14
 
15
15
  before( :each ) do
@@ -77,8 +77,8 @@ describe 'when using namespaces' do
77
77
  end
78
78
 
79
79
  it 'creates the correct tasks' do
80
- expected_tasks = expected_tasks( [ @project.target ], 'my_namespace' )
81
- missing_tasks = expected_tasks - task_names
80
+ expected = expected_tasks( scoped_tasks( [ @project.target ], 'my_namespace' ), 'my_namespace' )
81
+ missing_tasks = expected - task_names
82
82
  missing_tasks.should == []
83
83
  end
84
84
 
@@ -119,7 +119,9 @@ describe 'when building a shared library' do
119
119
 
120
120
  before( :each ) do
121
121
  Rake::Task.clear
122
- @project = cpp_task( :shared_library )
122
+ @project = cpp_task( :shared_library ) do |builder|
123
+ builder.compilation_options += ['-fPIC']
124
+ end
123
125
  `rm -f #{ @project.target }`
124
126
  end
125
127
 
@@ -1,27 +1,141 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
1
+ load File.dirname(__FILE__) + '/spec_helper.rb'
2
+ require 'fileutils'
2
3
 
3
4
  describe 'the dependencies system' do
4
5
 
5
6
  include RakeBuilderHelper
7
+ include FileUtils
6
8
 
7
9
  before( :each ) do
8
10
  Rake::Task.clear
9
11
  @project = cpp_task( :executable )
10
12
  Rake::Task[ 'clean' ].execute
13
+ rm_f @project.local_config, :verbose => false
11
14
  end
12
15
 
13
16
  after( :each ) do
14
17
  Rake::Task[ 'clean' ].execute
15
18
  end
16
19
 
17
- it 'says the target is up to date, if nothing changes' do
18
- Rake::Task[ 'build' ].invoke
19
- Rake::Task[ @project.target ].needed?.should_not be_true
20
+ context 'objects_path' do
21
+
22
+ it 'should not be needed after being called' do
23
+ Rake::Task[ @project.objects_path ].invoke
24
+
25
+ Rake::Task[ @project.objects_path ].needed?.should be_false
26
+ end
27
+
20
28
  end
21
29
 
22
- it 'says the build is up to date, if nothing changes' do
23
- Rake::Task[ 'build' ].invoke
24
- Rake::Task[ 'build' ].needed?.should be_false
30
+ context 'missing_headers' do
31
+
32
+ it 'should not be needed after being invoked' do
33
+ Rake::Task[ 'missing_headers' ].needed?.should be_true
34
+
35
+ Rake::Task[ 'missing_headers' ].invoke
36
+
37
+ Rake::Task[ 'missing_headers' ].needed?.should be_false
38
+ end
39
+
40
+ end
41
+
42
+ context 'makedepend_file' do
43
+
44
+ it 'should create the makedepend_file' do
45
+ exist?( @project.makedepend_file ).should be_false
46
+
47
+ Rake::Task[ @project.makedepend_file ].invoke
48
+
49
+ exist?( @project.makedepend_file ).should be_true
50
+ end
51
+
52
+ it 'should not be older than its prerequisites' do
53
+ t = Rake::Task[ @project.makedepend_file ]
54
+
55
+ t.invoke
56
+
57
+ stamp = t.timestamp
58
+ t.prerequisites.any? { |n| t.application[n].timestamp > stamp }.should be_false
59
+ end
60
+
61
+ it 'should have all prerequisites satisfied' do
62
+ t = Rake::Task[ @project.makedepend_file ]
63
+
64
+ t.invoke
65
+
66
+ t.prerequisites.any? { |n| t.application[n].needed? }.should be_false
67
+ end
68
+
69
+ it 'should not say the makedepend_file is needed' do
70
+ t = Rake::Task[ @project.makedepend_file ]
71
+
72
+ t.needed?.should be_true
73
+
74
+ t.invoke
75
+
76
+ t.needed?.should be_false
77
+ end
78
+
79
+ end
80
+
81
+ context 'build' do
82
+
83
+ before :each do
84
+ @task = Rake::Task[ 'build' ]
85
+ end
86
+
87
+ it 'should have all prerequisites satisfied' do
88
+ @task.invoke
89
+
90
+ @task.prerequisites.any? { |n| @task.application[n].needed? }.should be_false
91
+ end
92
+
93
+ it 'should create the makedepend_file' do
94
+ exist?( @project.makedepend_file ).should be_false
95
+
96
+ Rake::Task[ 'build' ].invoke
97
+
98
+ exist?( @project.makedepend_file ).should be_true
99
+ end
100
+
101
+ it 'should create the target' do
102
+ Rake::Task[ 'build' ].invoke
103
+
104
+ exist?( @project.target ).should be_true
105
+ end
106
+
107
+ it 'should say the compile task is up to date' do
108
+ Rake::Task[ 'build' ].invoke
109
+
110
+ Rake::Task[ 'compile' ].needed?.should be_false
111
+ end
112
+
113
+ it 'should say the build is up to date' do
114
+ Rake::Task[ 'build' ].invoke
115
+
116
+ Rake::Task[ 'build' ].needed?.should be_false
117
+ end
118
+
119
+ it 'should say the makedepend_file is up to date' do
120
+ exist?( @project.makedepend_file ).should be_false
121
+
122
+ isolating_seconds do
123
+ Rake::Task[ 'build' ].invoke
124
+ end
125
+
126
+ Rake::Task[ @project.makedepend_file ].needed?.should be_false
127
+ end
128
+
129
+ it 'should say the target is up to date' do
130
+ Rake::Task[ 'build' ].invoke
131
+
132
+ target_mtime = File.stat( @project.target ).mtime
133
+ @project.target_prerequisites.each do | prerequisite |
134
+ File.stat( prerequisite ).mtime.should be < target_mtime
135
+ end
136
+ Rake::Task[ @project.target ].needed?.should be_false
137
+ end
138
+
25
139
  end
26
140
 
27
141
  it 'doesn\'t recompile objects, if nothing changes' do
@@ -30,7 +144,7 @@ describe 'the dependencies system' do
30
144
  end
31
145
  Rake::Task.clear
32
146
  @project = cpp_task( :executable )
33
- object_file_path = Rake::Path.expand_with_root( 'main.o', SPEC_PATH )
147
+ object_file_path = Rake::Path.expand_with_root( 'main.o', RakeBuilderHelper::SPEC_PATH )
34
148
  Rake::Task[ object_file_path ].needed?.should be_false
35
149
  end
36
150
 
@@ -40,16 +154,16 @@ describe 'the dependencies system' do
40
154
  end
41
155
  Rake::Task.clear
42
156
  @project = cpp_task( :executable )
43
- source_file_path = Rake::Path.expand_with_root( 'cpp_project/main.cpp', SPEC_PATH )
44
- object_file_path = Rake::Path.expand_with_root( 'main.o', SPEC_PATH )
157
+ source_file_path = Rake::Path.expand_with_root( 'cpp_project/main.cpp', RakeBuilderHelper::SPEC_PATH )
158
+ object_file_path = Rake::Path.expand_with_root( 'main.o', RakeBuilderHelper::SPEC_PATH )
45
159
  touching_temporarily( source_file_path, File.mtime( object_file_path ) + 1 ) do
46
160
  Rake::Task[ object_file_path ].needed?.should be_true
47
161
  end
48
162
  end
49
163
 
50
- it 'recompiles source files, if header dependencies' do
51
- header_file_path = Rake::Path.expand_with_root( 'cpp_project/main.h', SPEC_PATH )
52
- object_file_path = Rake::Path.expand_with_root( 'main.o', SPEC_PATH )
164
+ it 'recompiles source files, if header dependencies are more recent' do
165
+ header_file_path = Rake::Path.expand_with_root( 'cpp_project/main.h', RakeBuilderHelper::SPEC_PATH )
166
+ object_file_path = Rake::Path.expand_with_root( 'main.o', RakeBuilderHelper::SPEC_PATH )
53
167
  isolating_seconds do
54
168
  Rake::Task[ 'compile' ].invoke
55
169
  end
@@ -57,8 +171,10 @@ describe 'the dependencies system' do
57
171
  @project = cpp_task( :executable )
58
172
  # Header dependencies aren't loaded until we call :compile
59
173
  Rake::Task[ :load_makedepend ].invoke
174
+
60
175
  touching_temporarily( header_file_path, File.mtime( object_file_path ) + 1 ) do
61
- Rake::Task[ object_file_path ].needed?.should be_true
176
+ Rake::Task[ object_file_path ].needed?.
177
+ should be_true
62
178
  end
63
179
  end
64
180
 
@@ -82,11 +198,13 @@ describe 'Rakefile dependencies' do
82
198
  Rake::Task[ @project.target ].prerequisites.include?( @project.rakefile ).should be_true
83
199
  end
84
200
 
85
- # In our case this spec file is the spec_helper
86
- # i.e., the file that calls Rake::Builder.new
87
201
  it 'should indicate the target is out of date, if the Rakefile is newer' do
88
202
  Rake::Task[ 'build' ].invoke
203
+
89
204
  Rake::Task[ @project.target ].needed?.should be_false
205
+
206
+ Rake::Task.clear
207
+ @project = cpp_task( :executable )
90
208
  touching_temporarily( @project.target, File.mtime( @project.rakefile ) - 1 ) do
91
209
  Rake::Task[ @project.target ].needed?.should be_true
92
210
  end
@@ -94,7 +212,11 @@ describe 'Rakefile dependencies' do
94
212
 
95
213
  it 'should indicate that a build is needed if the Rakefile changes' do
96
214
  Rake::Task[ 'build' ].invoke
215
+
97
216
  Rake::Task[ 'build' ].needed?.should be_false
217
+
218
+ Rake::Task.clear
219
+ @project = cpp_task( :executable )
98
220
  touching_temporarily( @project.target, File.mtime( @project.rakefile ) - 1 ) do
99
221
  Rake::Task[ 'build' ].needed?.should be_true
100
222
  end