rscons 0.3.1 → 1.0.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 ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ OTdiYzZmYzkzY2U5MTI1MGMwZjlmNDFmZGFkY2NmY2Y5NDQxZTllOQ==
5
+ data.tar.gz: !binary |-
6
+ MTVlMzQxYTUwMzY2OWViZGI1ZDAwYzQ4OTgyMjYyY2FjYmU5MzdhYg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ NTNhNGM4MzRhZDcwODdlM2Q0NmQ2Y2UzOWQ2ZDk5ZmY5M2IwMGY5NzBmMzdh
10
+ YTYxYTA0NTgzMzk3NzA4MDMzN2U5NWQ0ZjEyMmVkZWE5ZWRlZjNiZGNmZTQ4
11
+ NTgwY2QxYTFmZmY3NzE2MmU1NWJiZmQyMjg0OGUxMWY0MWZlMDI=
12
+ data.tar.gz: !binary |-
13
+ MzJjYzUwNmRjNDQyMGUxNjM3OTIzMzVlNWFlZDllNmI3YWUzYWIwMWI4MTc5
14
+ OWQ0NmExNjk3NWZmN2NhNDExMDgxZjA2NjZmZGYzMzZmZTRlZTRmYWUzMGIz
15
+ ZjA2YjM3NTBlYjY2MzgyNTczOTBiYTA0Y2UzYWYyMDc3ODNlMzc=
data/README.md CHANGED
@@ -27,7 +27,7 @@ called from your Rakefile.
27
27
  ### Example: Building a C Program
28
28
 
29
29
  ```ruby
30
- RScons::Environment.new do |env|
30
+ Rscons::Environment.new do |env|
31
31
  env["CFLAGS"] << "-Wall"
32
32
  env.Program("program", Dir["**/*.c"])
33
33
  end
@@ -36,7 +36,7 @@ end
36
36
  ### Example: Building a D Program
37
37
 
38
38
  ```ruby
39
- RScons::Environment.new do |env|
39
+ Rscons::Environment.new do |env|
40
40
  env["DFLAGS"] << "-Wall"
41
41
  env.Program("program", Dir["**/*.d"])
42
42
  end
@@ -45,7 +45,7 @@ end
45
45
  ### Example: Cloning an Environment
46
46
 
47
47
  ```ruby
48
- main_env = RScons::Environment.new do |env|
48
+ main_env = Rscons::Environment.new do |env|
49
49
  # Store object files from sources under "src" in "build/main"
50
50
  env.build_dir("src", "build/main")
51
51
  env["CFLAGS"] = ["-DSOME_DEFINE", "-O3"]
@@ -64,6 +64,11 @@ end
64
64
 
65
65
  ### Example: Custom Builder
66
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
+
67
72
  ```ruby
68
73
  class GenerateFoo < Rscons::Builder
69
74
  def run(target, sources, cache, env, vars)
@@ -73,10 +78,12 @@ class GenerateFoo < Rscons::Builder
73
78
  #define GENERATED 42
74
79
  EOF
75
80
  end
81
+ target
76
82
  end
77
83
  end
78
84
 
79
85
  Rscons::Environment.new do |env|
86
+ env.add_builder(GenerateFoo.new)
80
87
  env.GenerateFoo("foo.h", [])
81
88
  env.Program("a.out", Dir["*.c"])
82
89
  end
@@ -93,16 +100,23 @@ class CmdBuilder < Rscons::Builder
93
100
  system(cmd)
94
101
  cache.register_build(target, cmd, sources, env)
95
102
  end
103
+ target
96
104
  end
97
105
  end
98
106
 
99
107
  Rscons::Environment.new do |env|
108
+ env.add_builder(CmdBuilder.new)
100
109
  env.CmdBuilder("foo.gen", "foo_gen.cfg")
101
110
  end
102
111
  ```
103
112
 
104
113
  ### Example: Custom Builder Using Builder#standard_build()
105
114
 
115
+ The `standard_build` method from the `Rscons::Builder` base class can be used
116
+ when the builder needs to execute a system command to produce the target file.
117
+ The `standard_build` method will return the correct value so its return value
118
+ can be used as the return value from the `run` method.
119
+
106
120
  ```ruby
107
121
  class CmdBuilder < Rscons::Builder
108
122
  def run(target, sources, cache, env, vars)
@@ -112,6 +126,7 @@ class CmdBuilder < Rscons::Builder
112
126
  end
113
127
 
114
128
  Rscons::Environment.new do |env|
129
+ env.add_builder(CmdBuilder.new)
115
130
  env.CmdBuilder("foo.gen", "foo_gen.cfg")
116
131
  end
117
132
  ```
@@ -131,6 +146,19 @@ Rscons::Environment.new do |env|
131
146
  end
132
147
  ```
133
148
 
149
+ Each build hook block will be invoked for every build operation, so the block
150
+ should test the target or sources if its action should only apply to some
151
+ subset of build targets or source files.
152
+
153
+ The `build_op` parameter to the build hook block is a Hash describing the
154
+ build operation with the following keys:
155
+ * `:builder` - `Builder` instance in use
156
+ * `:target` - `String` name of the target file
157
+ * `:sources` - `Array` of the source files
158
+ * `:vars` - `Rscons::VarSet` containing the construction variables to use
159
+ The build hook can overwrite entries in `build_op[:vars]` to alter the
160
+ construction variables in use for this specific build operation.
161
+
134
162
  ### Example: Creating a static library
135
163
 
136
164
  ```ruby
@@ -149,8 +177,8 @@ Rscons ships with a number of default builders:
149
177
  * Object, which compiles source files to produce an object file
150
178
  * Program, which links object files to produce an executable
151
179
 
152
- If you want to create an Environment that does not contain any (or select)
153
- builders, you can use the `exclude_builders` key to the Environment constructor.
180
+ If you want to create an Environment that does not contain any builders,
181
+ you can use the `exclude_builders` key to the Environment constructor.
154
182
 
155
183
  ### Managing Environments
156
184
 
@@ -158,7 +186,8 @@ An Rscons::Environment consists of:
158
186
 
159
187
  * a collection of construction variables
160
188
  * a collection of builders
161
- * a mapping of build directories
189
+ * a mapping of build directories from source directories
190
+ * a default build root to apply if no build directories are matched
162
191
  * a collection of targets to build
163
192
  * a collection of build hooks
164
193
 
@@ -178,12 +207,16 @@ cloned_env["CPPPATH"] << "three"
178
207
 
179
208
  `base_env["CPPPATH"]` will not include "three".
180
209
 
181
- ### Construction Variables
210
+ ### Construction Variable Naming
211
+
212
+ * uppercase strings - the default construction variables that Rscons uses
213
+ * lowercase symbols - Rscons options
214
+ * lowercase strings - reserved as user-defined construction variables
215
+
216
+ ### API documentation
182
217
 
183
- The default construction variables that Rscons uses are named using uppercase
184
- strings.
185
- Rscons options are lowercase symbols.
186
- Lowercase strings are reserved as user-defined construction variables.
218
+ Documentation for the complete Rscons API can be found at
219
+ http://rubydoc.info/github/holtrop/rscons/frames.
187
220
 
188
221
  ## Contributing
189
222
 
data/lib/rscons.rb CHANGED
@@ -1,15 +1,13 @@
1
- require "rscons/builder"
2
- require "rscons/cache"
3
- require "rscons/environment"
4
- require "rscons/varset"
5
- require "rscons/version"
6
-
7
- require "rscons/monkey/string"
1
+ require_relative "rscons/builder"
2
+ require_relative "rscons/cache"
3
+ require_relative "rscons/environment"
4
+ require_relative "rscons/varset"
5
+ require_relative "rscons/version"
8
6
 
9
7
  # default builders
10
- require "rscons/builders/library"
11
- require "rscons/builders/object"
12
- require "rscons/builders/program"
8
+ require_relative "rscons/builders/library"
9
+ require_relative "rscons/builders/object"
10
+ require_relative "rscons/builders/program"
13
11
 
14
12
  # Namespace module for rscons classes
15
13
  module Rscons
@@ -37,4 +35,17 @@ module Rscons
37
35
  end
38
36
  Cache.clear
39
37
  end
38
+
39
+ # Return whether the given path is an absolute filesystem path or not
40
+ # @param path [String] the path to examine
41
+ def self.absolute_path?(path)
42
+ path =~ %r{^(/|\w:[\\/])}
43
+ end
44
+
45
+ # Return a new path by changing the suffix in path to suffix.
46
+ # @param path [String] the path to alter
47
+ # @param suffix [String] the new filename suffix
48
+ def self.set_suffix(path, suffix)
49
+ path.sub(/\.[^.]*$/, suffix)
50
+ end
40
51
  end
@@ -46,8 +46,8 @@ module Rscons
46
46
  end
47
47
 
48
48
  def produces?(target, source, env)
49
- target.has_suffix?(env['OBJSUFFIX']) and KNOWN_SUFFIXES.find do |compiler, suffix_var|
50
- source.has_suffix?(env[suffix_var])
49
+ target.end_with?(*env['OBJSUFFIX']) and KNOWN_SUFFIXES.find do |compiler, suffix_var|
50
+ source.end_with?(*env[suffix_var])
51
51
  end
52
52
  end
53
53
 
@@ -55,10 +55,10 @@ module Rscons
55
55
  vars = vars.merge({
56
56
  '_TARGET' => target,
57
57
  '_SOURCES' => sources,
58
- '_DEPFILE' => target.set_suffix('.mf'),
58
+ '_DEPFILE' => Rscons.set_suffix(target, '.mf'),
59
59
  })
60
60
  com_prefix = KNOWN_SUFFIXES.find do |compiler, suffix_var|
61
- sources.first.has_suffix?(env[suffix_var])
61
+ sources.first.end_with?(*env[suffix_var])
62
62
  end.tap do |v|
63
63
  v.nil? and raise "Error: unknown input file type: #{sources.first.inspect}"
64
64
  end.first
@@ -21,9 +21,9 @@ module Rscons
21
21
  return false unless objects
22
22
  ld = if env["LD"]
23
23
  env["LD"]
24
- elsif sources.find {|s| s.has_suffix?(env["DSUFFIX"])}
24
+ elsif sources.find {|s| s.end_with?(*env["DSUFFIX"])}
25
25
  env["DC"]
26
- elsif sources.find {|s| s.has_suffix?(env["CXXSUFFIX"])}
26
+ elsif sources.find {|s| s.end_with?(*env["CXXSUFFIX"])}
27
27
  env["CXX"]
28
28
  else
29
29
  env["CC"]
@@ -102,7 +102,7 @@ module Rscons
102
102
  # Return the file name to be built from source_fname with suffix suffix.
103
103
  # This method takes into account the Environment's build directories.
104
104
  def get_build_fname(source_fname, suffix)
105
- build_fname = source_fname.set_suffix(suffix).gsub('\\', '/')
105
+ build_fname = Rscons.set_suffix(source_fname, suffix).gsub('\\', '/')
106
106
  found_match = @build_dirs.find do |src_dir, obj_dir|
107
107
  if src_dir.is_a?(Regexp)
108
108
  build_fname.sub!(src_dir, obj_dir)
@@ -111,7 +111,7 @@ module Rscons
111
111
  end
112
112
  end
113
113
  if @build_root and not found_match
114
- unless source_fname.absolute_path? or build_fname.start_with?("#{@build_root}/")
114
+ unless Rscons.absolute_path?(source_fname) or build_fname.start_with?("#{@build_root}/")
115
115
  build_fname = "#{@build_root}/#{build_fname}"
116
116
  end
117
117
  end
@@ -254,7 +254,7 @@ module Rscons
254
254
  # Return a list of the converted file names.
255
255
  def build_sources(sources, suffixes, cache, vars)
256
256
  sources.map do |source|
257
- if source.has_suffix?(suffixes)
257
+ if source.end_with?(*suffixes)
258
258
  source
259
259
  else
260
260
  converted = nil
@@ -1,4 +1,4 @@
1
1
  module Rscons
2
2
  # gem version
3
- VERSION = "0.3.1"
3
+ VERSION = "1.0.0"
4
4
  end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rscons
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
5
- prerelease:
4
+ version: 1.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Josh Holtrop
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-01-23 00:00:00.000000000 Z
11
+ date: 2014-02-14 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rspec-core
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ! '>='
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rspec-mocks
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ! '>='
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ! '>='
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec-expectations
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ! '>='
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ! '>='
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rspec
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ! '>='
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ! '>='
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rake
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ! '>='
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ! '>='
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: simplecov
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ! '>='
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ! '>='
108
95
  - !ruby/object:Gem::Version
@@ -110,7 +97,6 @@ dependencies:
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: json
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
101
  - - ! '>='
116
102
  - !ruby/object:Gem::Version
@@ -118,7 +104,6 @@ dependencies:
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
108
  - - ! '>='
124
109
  - !ruby/object:Gem::Version
@@ -126,7 +111,6 @@ dependencies:
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: rdoc
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
115
  - - ! '>='
132
116
  - !ruby/object:Gem::Version
@@ -134,7 +118,6 @@ dependencies:
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
122
  - - ! '>='
140
123
  - !ruby/object:Gem::Version
@@ -142,7 +125,6 @@ dependencies:
142
125
  - !ruby/object:Gem::Dependency
143
126
  name: yard
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
129
  - - ! '>='
148
130
  - !ruby/object:Gem::Version
@@ -150,7 +132,6 @@ dependencies:
150
132
  type: :development
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
136
  - - ! '>='
156
137
  - !ruby/object:Gem::Version
@@ -190,7 +171,6 @@ files:
190
171
  - lib/rscons/builders/program.rb
191
172
  - lib/rscons/cache.rb
192
173
  - lib/rscons/environment.rb
193
- - lib/rscons/monkey/string.rb
194
174
  - lib/rscons/varset.rb
195
175
  - lib/rscons/version.rb
196
176
  - rscons.gemspec
@@ -203,33 +183,26 @@ files:
203
183
  homepage: https://github.com/holtrop/rscons
204
184
  licenses:
205
185
  - MIT
186
+ metadata: {}
206
187
  post_install_message:
207
188
  rdoc_options: []
208
189
  require_paths:
209
190
  - lib
210
191
  required_ruby_version: !ruby/object:Gem::Requirement
211
- none: false
212
192
  requirements:
213
193
  - - ! '>='
214
194
  - !ruby/object:Gem::Version
215
195
  version: '0'
216
- segments:
217
- - 0
218
- hash: -725097361
219
196
  required_rubygems_version: !ruby/object:Gem::Requirement
220
- none: false
221
197
  requirements:
222
198
  - - ! '>='
223
199
  - !ruby/object:Gem::Version
224
200
  version: '0'
225
- segments:
226
- - 0
227
- hash: -725097361
228
201
  requirements: []
229
202
  rubyforge_project:
230
- rubygems_version: 1.8.23
203
+ rubygems_version: 2.2.1
231
204
  signing_key:
232
- specification_version: 3
205
+ specification_version: 4
233
206
  summary: Software construction library inspired by SCons and implemented in Ruby
234
207
  test_files:
235
208
  - spec/build_tests_spec.rb
@@ -1,25 +0,0 @@
1
- # Standard Ruby String class.
2
- class String
3
- # Check if the given string ends with any of the supplied suffixes
4
- # @param suffix [String, Array] The suffix to look for.
5
- # @return a true value if the string ends with one of the suffixes given.
6
- def has_suffix?(suffix)
7
- if suffix
8
- suffix = [suffix] if suffix.is_a?(String)
9
- suffix = suffix.flatten
10
- suffix.find {|s| self.end_with?(s)}
11
- end
12
- end
13
-
14
- # Return a new string with the suffix (dot character and extension) changed
15
- # to the given suffix.
16
- # @param suffix [String] The new suffix.
17
- def set_suffix(suffix = '')
18
- sub(/\.[^.]*$/, suffix)
19
- end
20
-
21
- # Return whether the string represents an absolute filesystem path
22
- def absolute_path?
23
- self =~ %r{^(/|\w:[\\/])}
24
- end
25
- end