rscons 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OTdiYzZmYzkzY2U5MTI1MGMwZjlmNDFmZGFkY2NmY2Y5NDQxZTllOQ==
4
+ MTQxY2I3MDZhNDdhOGNmMDZkM2ZmZjQ1OWRmZjNkZTgwNDlkYzQ5MA==
5
5
  data.tar.gz: !binary |-
6
- MTVlMzQxYTUwMzY2OWViZGI1ZDAwYzQ4OTgyMjYyY2FjYmU5MzdhYg==
6
+ MzYwNjZmODZlMzllZjM5Yjg5YTEzZDZkYWRkMmIwYWY3YjkzN2RmOA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NTNhNGM4MzRhZDcwODdlM2Q0NmQ2Y2UzOWQ2ZDk5ZmY5M2IwMGY5NzBmMzdh
10
- YTYxYTA0NTgzMzk3NzA4MDMzN2U5NWQ0ZjEyMmVkZWE5ZWRlZjNiZGNmZTQ4
11
- NTgwY2QxYTFmZmY3NzE2MmU1NWJiZmQyMjg0OGUxMWY0MWZlMDI=
9
+ ZDQyNzc4MGJmZTY4ZmZhNzU4ZGUwNDdiNDYxNWJjYjMzOTQ4OTAyNzIwM2I2
10
+ ZDRiMWNmNjQwYWM2YmY3ZWVlOGYxZGU4YmQ1Y2I3YzUyZjJhMDc4YTRhYjQ5
11
+ ZTQ1NDU0NTM3MGI5YTMzZTgwOTk2MTljMDJkMGJmNjkwODI2ZGI=
12
12
  data.tar.gz: !binary |-
13
- MzJjYzUwNmRjNDQyMGUxNjM3OTIzMzVlNWFlZDllNmI3YWUzYWIwMWI4MTc5
14
- OWQ0NmExNjk3NWZmN2NhNDExMDgxZjA2NjZmZGYzMzZmZTRlZTRmYWUzMGIz
15
- ZjA2YjM3NTBlYjY2MzgyNTczOTBiYTA0Y2UzYWYyMDc3ODNlMzc=
13
+ ZGIzNjA5MWE0MzU2ODUzOTk1YWE0YzExMjBhNzBlNTllMGFjNjE1YmE1Yzg0
14
+ MzEzZjE4MGMyYzg4YmJmNjFiMWFhODU2MjIxMTg4NThmMTNhMjAwYWQ4MTQw
15
+ ZTk4ZDY4ZjNiMGVkNmM5MTA5NmRhZWFiOGY3YjdmZDVlODMxOTM=
data/README.md CHANGED
@@ -110,6 +110,29 @@ Rscons::Environment.new do |env|
110
110
  end
111
111
  ```
112
112
 
113
+ ### Example: Custom Builder That Generates Multiple Output Files
114
+
115
+ ```ruby
116
+ class CModuleGenerator < Rscons::Builder
117
+ def run(target, sources, cache, env, vars)
118
+ c_fname = target
119
+ h_fname = target.sub(/\.c$/, ".h")
120
+ cmd = ["generate_c_and_h", sources.first, c_fname, h_fname]
121
+ unless cache.up_to_date?([c_fname, h_fname], cmd, sources, env)
122
+ cache.mkdir_p(File.dirname(target))
123
+ system(cmd)
124
+ cache.register_build([c_fname, h_fname], cmd, sources, env)
125
+ end
126
+ target
127
+ end
128
+ end
129
+
130
+ Rscons::Environment.new do |env|
131
+ env.add_builder(CModuleGenerator.new)
132
+ env.CModuleGenerator("build/foo.c", "foo_gen.cfg")
133
+ end
134
+ ```
135
+
113
136
  ### Example: Custom Builder Using Builder#standard_build()
114
137
 
115
138
  The `standard_build` method from the `Rscons::Builder` base class can be used
@@ -218,6 +241,13 @@ cloned_env["CPPPATH"] << "three"
218
241
  Documentation for the complete Rscons API can be found at
219
242
  http://rubydoc.info/github/holtrop/rscons/frames.
220
243
 
244
+ ## Release Notes
245
+
246
+ ### v1.1.0
247
+
248
+ - Change Cache#up_to_date?() and #register_build() to accept a single target
249
+ file or an array of target file names
250
+
221
251
  ## Contributing
222
252
 
223
253
  1. Fork it
@@ -85,16 +85,17 @@ module Rscons
85
85
  end
86
86
  end
87
87
 
88
- # Check if a target is up to date
89
- # @param target [String] The name of the target file.
90
- # @param command [Array] The command used to build the target.
88
+ # Check if target(s) are up to date
89
+ # @param targets [String, Array] The name(s) of the target file(s).
90
+ # @param command [String, Array] The command used to build the target.
91
91
  # @param deps [Array] List of the target's dependency files.
92
92
  # @param env [Environment] The Rscons::Environment.
93
93
  # @param options [Hash] Optional options. Can contain the following keys:
94
94
  # :strict_deps::
95
95
  # Only consider a target up to date if its list of dependencies is
96
96
  # exactly equal (including order) to the cached list of dependencies
97
- # @return true value if the target is up to date, meaning that:
97
+ # @return true if the targets are all up to date, meaning that,
98
+ # for each target:
98
99
  # - the target exists on disk
99
100
  # - the cache has information for the target
100
101
  # - the target's checksum matches its checksum when it was last built
@@ -104,65 +105,69 @@ module Rscons
104
105
  # exactly equal to those cached
105
106
  # - each cached dependency file's current checksum matches the checksum
106
107
  # stored in the cache file
107
- def up_to_date?(target, command, deps, env, options = {})
108
- # target file must exist on disk
109
- return false unless File.exists?(target)
110
-
111
- # target must be registered in the cache
112
- return false unless @cache[:targets].has_key?(target)
113
-
114
- # target must have the same checksum as when it was built last
115
- return false unless @cache[:targets][target][:checksum] == lookup_checksum(target)
116
-
117
- # command used to build target must be identical
118
- return false unless @cache[:targets][target][:command] == command
119
-
120
- cached_deps = @cache[:targets][target][:deps] || []
121
- cached_deps_fnames = cached_deps.map { |dc| dc[:fname] }
122
- if options[:strict_deps]
123
- # depedencies passed in must exactly equal those in the cache
124
- return false unless deps == cached_deps_fnames
125
- else
126
- # all dependencies passed in must exist in cache (but cache may have more)
127
- return false unless (Set.new(deps) - Set.new(cached_deps_fnames)).empty?
128
- end
108
+ def up_to_date?(targets, command, deps, env, options = {})
109
+ Array(targets).each do |target|
110
+ # target file must exist on disk
111
+ return false unless File.exists?(target)
112
+
113
+ # target must be registered in the cache
114
+ return false unless @cache[:targets].has_key?(target)
115
+
116
+ # target must have the same checksum as when it was built last
117
+ return false unless @cache[:targets][target][:checksum] == lookup_checksum(target)
118
+
119
+ # command used to build target must be identical
120
+ return false unless @cache[:targets][target][:command] == command
121
+
122
+ cached_deps = @cache[:targets][target][:deps] || []
123
+ cached_deps_fnames = cached_deps.map { |dc| dc[:fname] }
124
+ if options[:strict_deps]
125
+ # depedencies passed in must exactly equal those in the cache
126
+ return false unless deps == cached_deps_fnames
127
+ else
128
+ # all dependencies passed in must exist in cache (but cache may have more)
129
+ return false unless (Set.new(deps) - Set.new(cached_deps_fnames)).empty?
130
+ end
129
131
 
130
- # set of user dependencies must match
131
- user_deps = env.get_user_deps(target) || []
132
- cached_user_deps = @cache[:targets][target][:user_deps] || []
133
- cached_user_deps_fnames = cached_user_deps.map { |dc| dc[:fname] }
134
- return false unless user_deps == cached_user_deps_fnames
132
+ # set of user dependencies must match
133
+ user_deps = env.get_user_deps(target) || []
134
+ cached_user_deps = @cache[:targets][target][:user_deps] || []
135
+ cached_user_deps_fnames = cached_user_deps.map { |dc| dc[:fname] }
136
+ return false unless user_deps == cached_user_deps_fnames
135
137
 
136
- # all cached dependencies must have their checksums match
137
- (cached_deps + cached_user_deps).each do |dep_cache|
138
- return false unless dep_cache[:checksum] == lookup_checksum(dep_cache[:fname])
138
+ # all cached dependencies must have their checksums match
139
+ (cached_deps + cached_user_deps).each do |dep_cache|
140
+ return false unless dep_cache[:checksum] == lookup_checksum(dep_cache[:fname])
141
+ end
139
142
  end
140
143
 
141
144
  true
142
145
  end
143
146
 
144
- # Store cache information about a target built by a builder
145
- # @param target [String] The name of the target.
146
- # @param command [Array] The command used to build the target.
147
+ # Store cache information about target(s) built by a builder
148
+ # @param targets [String, Array] The name of the target(s) built.
149
+ # @param command [String, Array] The command used to build the target.
147
150
  # @param deps [Array] List of dependencies for the target.
148
151
  # @param env [Environment] The Rscons::Environment.
149
- def register_build(target, command, deps, env)
150
- @cache[:targets][target.encode(__ENCODING__)] = {
151
- command: command,
152
- checksum: calculate_checksum(target),
153
- deps: deps.map do |dep|
154
- {
155
- fname: dep.encode(__ENCODING__),
156
- checksum: lookup_checksum(dep),
157
- }
158
- end,
159
- user_deps: (env.get_user_deps(target) || []).map do |dep|
160
- {
161
- fname: dep.encode(__ENCODING__),
162
- checksum: lookup_checksum(dep),
163
- }
164
- end,
165
- }
152
+ def register_build(targets, command, deps, env)
153
+ Array(targets).each do |target|
154
+ @cache[:targets][target.encode(__ENCODING__)] = {
155
+ command: command,
156
+ checksum: calculate_checksum(target),
157
+ deps: deps.map do |dep|
158
+ {
159
+ fname: dep.encode(__ENCODING__),
160
+ checksum: lookup_checksum(dep),
161
+ }
162
+ end,
163
+ user_deps: (env.get_user_deps(target) || []).map do |dep|
164
+ {
165
+ fname: dep.encode(__ENCODING__),
166
+ checksum: lookup_checksum(dep),
167
+ }
168
+ end,
169
+ }
170
+ end
166
171
  end
167
172
 
168
173
  # Return a list of targets that have been built
@@ -1,4 +1,4 @@
1
1
  module Rscons
2
2
  # gem version
3
- VERSION = "1.0.0"
3
+ VERSION = "1.1.0"
4
4
  end
@@ -218,9 +218,9 @@ describe Rscons do
218
218
  end
219
219
 
220
220
  it 'allows Ruby classes as custom builders to be used to construct files' do
221
- test_dir('custom_builder')
221
+ test_dir('custom_builder')
222
222
  class MySource < Rscons::Builder
223
- def run(target, sources, user_deps, cache, env, vars = {})
223
+ def run(target, sources, cache, env, vars)
224
224
  File.open(target, 'w') do |fh|
225
225
  fh.puts <<EOF
226
226
  #define THE_VALUE 5678
@@ -241,6 +241,39 @@ EOF
241
241
  `./program`.should == "The value is 5678\n"
242
242
  end
243
243
 
244
+ it 'supports custom builders with multiple targets' do
245
+ test_dir('custom_builder')
246
+ class CHGen < Rscons::Builder
247
+ def run(target, sources, cache, env, vars)
248
+ c_fname = target
249
+ h_fname = target.sub(/\.c$/, ".h")
250
+ unless cache.up_to_date?([c_fname, h_fname], "", sources, env)
251
+ puts "CHGen #{c_fname}"
252
+ File.open(c_fname, "w") {|fh| fh.puts "int THE_VALUE = 42;"}
253
+ File.open(h_fname, "w") {|fh| fh.puts "extern int THE_VALUE;"}
254
+ cache.register_build([c_fname, h_fname], "", sources, env)
255
+ end
256
+ target
257
+ end
258
+ end
259
+
260
+ env = Rscons::Environment.new do |env|
261
+ env.add_builder(CHGen.new)
262
+ env.CHGen("inc.c", ["program.c"])
263
+ env.Program("program", Dir["*.c"] + ["inc.c"])
264
+ end
265
+
266
+ lines.should == ["CHGen inc.c", "CC program.o", "CC inc.o", "LD program"]
267
+ File.exists?("inc.c").should be_true
268
+ File.exists?("inc.h").should be_true
269
+ `./program`.should == "The value is 42\n"
270
+
271
+ File.open("inc.c", "w") {|fh| fh.puts "int THE_VALUE = 33;"}
272
+ env.process
273
+ lines.should == ["CHGen inc.c"]
274
+ `./program`.should == "The value is 42\n"
275
+ end
276
+
244
277
  it 'allows cloning Environment objects' do
245
278
  test_dir('clone_env')
246
279
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rscons
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Holtrop
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-14 00:00:00.000000000 Z
11
+ date: 2014-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec-core