rscons 1.0.0 → 1.1.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.
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