rscons 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -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=