rscons 1.4.3 → 1.5.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.
Files changed (48) hide show
  1. data/lib/rscons.rb +75 -5
  2. data/lib/rscons/build_target.rb +36 -0
  3. data/lib/rscons/builder.rb +41 -3
  4. data/lib/rscons/builders/cfile.rb +15 -0
  5. data/lib/rscons/builders/disassemble.rb +15 -0
  6. data/lib/rscons/builders/library.rb +17 -2
  7. data/lib/rscons/builders/object.rb +37 -5
  8. data/lib/rscons/builders/preprocess.rb +15 -0
  9. data/lib/rscons/builders/program.rb +42 -2
  10. data/lib/rscons/cache.rb +26 -6
  11. data/lib/rscons/environment.rb +259 -19
  12. data/lib/rscons/varset.rb +33 -10
  13. data/lib/rscons/version.rb +1 -1
  14. data/rscons.gemspec +8 -10
  15. metadata +38 -103
  16. checksums.yaml +0 -15
  17. data/.gitignore +0 -18
  18. data/.rspec +0 -2
  19. data/Gemfile +0 -4
  20. data/README.md +0 -384
  21. data/Rakefile.rb +0 -26
  22. data/build_tests/build_dir/src/one/one.c +0 -6
  23. data/build_tests/build_dir/src/two/two.c +0 -7
  24. data/build_tests/build_dir/src/two/two.h +0 -6
  25. data/build_tests/clone_env/src/program.c +0 -6
  26. data/build_tests/custom_builder/program.c +0 -7
  27. data/build_tests/d/main.d +0 -6
  28. data/build_tests/header/header.c +0 -7
  29. data/build_tests/header/header.h +0 -6
  30. data/build_tests/library/one.c +0 -8
  31. data/build_tests/library/three.c +0 -0
  32. data/build_tests/library/two.c +0 -0
  33. data/build_tests/simple/simple.c +0 -6
  34. data/build_tests/simple_cc/simple.cc +0 -8
  35. data/build_tests/two_sources/one.c +0 -8
  36. data/build_tests/two_sources/two.c +0 -3
  37. data/spec/build_tests_spec.rb +0 -527
  38. data/spec/rscons/builders/cfile_spec.rb +0 -28
  39. data/spec/rscons/builders/disassemble_spec.rb +0 -17
  40. data/spec/rscons/builders/library_spec.rb +0 -18
  41. data/spec/rscons/builders/object_spec.rb +0 -23
  42. data/spec/rscons/builders/preprocess_spec.rb +0 -18
  43. data/spec/rscons/builders/program_spec.rb +0 -18
  44. data/spec/rscons/cache_spec.rb +0 -271
  45. data/spec/rscons/environment_spec.rb +0 -361
  46. data/spec/rscons/varset_spec.rb +0 -163
  47. data/spec/rscons_spec.rb +0 -26
  48. data/spec/spec_helper.rb +0 -7
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --color
2
- --require spec_helper
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in rscons.gemspec
4
- gemspec
data/README.md DELETED
@@ -1,384 +0,0 @@
1
- # Rscons
2
-
3
- Software construction library inspired by SCons and implemented in Ruby
4
-
5
- [![Gem Version](https://badge.fury.io/rb/rscons.png)](http://badge.fury.io/rb/rscons)
6
-
7
- ## Installation
8
-
9
- Add this line to your application's Gemfile:
10
-
11
- gem "rscons"
12
-
13
- And then execute:
14
-
15
- $ bundle install
16
-
17
- Or install it yourself as:
18
-
19
- $ gem install rscons
20
-
21
- ## Usage
22
-
23
- Rscons is a Ruby library.
24
- It can be called from a standalone Ruby script or it can be used with rake and
25
- called from your Rakefile.
26
-
27
- ### Example: Building a C Program
28
-
29
- ```ruby
30
- Rscons::Environment.new do |env|
31
- env["CFLAGS"] << "-Wall"
32
- env.Program("program", Dir["**/*.c"])
33
- end
34
- ```
35
-
36
- ### Example: Building a D Program
37
-
38
- ```ruby
39
- Rscons::Environment.new do |env|
40
- env["DFLAGS"] << "-Wall"
41
- env.Program("program", Dir["**/*.d"])
42
- end
43
- ```
44
-
45
- ### Example: Cloning an Environment
46
-
47
- ```ruby
48
- main_env = Rscons::Environment.new do |env|
49
- # Store object files from sources under "src" in "build/main"
50
- env.build_dir("src", "build/main")
51
- env["CFLAGS"] = ["-DSOME_DEFINE", "-O3"]
52
- env["LIBS"] = ["SDL"]
53
- env.Program("program", Dir["src/**/*.cc"])
54
- end
55
-
56
- debug_env = main_env.clone do |env|
57
- # Store object files from sources under "src" in "build/debug"
58
- env.build_dir("src", "build/debug")
59
- env["CFLAGS"] -= ["-O3"]
60
- env["CFLAGS"] += ["-g", "-O0"]
61
- env.Program("program-debug", Dir["src/**/*.cc"])
62
- end
63
- ```
64
-
65
- ### Example: Custom Builder
66
-
67
- Custom builders are implemented as classes which extend from `Rscons::Builder`.
68
- The builder must have a `run` method which is called to invoke the builder.
69
- The `run` method should return the name of the target built on success, and
70
- `false` on failure.
71
-
72
- ```ruby
73
- class GenerateFoo < Rscons::Builder
74
- def run(target, sources, cache, env, vars)
75
- cache.mkdir_p(File.dirname(target))
76
- File.open(target, "w") do |fh|
77
- fh.puts <<EOF
78
- #define GENERATED 42
79
- EOF
80
- end
81
- target
82
- end
83
- end
84
-
85
- Rscons::Environment.new do |env|
86
- env.add_builder(GenerateFoo.new)
87
- env.GenerateFoo("foo.h", [])
88
- env.Program("a.out", Dir["*.c"])
89
- end
90
- ```
91
-
92
- ### Example: Custom Builder That Only Regenerates When Necessary
93
-
94
- ```ruby
95
- class CmdBuilder < Rscons::Builder
96
- def run(target, sources, cache, env, vars)
97
- cmd = ["cmd", "-i", sources.first, "-o", target]
98
- unless cache.up_to_date?(target, cmd, sources, env)
99
- cache.mkdir_p(File.dirname(target))
100
- system(cmd)
101
- cache.register_build(target, cmd, sources, env)
102
- end
103
- target
104
- end
105
- end
106
-
107
- Rscons::Environment.new do |env|
108
- env.add_builder(CmdBuilder.new)
109
- env.CmdBuilder("foo.gen", "foo_gen.cfg")
110
- end
111
- ```
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
-
136
- ### Example: Custom Builder Using Builder#standard_build()
137
-
138
- The `standard_build` method from the `Rscons::Builder` base class can be used
139
- when the builder needs to execute a system command to produce the target file.
140
- The `standard_build` method will return the correct value so its return value
141
- can be used as the return value from the `run` method.
142
-
143
- ```ruby
144
- class CmdBuilder < Rscons::Builder
145
- def run(target, sources, cache, env, vars)
146
- cmd = ["cmd", "-i", sources.first, "-o", target]
147
- standard_build("CmdBld #{target}", target, cmd, sources, env, cache)
148
- end
149
- end
150
-
151
- Rscons::Environment.new do |env|
152
- env.add_builder(CmdBuilder.new)
153
- env.CmdBuilder("foo.gen", "foo_gen.cfg")
154
- end
155
- ```
156
-
157
- ### Example: Using different compilation flags for some sources
158
-
159
- ```ruby
160
- Rscons::Environment.new do |env|
161
- env["CFLAGS"] = ["-O3", "-Wall", "-DDEFINE"]
162
- env.add_build_hook do |build_op|
163
- if build_op[:target] =~ %r{build/third-party}
164
- build_op[:vars]["CFLAGS"] -= ["-Wall"]
165
- end
166
- end
167
- env.build_dir("src", "build")
168
- env.Program("program", Dir["**/*.cc"])
169
- end
170
- ```
171
-
172
- Each build hook block will be invoked for every build operation, so the block
173
- should test the target or sources if its action should only apply to some
174
- subset of build targets or source files.
175
-
176
- The `build_op` parameter to the build hook block is a Hash describing the
177
- build operation with the following keys:
178
- * `:builder` - `Builder` instance in use
179
- * `:env` - `Environment` calling the build hook; note that this may be
180
- different from the Environment that the build hook was added to in the case
181
- that the original Environment was cloned with build hooks!
182
- * `:target` - `String` name of the target file
183
- * `:sources` - `Array` of the source files
184
- * `:vars` - `Rscons::VarSet` containing the construction variables to use.
185
- The build hook can overwrite entries in `build_op[:vars]` to alter the
186
- construction variables in use for this specific build operation.
187
-
188
- ### Example: Creating a static library
189
-
190
- ```ruby
191
- Rscons::Environment.new do |env|
192
- env.Library("mylib.a", Dir["src/**/*.c"])
193
- end
194
- ```
195
-
196
- ### Example: Creating a C++ parser source from a Yacc/Bison input file
197
-
198
- ```ruby
199
- Rscons::Environment.new do |env|
200
- env.CFile("#{env.build_root}/parser.tab.cc", "parser.yy")
201
- end
202
- ```
203
-
204
- ## Details
205
-
206
- ### Builders
207
-
208
- Rscons ships with a number of builders:
209
-
210
- * CFile, which builds a C or C++ source file from a lex or yacc input file
211
- * Disassemble, which disassembles an object file to a disassembly listing
212
- * Library, which collects object files into a static library archive file
213
- * Object, which compiles source files to produce an object file
214
- * Preprocess, which invokes the C/C++ preprocessor on a source file
215
- * Program, which links object files to produce an executable
216
-
217
- If you want to create an Environment that does not contain any builders,
218
- you can use the `exclude_builders` key to the Environment constructor.
219
-
220
- #### CFile
221
-
222
- ```ruby
223
- env.CFile(target, source)
224
- # Example
225
- env.CFile("parser.c", "parser.y")
226
- ```
227
-
228
- The CFile builder will generate a C or C++ source file from a lex (.l, .ll)
229
- or yacc (.y, .yy) input file.
230
-
231
- #### Disassemble
232
-
233
- ```ruby
234
- env.Disassemble(target, source)
235
- # Example
236
- env.Disassemble("module.dis", "module.o")
237
- ```
238
-
239
- The Disassemble builder generates a disassembly listing using objdump from
240
- and object file.
241
-
242
- #### Library
243
-
244
- ```ruby
245
- env.Library(target, sources)
246
- # Example
247
- env.Library("lib.a", Dir["src/**/*.c"])
248
- ```
249
-
250
- The Library builder creates a static library archive from the given source
251
- files.
252
-
253
- #### Object
254
-
255
- ```ruby
256
- env.Object(target, sources)
257
- # Example
258
- env.Object("module.o", "module.c")
259
- ```
260
-
261
- The Object builder compiles the given sources to an object file.
262
-
263
- #### Preprocess
264
-
265
- ```ruby
266
- env.Preprocess(target, source)
267
- # Example
268
- env.Preprocess("module-preprocessed.cc", "module.cc")
269
- ```
270
-
271
- The Preprocess builder invokes either ${CC} or ${CXX} (depending on if the
272
- source contains an extension in ${CXXSUFFIX} or not) and writes the
273
- preprocessed output to the target file.
274
-
275
- #### Program
276
-
277
- ```ruby
278
- env.Program(target, sources)
279
- # Example
280
- env.Program("myprog", Dir["src/**/*.cc"])
281
- ```
282
-
283
- The Program builder compiles and links the given sources to an executable file.
284
- Object files or source files can be given as `sources`.
285
-
286
- ### Managing Environments
287
-
288
- An Rscons::Environment consists of:
289
-
290
- * a collection of construction variables
291
- * a collection of builders
292
- * a mapping of build directories from source directories
293
- * a default build root to apply if no build directories are matched
294
- * a collection of targets to build
295
- * a collection of build hooks
296
-
297
- When cloning an environment, by default the construction variables and builders
298
- are cloned, but the new environment does not inherit any of the targets, build
299
- hooks, build directories, or the build root from the source environment.
300
-
301
- The set of environment attributes that are cloned is controllable via the
302
- `:clone` option to the `#clone` method.
303
- For example, `env.clone(clone: :all)` will include construction variables,
304
- builders, build hooks, build directories, and the build root.
305
-
306
- The set of pending targets is never cloned.
307
-
308
- Cloned environments contain "deep copies" of construction variables.
309
- For example, in:
310
-
311
- ```ruby
312
- base_env = Rscons::Environment.new
313
- base_env["CPPPATH"] = ["one", "two"]
314
- cloned_env = base_env.clone
315
- cloned_env["CPPPATH"] << "three"
316
- ```
317
-
318
- `base_env["CPPPATH"]` will not include "three".
319
-
320
- ### Construction Variable Naming
321
-
322
- * uppercase strings - the default construction variables that Rscons uses
323
- * symbols, lowercase strings - reserved as user-defined construction variables
324
-
325
- ### API documentation
326
-
327
- Documentation for the complete Rscons API can be found at
328
- http://rubydoc.info/github/holtrop/rscons/frames.
329
-
330
- ## Release Notes
331
-
332
- ### v1.4.3
333
-
334
- - fix builders properly using construction variable overrides
335
- - expand nil construction variables to empty strings
336
-
337
- ### v1.4.2
338
-
339
- - add Environment#expand_path
340
- - expand construction variable references in builder targets and sources before invoking builder
341
-
342
- ### v1.4.1
343
-
344
- - fix invoking a builder with no sources while a build root defined
345
-
346
- ### v1.4.0
347
-
348
- - add CFile builder
349
- - add Disassemble builder
350
- - add Preprocess builder
351
- - pass the Environment object to build hooks in the :env key of the build_op parameter
352
- - expand target/source paths beginning with "^/" to be relative to the Environment's build root
353
- - many performance improvements, including:
354
- - use JSON instead of YAML for the cache to improve loading speed (Issue #7)
355
- - store a hash of the build command instead of the full command contents in the cache
356
- - implement copy-on-write semantics for construction variables when cloning Environments
357
- - only load the cache once instead of on each Environment#process
358
- - only write the cache when something has changed
359
- - fix Cache#mkdir_p to handle relative paths (Issue #5)
360
- - flush the cache to disk if a builder raises an exception (Issue #4)
361
-
362
- ### v1.3.0
363
-
364
- - change Environment#execute() options parameter to accept the following options keys:
365
- - :env to pass an environment Hash to Kernel#system
366
- - :options to pass an options Hash to Kernel#system
367
-
368
- ### v1.2.0
369
-
370
- - add :clone option to Environment#clone to control exactly which Environment attributes are cloned
371
- - allow nil to be passed in to Environment#build_root=
372
-
373
- ### v1.1.0
374
-
375
- - Change Cache#up_to_date?() and #register_build() to accept a single target
376
- file or an array of target file names
377
-
378
- ## Contributing
379
-
380
- 1. Fork it
381
- 2. Create your feature branch (`git checkout -b my-new-feature`)
382
- 3. Commit your changes (`git commit -am 'Add some feature'`)
383
- 4. Push to the branch (`git push origin my-new-feature`)
384
- 5. Create new Pull Request
@@ -1,26 +0,0 @@
1
- require "bundler"
2
- begin
3
- Bundler.setup(:default, :development)
4
- rescue Bundler::BundlerError => e
5
- raise LoadError.new("Unable to setup Bundler; you might need to `bundle install`: #{e.message}")
6
- end
7
-
8
- require "bundler/gem_tasks"
9
- require "rspec/core/rake_task"
10
- require "yard"
11
-
12
- RSpec::Core::RakeTask.new(:spec)
13
-
14
- YARD::Rake::YardocTask.new do |yard|
15
- yard.files = ['lib/**/*.rb']
16
- end
17
-
18
- task :default => :spec
19
-
20
- task :clean do
21
- FileUtils.rm_rf(["build_test_run", "doc", "coverage"])
22
- end
23
-
24
- task :clobber => :clean do
25
- FileUtils.rm_rf(["pkg"])
26
- end
@@ -1,6 +0,0 @@
1
- #include "two.h"
2
-
3
- int main(int argc, char *argv[])
4
- {
5
- two();
6
- }
@@ -1,7 +0,0 @@
1
- #include <stdio.h>
2
- #include "two.h"
3
-
4
- void two(void)
5
- {
6
- printf("Hello from two()\n");
7
- }
@@ -1,6 +0,0 @@
1
- #ifndef TWO_H
2
- #define TWO_H
3
-
4
- void two(void);
5
-
6
- #endif
@@ -1,6 +0,0 @@
1
- #include <stdio.h>
2
-
3
- int main(int argc, char *argv[])
4
- {
5
- printf("Hello, %s\n", STRING);
6
- }