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 +15 -0
- data/README.md +44 -11
- data/lib/rscons.rb +21 -10
- data/lib/rscons/builders/object.rb +4 -4
- data/lib/rscons/builders/program.rb +2 -2
- data/lib/rscons/environment.rb +3 -3
- data/lib/rscons/version.rb +1 -1
- metadata +5 -32
- data/lib/rscons/monkey/string.rb +0 -25
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
|
-
|
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
|
-
|
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 =
|
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
|
153
|
-
|
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
|
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
|
-
|
184
|
-
|
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
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
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
|
-
|
11
|
-
|
12
|
-
|
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.
|
50
|
-
source.
|
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' =>
|
58
|
+
'_DEPFILE' => Rscons.set_suffix(target, '.mf'),
|
59
59
|
})
|
60
60
|
com_prefix = KNOWN_SUFFIXES.find do |compiler, suffix_var|
|
61
|
-
sources.first.
|
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.
|
24
|
+
elsif sources.find {|s| s.end_with?(*env["DSUFFIX"])}
|
25
25
|
env["DC"]
|
26
|
-
elsif sources.find {|s| s.
|
26
|
+
elsif sources.find {|s| s.end_with?(*env["CXXSUFFIX"])}
|
27
27
|
env["CXX"]
|
28
28
|
else
|
29
29
|
env["CC"]
|
data/lib/rscons/environment.rb
CHANGED
@@ -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 =
|
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
|
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.
|
257
|
+
if source.end_with?(*suffixes)
|
258
258
|
source
|
259
259
|
else
|
260
260
|
converted = nil
|
data/lib/rscons/version.rb
CHANGED
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.
|
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-
|
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:
|
203
|
+
rubygems_version: 2.2.1
|
231
204
|
signing_key:
|
232
|
-
specification_version:
|
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
|
data/lib/rscons/monkey/string.rb
DELETED
@@ -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
|