rscons 0.0.5 → 0.0.6

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.
@@ -1,5 +1,5 @@
1
1
  class MySource < Rscons::Builder
2
- def run(target, sources, cache, env)
2
+ def run(target, sources, cache, env, vars = {})
3
3
  File.open(target, 'w') do |fh|
4
4
  fh.puts <<EOF
5
5
  #define THE_VALUE 5678
@@ -0,0 +1,4 @@
1
+ Rscons::Environment.new(echo: :command) do |env|
2
+ env.Program('library', ['lib.a', 'three.c'])
3
+ env.Library("lib.a", ['one.c', 'two.c'], 'CPPFLAGS' => ['-Dmake_lib'])
4
+ end
@@ -0,0 +1,8 @@
1
+ #include <stdio.h>
2
+
3
+ #ifdef make_lib
4
+ int main(int argc, char *argv[])
5
+ {
6
+ printf("Library\n");
7
+ }
8
+ #endif
File without changes
File without changes
@@ -0,0 +1,4 @@
1
+ Rscons::Environment.new(echo: :command) do |env|
2
+ env.Object("one.o", "one.c", 'CPPFLAGS' => ['-DONE'])
3
+ env.Program('two_sources', ['one.o', 'two.c'])
4
+ end
@@ -0,0 +1,8 @@
1
+ #include <stdio.h>
2
+
3
+ #ifdef ONE
4
+ int main(int argc, char *argv[])
5
+ {
6
+ printf("This is a C program with two sources.\n");
7
+ }
8
+ #endif
@@ -0,0 +1,3 @@
1
+ #ifdef ONE
2
+ #error ONE should not be defined
3
+ #endif
@@ -8,12 +8,14 @@ require "rscons/monkey/module"
8
8
  require "rscons/monkey/string"
9
9
 
10
10
  # default builders
11
+ require "rscons/builders/library"
11
12
  require "rscons/builders/object"
12
13
  require "rscons/builders/program"
13
14
 
14
15
  # Namespace module for rscons classes
15
16
  module Rscons
16
17
  DEFAULT_BUILDERS = [
18
+ Library,
17
19
  Object,
18
20
  Program,
19
21
  ]
@@ -0,0 +1,33 @@
1
+ require 'fileutils'
2
+
3
+ module Rscons
4
+ # A default RScons builder that produces a static library archive.
5
+ class Library < Builder
6
+ def default_variables(env)
7
+ {
8
+ 'AR' => 'ar',
9
+ 'LIBSUFFIX' => '.a',
10
+ 'ARFLAGS' => [],
11
+ 'ARCOM' => ['$AR', 'rcs', '$ARFLAGS', '$TARGET', '$SOURCES']
12
+ }
13
+ end
14
+
15
+ def run(target, sources, cache, env, vars = {})
16
+ # build sources to linkable objects
17
+ objects = env.build_sources(sources, [env['OBJSUFFIX'], env['LIBSUFFIX']].flatten, cache, vars)
18
+ if objects
19
+ vars = vars.merge({
20
+ 'TARGET' => target,
21
+ 'SOURCES' => objects,
22
+ })
23
+ command = env.build_command(env['ARCOM'], vars)
24
+ unless cache.up_to_date?(target, command, objects)
25
+ FileUtils.rm_f(target)
26
+ return false unless env.execute("AR #{target}", command)
27
+ cache.register_build(target, command, objects)
28
+ end
29
+ target
30
+ end
31
+ end
32
+ end
33
+ end
@@ -38,12 +38,12 @@ module Rscons
38
38
  source.has_suffix?(env['CXXSUFFIX']))
39
39
  end
40
40
 
41
- def run(target, sources, cache, env)
42
- vars = {
41
+ def run(target, sources, cache, env, vars = {})
42
+ vars = vars.merge({
43
43
  'TARGET' => target,
44
44
  'SOURCES' => sources,
45
45
  'DEPFILE' => target.set_suffix('.mf'),
46
- }
46
+ })
47
47
  com_prefix = if sources.first.has_suffix?(env['ASSUFFIX'])
48
48
  'AS'
49
49
  elsif sources.first.has_suffix?(env['CSUFFIX'])
@@ -14,28 +14,19 @@ module Rscons
14
14
  }
15
15
  end
16
16
 
17
- def run(target, sources, cache, env)
18
- # convert sources to object file names
19
- objects = sources.map do |source|
20
- if source.has_suffix?([env['OBJSUFFIX'], env['LIBSUFFIX']])
21
- source
22
- else
23
- o_file = env.get_build_fname(source, env['OBJSUFFIX', :string])
24
- builder = env.builders.values.find { |b| b.produces?(o_file, source, env) }
25
- builder or raise "No builder found to convert input source #{source.inspect} to an object file."
26
- builder.run(o_file, [source], cache, env) or break
27
- end
28
- end
17
+ def run(target, sources, cache, env, vars = {})
18
+ # build sources to linkable objects
19
+ objects = env.build_sources(sources, [env['OBJSUFFIX'], env['LIBSUFFIX']].flatten, cache, vars)
29
20
  if objects
30
21
  use_cxx = sources.map do |s|
31
22
  s.has_suffix?(env['CXXSUFFIX'])
32
23
  end.any?
33
24
  ld_alt = use_cxx ? env['CXX'] : env['CC']
34
- vars = {
25
+ vars = vars.merge({
35
26
  'TARGET' => target,
36
27
  'SOURCES' => objects,
37
28
  'LD' => env['LD'] || ld_alt,
38
- }
29
+ })
39
30
  command = env.build_command(env['LDCOM'], vars)
40
31
  unless cache.up_to_date?(target, command, objects)
41
32
  return false unless env.execute("LD #{target}", command)
@@ -141,7 +141,7 @@ module Rscons
141
141
  @targets[target][:source],
142
142
  cache,
143
143
  self,
144
- *@targets[target][:args])
144
+ @targets[target][:vars] || {})
145
145
  else
146
146
  false
147
147
  end
@@ -193,11 +193,15 @@ module Rscons
193
193
  alias_method :orig_method_missing, :method_missing
194
194
  def method_missing(method, *args)
195
195
  if @builders.has_key?(method.to_s)
196
- target, source, *rest = args
196
+ target, source, vars, *rest = args
197
+ unless vars.nil? or vars.is_a?(Hash) or vars.is_a?(VarSet)
198
+ raise "Unexpected construction variable set: #{vars.inspect}"
199
+ end
197
200
  source = [source] unless source.is_a?(Array)
198
201
  @targets[target] = {
199
202
  builder: @builders[method.to_s],
200
203
  source: source,
204
+ vars: vars,
201
205
  args: rest,
202
206
  }
203
207
  else
@@ -228,5 +232,32 @@ module Rscons
228
232
  end
229
233
  deps
230
234
  end
235
+
236
+ # Build a list of source files into files containing one of the suffixes
237
+ # given by suffixes.
238
+ # This method is used internally by RScons builders.
239
+ # @param sources [Array] List of source files to build.
240
+ # @param suffixes [Array] List of suffixes to try to convert source files into.
241
+ # @param cache [Cache] The Cache.
242
+ # Return a list of the converted file names.
243
+ def build_sources(sources, suffixes, cache, vars = {})
244
+ sources.map do |source|
245
+ if source.has_suffix?(suffixes)
246
+ source
247
+ else
248
+ converted = nil
249
+ suffixes.each do |suffix|
250
+ converted_fname = get_build_fname(source, suffix)
251
+ builder = @builders.values.find { |b| b.produces?(converted_fname, source, self) }
252
+ if builder
253
+ converted = builder.run(converted_fname, [source], cache, self, vars)
254
+ return nil unless converted
255
+ break
256
+ end
257
+ end
258
+ converted or raise "Could not find a builder to handle #{source.inspect}."
259
+ end
260
+ end
261
+ end
231
262
  end
232
263
  end
@@ -8,7 +8,11 @@ module Rscons
8
8
  # Create a VarSet
9
9
  # @param vars [Hash] Optional initial variables.
10
10
  def initialize(vars = {})
11
- @vars = vars
11
+ if vars.is_a?(VarSet)
12
+ @vars = vars.clone.vars
13
+ else
14
+ @vars = vars
15
+ end
12
16
  end
13
17
 
14
18
  # Access the value of variable as a particular type
@@ -1,4 +1,4 @@
1
1
  module Rscons
2
2
  # gem version
3
- VERSION = "0.0.5"
3
+ VERSION = "0.0.6"
4
4
  end
@@ -143,4 +143,27 @@ describe Rscons do
143
143
  `./simple`.should == "This is a simple C++ program\n"
144
144
  end
145
145
 
146
+ it 'allows overriding construction variables for individual builder calls' do
147
+ lines = test_dir('two_sources')
148
+ lines.should == [
149
+ 'gcc -c -o one.o -MMD -MF one.mf -DONE one.c',
150
+ 'gcc -c -o two.o -MMD -MF two.mf two.c',
151
+ 'gcc -o two_sources one.o two.o',
152
+ ]
153
+ File.exists?('two_sources').should be_true
154
+ `./two_sources`.should == "This is a C program with two sources.\n"
155
+ end
156
+
157
+ it 'builds a static library archive' do
158
+ lines = test_dir('library')
159
+ lines.should == [
160
+ 'gcc -c -o one.o -MMD -MF one.mf -Dmake_lib one.c',
161
+ 'gcc -c -o two.o -MMD -MF two.mf -Dmake_lib two.c',
162
+ 'ar rcs lib.a one.o two.o',
163
+ 'gcc -c -o three.o -MMD -MF three.mf three.c',
164
+ 'gcc -o library lib.a three.o',
165
+ ]
166
+ File.exists?('library').should be_true
167
+ `ar t lib.a`.should == "one.o\ntwo.o\n"
168
+ end
146
169
  end
metadata CHANGED
@@ -1,18 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rscons
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Josh Holtrop
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-08-12 00:00:00.000000000 Z
12
+ date: 2013-09-13 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: rspec-core
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ! '>='
18
20
  - !ruby/object:Gem::Version
@@ -20,6 +22,7 @@ dependencies:
20
22
  type: :development
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - ! '>='
25
28
  - !ruby/object:Gem::Version
@@ -27,6 +30,7 @@ dependencies:
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: rspec-mocks
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
35
  - - ! '>='
32
36
  - !ruby/object:Gem::Version
@@ -34,6 +38,7 @@ dependencies:
34
38
  type: :development
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
43
  - - ! '>='
39
44
  - !ruby/object:Gem::Version
@@ -41,6 +46,7 @@ dependencies:
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: rspec-expectations
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
51
  - - ! '>='
46
52
  - !ruby/object:Gem::Version
@@ -48,6 +54,7 @@ dependencies:
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
59
  - - ! '>='
53
60
  - !ruby/object:Gem::Version
@@ -55,6 +62,7 @@ dependencies:
55
62
  - !ruby/object:Gem::Dependency
56
63
  name: rspec
57
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
58
66
  requirements:
59
67
  - - ! '>='
60
68
  - !ruby/object:Gem::Version
@@ -62,6 +70,7 @@ dependencies:
62
70
  type: :development
63
71
  prerelease: false
64
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
65
74
  requirements:
66
75
  - - ! '>='
67
76
  - !ruby/object:Gem::Version
@@ -69,6 +78,7 @@ dependencies:
69
78
  - !ruby/object:Gem::Dependency
70
79
  name: rake
71
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
72
82
  requirements:
73
83
  - - ! '>='
74
84
  - !ruby/object:Gem::Version
@@ -76,6 +86,7 @@ dependencies:
76
86
  type: :development
77
87
  prerelease: false
78
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
79
90
  requirements:
80
91
  - - ! '>='
81
92
  - !ruby/object:Gem::Version
@@ -83,6 +94,7 @@ dependencies:
83
94
  - !ruby/object:Gem::Dependency
84
95
  name: simplecov
85
96
  requirement: !ruby/object:Gem::Requirement
97
+ none: false
86
98
  requirements:
87
99
  - - ! '>='
88
100
  - !ruby/object:Gem::Version
@@ -90,6 +102,7 @@ dependencies:
90
102
  type: :development
91
103
  prerelease: false
92
104
  version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
93
106
  requirements:
94
107
  - - ! '>='
95
108
  - !ruby/object:Gem::Version
@@ -97,6 +110,7 @@ dependencies:
97
110
  - !ruby/object:Gem::Dependency
98
111
  name: json
99
112
  requirement: !ruby/object:Gem::Requirement
113
+ none: false
100
114
  requirements:
101
115
  - - ! '>='
102
116
  - !ruby/object:Gem::Version
@@ -104,6 +118,7 @@ dependencies:
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
107
122
  requirements:
108
123
  - - ! '>='
109
124
  - !ruby/object:Gem::Version
@@ -111,6 +126,7 @@ dependencies:
111
126
  - !ruby/object:Gem::Dependency
112
127
  name: rdoc
113
128
  requirement: !ruby/object:Gem::Requirement
129
+ none: false
114
130
  requirements:
115
131
  - - ! '>='
116
132
  - !ruby/object:Gem::Version
@@ -118,6 +134,7 @@ dependencies:
118
134
  type: :development
119
135
  prerelease: false
120
136
  version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
121
138
  requirements:
122
139
  - - ! '>='
123
140
  - !ruby/object:Gem::Version
@@ -125,6 +142,7 @@ dependencies:
125
142
  - !ruby/object:Gem::Dependency
126
143
  name: yard
127
144
  requirement: !ruby/object:Gem::Requirement
145
+ none: false
128
146
  requirements:
129
147
  - - ! '>='
130
148
  - !ruby/object:Gem::Version
@@ -132,6 +150,7 @@ dependencies:
132
150
  type: :development
133
151
  prerelease: false
134
152
  version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
135
154
  requirements:
136
155
  - - ! '>='
137
156
  - !ruby/object:Gem::Version
@@ -160,12 +179,20 @@ files:
160
179
  - build_tests/header/build.rb
161
180
  - build_tests/header/header.c
162
181
  - build_tests/header/header.h
182
+ - build_tests/library/build.rb
183
+ - build_tests/library/one.c
184
+ - build_tests/library/three.c
185
+ - build_tests/library/two.c
163
186
  - build_tests/simple/build.rb
164
187
  - build_tests/simple/simple.c
165
188
  - build_tests/simple_cc/build.rb
166
189
  - build_tests/simple_cc/simple.cc
190
+ - build_tests/two_sources/build.rb
191
+ - build_tests/two_sources/one.c
192
+ - build_tests/two_sources/two.c
167
193
  - lib/rscons.rb
168
194
  - lib/rscons/builder.rb
195
+ - lib/rscons/builders/library.rb
169
196
  - lib/rscons/builders/object.rb
170
197
  - lib/rscons/builders/program.rb
171
198
  - lib/rscons/cache.rb
@@ -181,26 +208,33 @@ files:
181
208
  homepage: https://github.com/holtrop/rscons
182
209
  licenses:
183
210
  - MIT
184
- metadata: {}
185
211
  post_install_message:
186
212
  rdoc_options: []
187
213
  require_paths:
188
214
  - lib
189
215
  required_ruby_version: !ruby/object:Gem::Requirement
216
+ none: false
190
217
  requirements:
191
218
  - - ! '>='
192
219
  - !ruby/object:Gem::Version
193
220
  version: '0'
221
+ segments:
222
+ - 0
223
+ hash: -4013238338906189018
194
224
  required_rubygems_version: !ruby/object:Gem::Requirement
225
+ none: false
195
226
  requirements:
196
227
  - - ! '>='
197
228
  - !ruby/object:Gem::Version
198
229
  version: '0'
230
+ segments:
231
+ - 0
232
+ hash: -4013238338906189018
199
233
  requirements: []
200
234
  rubyforge_project:
201
- rubygems_version: 2.0.3
235
+ rubygems_version: 1.8.23
202
236
  signing_key:
203
- specification_version: 4
237
+ specification_version: 3
204
238
  summary: Software construction library inspired by SCons and implemented in Ruby
205
239
  test_files:
206
240
  - spec/build_tests_spec.rb
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NTA3MjNjNjMxN2U3MmY3ZmIwOGIxYjY2MzQzMzQ5MmMyOTQ3YTMyMQ==
5
- data.tar.gz: !binary |-
6
- OTYxNGZmMGM2NWQ2MGZjNDM5YzI1OTMzNWQ4ZDkxOWY1MzFkNmVkOA==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- YmZiNjA2MjI0NGMyZWE0NjhmMmQ4NTZjOWM4ZWFiODdmNTRmNzFlMzEyMzM5
10
- MDgwODViOTk3NDc3NjFlODQxNDk5ZWNlMTM4NjcxODM2NjY5OWIyYzgwNzZk
11
- NGQxOTgzNTMzZjVmZjk0MDhiMTBkODY4OWU3ZGEyNDRmNDE0YWY=
12
- data.tar.gz: !binary |-
13
- MmU3ODEyODYxMWNiY2I4NDBiMzgyMTY2OTVmNzE3OGI3NjFkNTc5MjE5ZmVl
14
- YmU1Y2ZjMzNkZmI4OTg0MjM3YjcwNTY5OTFkYzg5NmNhOTFlZGVjODE2NDc2
15
- NzlkMTg0YTFiZmVjMzlhMTQwZmQ0MjcyOTNmOGRiMzhiMjg2OTE=