rscons 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -24,7 +24,7 @@ module Rscons
24
24
  # Return the name of the target or false on failure.
25
25
  def standard_build(short_cmd_string, target, command, sources, env, cache)
26
26
  unless cache.up_to_date?(target, command, sources)
27
- FileUtils.mkdir_p(File.dirname(target))
27
+ cache.mkdir_p(File.dirname(target))
28
28
  FileUtils.rm_f(target)
29
29
  return false unless env.execute(short_cmd_string, command)
30
30
  cache.register_build(target, command, sources)
@@ -55,7 +55,7 @@ module Rscons
55
55
  end
56
56
  command = env.build_command(env["#{com_prefix}COM"], vars)
57
57
  unless cache.up_to_date?(target, command, sources)
58
- FileUtils.mkdir_p(File.dirname(target))
58
+ cache.mkdir_p(File.dirname(target))
59
59
  FileUtils.rm_f(target)
60
60
  return false unless env.execute("#{com_prefix} #{target}", command)
61
61
  deps = sources
data/lib/rscons/cache.rb CHANGED
@@ -36,6 +36,11 @@ module Rscons
36
36
  # ]
37
37
  # }
38
38
  # }
39
+ # directories: {
40
+ # 'build' => true,
41
+ # 'build/one' => true,
42
+ # 'build/two' => true,
43
+ # }
39
44
  # }
40
45
  class Cache
41
46
  #### Constants
@@ -57,6 +62,7 @@ module Rscons
57
62
  def initialize
58
63
  @cache = YAML.load(File.read(CACHE_FILE)) rescue {
59
64
  targets: {},
65
+ directories: {},
60
66
  version: VERSION,
61
67
  }
62
68
  @lookup_checksums = {}
@@ -132,6 +138,31 @@ module Rscons
132
138
  }
133
139
  end
134
140
 
141
+ # Return a list of targets that have been built
142
+ def targets
143
+ @cache[:targets].keys
144
+ end
145
+
146
+ # Make any needed directories and record the ones that are created for
147
+ # removal upon a "clean" operation.
148
+ def mkdir_p(path)
149
+ parts = path.split(/[\\\/]/)
150
+ (0..parts.size).each do |i|
151
+ subpath = File.join(*parts[0, i + 1])
152
+ unless File.exists?(subpath)
153
+ FileUtils.mkdir(subpath)
154
+ unless @cache[:directories].include?(subpath)
155
+ @cache[:directories][subpath] = true
156
+ end
157
+ end
158
+ end
159
+ end
160
+
161
+ # Return a list of directories which were created as a part of the build
162
+ def directories
163
+ @cache[:directories].keys
164
+ end
165
+
135
166
  # Private Instance Methods
136
167
  private
137
168
 
@@ -96,7 +96,6 @@ module Rscons
96
96
  end
97
97
  build_fname.gsub!('\\', '/')
98
98
  end
99
- FileUtils.mkdir_p(File.dirname(build_fname))
100
99
  build_fname
101
100
  end
102
101
 
@@ -1,4 +1,4 @@
1
1
  module Rscons
2
2
  # gem version
3
- VERSION = "0.0.7"
3
+ VERSION = "0.0.8"
4
4
  end
data/lib/rscons.rb CHANGED
@@ -22,4 +22,20 @@ module Rscons
22
22
 
23
23
  class BuildError < Exception
24
24
  end
25
+
26
+ # Remove all generated files
27
+ def self.clean
28
+ cache = Cache.new
29
+ # remove all built files
30
+ cache.targets.each do |target|
31
+ FileUtils.rm_f(target)
32
+ end
33
+ # remove all created directories if they are empty
34
+ cache.directories.sort {|a, b| b.size <=> a.size}.each do |directory|
35
+ if (Dir.entries(directory) - ['.', '..']).empty?
36
+ Dir.rmdir(directory) rescue nil
37
+ end
38
+ end
39
+ Cache.clear
40
+ end
25
41
  end
@@ -120,6 +120,35 @@ describe Rscons do
120
120
  File.exists?('build/two/two.o').should be_true
121
121
  end
122
122
 
123
+ it 'cleans built files' do
124
+ lines = test_dir('build_dir')
125
+ `./build_dir`.should == "Hello from two()\n"
126
+ File.exists?('build/one/one.o').should be_true
127
+ File.exists?('build/two/two.o').should be_true
128
+ Rscons.clean
129
+ File.exists?('build/one/one.o').should be_false
130
+ File.exists?('build/two/two.o').should be_false
131
+ File.exists?('build/one').should be_false
132
+ File.exists?('build/two').should be_false
133
+ File.exists?('build').should be_false
134
+ File.exists?('src/one/one.c').should be_true
135
+ end
136
+
137
+ it 'does not clean created directories if other non-rscons-generated files reside there' do
138
+ lines = test_dir('build_dir')
139
+ `./build_dir`.should == "Hello from two()\n"
140
+ File.exists?('build/one/one.o').should be_true
141
+ File.exists?('build/two/two.o').should be_true
142
+ File.open('build/two/tmp', 'w') { |fh| fh.puts "dum" }
143
+ Rscons.clean
144
+ File.exists?('build/one/one.o').should be_false
145
+ File.exists?('build/two/two.o').should be_false
146
+ File.exists?('build/one').should be_false
147
+ File.exists?('build/two').should be_true
148
+ File.exists?('build').should be_true
149
+ File.exists?('src/one/one.c').should be_true
150
+ end
151
+
123
152
  it 'allows Ruby classes as custom builders to be used to construct files' do
124
153
  lines = test_dir('custom_builder')
125
154
  lines.should == ['CC program.o', 'LD program']
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rscons
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-17 00:00:00.000000000 Z
12
+ date: 2013-09-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec-core
@@ -220,7 +220,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
220
220
  version: '0'
221
221
  segments:
222
222
  - 0
223
- hash: 1121865149781113593
223
+ hash: 1569804544346672043
224
224
  required_rubygems_version: !ruby/object:Gem::Requirement
225
225
  none: false
226
226
  requirements:
@@ -229,7 +229,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
229
229
  version: '0'
230
230
  segments:
231
231
  - 0
232
- hash: 1121865149781113593
232
+ hash: 1569804544346672043
233
233
  requirements: []
234
234
  rubyforge_project:
235
235
  rubygems_version: 1.8.23