rscons 1.9.3 → 1.10.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.
@@ -2,6 +2,7 @@ module Rscons
2
2
  module Builders
3
3
  # A default Rscons builder that produces a static library archive.
4
4
  class Library < Builder
5
+
5
6
  # Return default construction variables for the builder.
6
7
  #
7
8
  # @param env [Environment] The Environment using the builder.
@@ -16,28 +17,48 @@ module Rscons
16
17
  }
17
18
  end
18
19
 
20
+ # Set up a build operation using this builder.
21
+ #
22
+ # @param options [Hash] Builder setup options.
23
+ #
24
+ # @return [Object]
25
+ # Any object that the builder author wishes to be saved and passed back
26
+ # in to the {#run} method.
27
+ def setup(options)
28
+ target, sources, env, vars = options.values_at(:target, :sources, :env, :vars)
29
+ suffixes = env.expand_varref(["${OBJSUFFIX}", "${LIBSUFFIX}"], vars)
30
+ # Register builders to build each source to an object file or library.
31
+ env.register_builds(target, sources, suffixes, vars)
32
+ end
33
+
19
34
  # Run the builder to produce a build target.
20
35
  #
21
- # @param target [String] Target file name.
22
- # @param sources [Array<String>] Source file name(s).
23
- # @param cache [Cache] The Cache object.
24
- # @param env [Environment] The Environment executing the builder.
25
- # @param vars [Hash,VarSet] Extra construction variables.
36
+ # @param options [Hash] Builder run options.
26
37
  #
27
38
  # @return [String,false]
28
39
  # Name of the target file on success or false on failure.
29
- def run(target, sources, cache, env, vars)
30
- # build sources to linkable objects
31
- objects = env.build_sources(sources, env.expand_varref(["${OBJSUFFIX}", "${LIBSUFFIX}"], vars).flatten, cache, vars)
32
- if objects
33
- vars = vars.merge({
34
- '_TARGET' => target,
35
- '_SOURCES' => objects,
36
- })
37
- command = env.build_command("${ARCMD}", vars)
38
- standard_build("AR #{target}", target, command, objects, env, cache)
39
- end
40
+ def run(options)
41
+ target, sources, cache, env, vars, objects = options.values_at(:target, :sources, :cache, :env, :vars, :setup_info)
42
+ vars = vars.merge({
43
+ '_TARGET' => target,
44
+ '_SOURCES' => objects,
45
+ })
46
+ options[:sources] = objects
47
+ command = env.build_command("${ARCMD}", vars)
48
+ standard_threaded_build("AR #{target}", target, command, objects, env, cache)
40
49
  end
50
+
51
+ # Finalize a build.
52
+ #
53
+ # @param options [Hash]
54
+ # Finalize options.
55
+ #
56
+ # @return [String, nil]
57
+ # The target name on success or nil on failure.
58
+ def finalize(options)
59
+ standard_finalize(options)
60
+ end
61
+
41
62
  end
42
63
  end
43
64
  end
@@ -3,6 +3,7 @@ module Rscons
3
3
  # A default Rscons builder which knows how to produce an object file from
4
4
  # various types of source files.
5
5
  class Object < Builder
6
+
6
7
  # Mapping of known sources from which to build object files.
7
8
  KNOWN_SUFFIXES = {
8
9
  "AS" => "ASSUFFIX",
@@ -61,54 +62,66 @@ module Rscons
61
62
  # Return whether this builder object is capable of producing a given target
62
63
  # file name from a given source file name.
63
64
  #
64
- # @param target [String] The target file name.
65
- # @param source [String] The source file name.
66
- # @param env [Environment] The Environment.
65
+ # @param target [String]
66
+ # The target file name.
67
+ # @param source [String]
68
+ # The source file name.
69
+ # @param env [Environment]
70
+ # The Environment.
67
71
  #
68
72
  # @return [Boolean]
69
73
  # Whether this builder object is capable of producing a given target
70
74
  # file name from a given source file name.
71
75
  def produces?(target, source, env)
72
- target.end_with?(*env['OBJSUFFIX']) and KNOWN_SUFFIXES.find do |compiler, suffix_var|
73
- source.end_with?(*env[suffix_var])
74
- end
76
+ target.end_with?(*env['OBJSUFFIX']) and
77
+ KNOWN_SUFFIXES.find do |compiler, suffix_var|
78
+ source.end_with?(*env[suffix_var])
79
+ end
75
80
  end
76
81
 
77
82
  # Run the builder to produce a build target.
78
83
  #
79
- # @param target [String] Target file name.
80
- # @param sources [Array<String>] Source file name(s).
81
- # @param cache [Cache] The Cache object.
82
- # @param env [Environment] The Environment executing the builder.
83
- # @param vars [Hash,VarSet] Extra construction variables.
84
+ # @param options [Hash] Builder run options.
84
85
  #
85
- # @return [String,false]
86
- # Name of the target file on success or false on failure.
87
- def run(target, sources, cache, env, vars)
86
+ # @return [String, ThreadedCommand]
87
+ # Target file name if target is up to date or a {ThreadedCommand}
88
+ # to execute to build the target.
89
+ def run(options)
90
+ target, sources, cache, env, vars = options.values_at(:target, :sources, :cache, :env, :vars)
88
91
  vars = vars.merge({
89
92
  '_TARGET' => target,
90
93
  '_SOURCES' => sources,
91
94
  '_DEPFILE' => Rscons.set_suffix(target, env.expand_varref("${DEPFILESUFFIX}", vars)),
92
95
  })
93
96
  com_prefix = KNOWN_SUFFIXES.find do |compiler, suffix_var|
94
- sources.first.end_with?(*env.expand_varref("${#{suffix_var}}"))
97
+ sources.first.end_with?(*env.expand_varref("${#{suffix_var}}", vars))
95
98
  end.tap do |v|
96
99
  v.nil? and raise "Error: unknown input file type: #{sources.first.inspect}"
97
100
  end.first
98
101
  command = env.build_command("${#{com_prefix}CMD}", vars)
99
- unless cache.up_to_date?(target, command, sources, env)
100
- cache.mkdir_p(File.dirname(target))
101
- FileUtils.rm_f(target)
102
- return false unless env.execute("#{com_prefix} #{target}", command)
103
- deps = sources
102
+ # Store vars back into options so new keys are accessible in #finalize.
103
+ options[:vars] = vars
104
+ standard_threaded_build("#{com_prefix} #{target}", target, command, sources, env, cache)
105
+ end
106
+
107
+ # Finalize the build operation.
108
+ #
109
+ # @param options [Hash] Builder finalize options.
110
+ #
111
+ # @return [String, nil]
112
+ # Name of the target file on success or nil on failure.
113
+ def finalize(options)
114
+ if options[:command_status]
115
+ target, deps, cache, env, vars = options.values_at(:target, :sources, :cache, :env, :vars)
104
116
  if File.exists?(vars['_DEPFILE'])
105
117
  deps += Environment.parse_makefile_deps(vars['_DEPFILE'], target)
106
118
  FileUtils.rm_f(vars['_DEPFILE'])
107
119
  end
108
- cache.register_build(target, command, deps.uniq, env)
120
+ cache.register_build(target, options[:tc].command, deps.uniq, env)
121
+ target
109
122
  end
110
- target
111
123
  end
124
+
112
125
  end
113
126
  end
114
127
  end
@@ -20,15 +20,13 @@ module Rscons
20
20
 
21
21
  # Run the builder to produce a build target.
22
22
  #
23
- # @param target [String] Target file name.
24
- # @param sources [Array<String>] Source file name(s).
25
- # @param cache [Cache] The Cache object.
26
- # @param env [Environment] The Environment executing the builder.
27
- # @param vars [Hash,VarSet] Extra construction variables.
23
+ # @param options [Hash] Builder run options.
28
24
  #
29
- # @return [String,false]
30
- # Name of the target file on success or false on failure.
31
- def run(target, sources, cache, env, vars)
25
+ # @return [String, ThreadedCommand]
26
+ # Target file name if target is up to date or a {ThreadedCommand}
27
+ # to execute to build the target.
28
+ def run(options)
29
+ target, sources, cache, env, vars = options.values_at(:target, :sources, :cache, :env, :vars)
32
30
  if sources.find {|s| s.end_with?(*env.expand_varref("${CXXSUFFIX}", vars))}
33
31
  pp_cc = "${CXX}"
34
32
  depgen = "${CXXDEPGEN}"
@@ -42,17 +40,27 @@ module Rscons
42
40
  "_SOURCES" => sources,
43
41
  "_DEPFILE" => Rscons.set_suffix(target, env.expand_varref("${DEPFILESUFFIX}", vars)))
44
42
  command = env.build_command("${CPP_CMD}", vars)
45
- unless cache.up_to_date?(target, command, sources, env)
46
- cache.mkdir_p(File.dirname(target))
47
- return false unless env.execute("Preprocess #{target}", command)
48
- deps = sources
49
- if File.exists?(vars["_DEPFILE"])
50
- deps += Environment.parse_makefile_deps(vars["_DEPFILE"], nil)
51
- FileUtils.rm_f(vars["_DEPFILE"])
43
+ # Store vars back into options so new keys are accessible in #finalize.
44
+ options[:vars] = vars
45
+ standard_threaded_build("#{name} #{target}", target, command, sources, env, cache)
46
+ end
47
+
48
+ # Finalize the build operation.
49
+ #
50
+ # @param options [Hash] Builder finalize options.
51
+ #
52
+ # @return [String, nil]
53
+ # Name of the target file on success or nil on failure.
54
+ def finalize(options)
55
+ if options[:command_status]
56
+ target, deps, cache, env, vars = options.values_at(:target, :sources, :cache, :env, :vars)
57
+ if File.exists?(vars['_DEPFILE'])
58
+ deps += Environment.parse_makefile_deps(vars['_DEPFILE'], nil)
59
+ FileUtils.rm_f(vars['_DEPFILE'])
52
60
  end
53
- cache.register_build(target, command, deps.uniq, env)
61
+ cache.register_build(target, options[:tc].command, deps.uniq, env)
62
+ target
54
63
  end
55
- target
56
64
  end
57
65
 
58
66
  end
@@ -3,6 +3,7 @@ module Rscons
3
3
  # A default Rscons builder that knows how to link object files into an
4
4
  # executable program.
5
5
  class Program < Builder
6
+
6
7
  # Return default construction variables for the builder.
7
8
  #
8
9
  # @param env [Environment] The Environment using the builder.
@@ -38,27 +39,36 @@ module Rscons
38
39
  #
39
40
  # @return [BuildTarget]
40
41
  def create_build_target(options)
42
+ env, target, vars = options.values_at(:env, :target, :vars)
41
43
  my_options = options.dup
42
- unless my_options[:target] =~ /\./
43
- my_options[:target] += options[:env].expand_varref("${PROGSUFFIX}")
44
+ unless File.basename(target)["."]
45
+ my_options[:target] += env.expand_varref("${PROGSUFFIX}", vars)
44
46
  end
45
47
  super(my_options)
46
48
  end
47
49
 
50
+ # Set up a build operation using this builder.
51
+ #
52
+ # @param options [Hash] Builder setup options.
53
+ #
54
+ # @return [Object]
55
+ # Any object that the builder author wishes to be saved and passed back
56
+ # in to the {#run} method.
57
+ def setup(options)
58
+ target, sources, env, vars = options.values_at(:target, :sources, :env, :vars)
59
+ suffixes = env.expand_varref(["${OBJSUFFIX}", "${LIBSUFFIX}"], vars)
60
+ # Register builders to build each source to an object file or library.
61
+ env.register_builds(target, sources, suffixes, vars)
62
+ end
63
+
48
64
  # Run the builder to produce a build target.
49
65
  #
50
- # @param target [String] Target file name.
51
- # @param sources [Array<String>] Source file name(s).
52
- # @param cache [Cache] The Cache object.
53
- # @param env [Environment] The Environment executing the builder.
54
- # @param vars [Hash,VarSet] Extra construction variables.
66
+ # @param options [Hash] Builder run options.
55
67
  #
56
68
  # @return [String,false]
57
69
  # Name of the target file on success or false on failure.
58
- def run(target, sources, cache, env, vars)
59
- # build sources to linkable objects
60
- objects = env.build_sources(sources, env.expand_varref(["${OBJSUFFIX}", "${LIBSUFFIX}"], vars).flatten, cache, vars)
61
- return false unless objects
70
+ def run(options)
71
+ target, sources, cache, env, vars, objects = options.values_at(:target, :sources, :cache, :env, :vars, :setup_info)
62
72
  ld = env.expand_varref("${LD}", vars)
63
73
  ld = if ld != ""
64
74
  ld
@@ -74,9 +84,22 @@ module Rscons
74
84
  '_SOURCES' => objects,
75
85
  'LD' => ld,
76
86
  })
87
+ options[:sources] = objects
77
88
  command = env.build_command("${LDCMD}", vars)
78
- standard_build("LD #{target}", target, command, objects, env, cache)
89
+ standard_threaded_build("LD #{target}", target, command, objects, env, cache)
79
90
  end
91
+
92
+ # Finalize a build.
93
+ #
94
+ # @param options [Hash]
95
+ # Finalize options.
96
+ #
97
+ # @return [String, nil]
98
+ # The target name on success or nil on failure.
99
+ def finalize(options)
100
+ standard_finalize(options)
101
+ end
102
+
80
103
  end
81
104
  end
82
105
  end
@@ -0,0 +1,116 @@
1
+ module Rscons
2
+ module Builders
3
+ # A default Rscons builder that knows how to link object files into a
4
+ # shared library.
5
+ class SharedLibrary < Builder
6
+
7
+ # Return default construction variables for the builder.
8
+ #
9
+ # @param env [Environment] The Environment using the builder.
10
+ #
11
+ # @return [Hash] Default construction variables for the builder.
12
+ def default_variables(env)
13
+ {
14
+ 'SHLIBPREFIX' => (RUBY_PLATFORM =~ /mingw/ ? '' : 'lib'),
15
+ 'SHLIBSUFFIX' => (RUBY_PLATFORM =~ /mingw/ ? '.dll' : '.so'),
16
+ 'SHLDFLAGS' => ['${LDFLAGS}', '-shared'],
17
+ 'SHLD' => nil,
18
+ 'SHLIBDIRPREFIX' => '-L',
19
+ 'SHLIBLINKPREFIX' => '-l',
20
+ 'SHLDCMD' => ['${SHLD}', '-o', '${_TARGET}', '${SHLDFLAGS}', '${_SOURCES}', '${SHLIBDIRPREFIX}${LIBPATH}', '${SHLIBLINKPREFIX}${LIBS}']
21
+ }
22
+ end
23
+
24
+ # Return a set of build features that this builder provides.
25
+ #
26
+ # @return [Array<String>]
27
+ # Set of build features that this builder provides.
28
+ def features
29
+ %w[shared]
30
+ end
31
+
32
+ # Create a BuildTarget object for this build target.
33
+ #
34
+ # The build target filename is given a platform-dependent suffix if no
35
+ # other suffix is given.
36
+ #
37
+ # @param options [Hash]
38
+ # Options to create the BuildTarget with.
39
+ # @option options [Environment] :env
40
+ # The Environment.
41
+ # @option options [String] :target
42
+ # The user-supplied target name.
43
+ # @option options [Array<String>] :sources
44
+ # The user-supplied source file name(s).
45
+ #
46
+ # @return [BuildTarget]
47
+ def create_build_target(options)
48
+ env, target, vars = options.values_at(:env, :target, :vars)
49
+ my_options = options.dup
50
+ libprefix = env.expand_varref("${SHLIBPREFIX}", vars)
51
+ unless File.basename(target).start_with?(libprefix)
52
+ my_options[:target].sub!(%r{^(.*/)?([^/]+)$}, "\\1#{libprefix}\\2")
53
+ end
54
+ unless File.basename(target)["."]
55
+ my_options[:target] += env.expand_varref("${SHLIBSUFFIX}", vars)
56
+ end
57
+ super(my_options)
58
+ end
59
+
60
+ # Set up a build operation using this builder.
61
+ #
62
+ # @param options [Hash] Builder setup options.
63
+ #
64
+ # @return [Object]
65
+ # Any object that the builder author wishes to be saved and passed back
66
+ # in to the {#run} method.
67
+ def setup(options)
68
+ target, sources, env, vars = options.values_at(:target, :sources, :env, :vars)
69
+ suffixes = env.expand_varref(["${OBJSUFFIX}", "${LIBSUFFIX}"], vars)
70
+ # Register builders to build each source to an object file or library.
71
+ env.register_builds(target, sources, suffixes, vars,
72
+ features: %w[shared])
73
+ end
74
+
75
+ # Run the builder to produce a build target.
76
+ #
77
+ # @param options [Hash] Builder run options.
78
+ #
79
+ # @return [String,false]
80
+ # Name of the target file on success or false on failure.
81
+ def run(options)
82
+ target, sources, cache, env, vars, objects = options.values_at(:target, :sources, :cache, :env, :vars, :setup_info)
83
+ ld = env.expand_varref("${SHLD}", vars)
84
+ ld = if ld != ""
85
+ ld
86
+ elsif sources.find {|s| s.end_with?(*env.expand_varref("${DSUFFIX}", vars))}
87
+ "${SHDC}"
88
+ elsif sources.find {|s| s.end_with?(*env.expand_varref("${CXXSUFFIX}", vars))}
89
+ "${SHCXX}"
90
+ else
91
+ "${SHCC}"
92
+ end
93
+ vars = vars.merge({
94
+ '_TARGET' => target,
95
+ '_SOURCES' => objects,
96
+ 'SHLD' => ld,
97
+ })
98
+ options[:sources] = objects
99
+ command = env.build_command("${SHLDCMD}", vars)
100
+ standard_threaded_build("SHLD #{target}", target, command, objects, env, cache)
101
+ end
102
+
103
+ # Finalize a build.
104
+ #
105
+ # @param options [Hash]
106
+ # Finalize options.
107
+ #
108
+ # @return [String, nil]
109
+ # The target name on success or nil on failure.
110
+ def finalize(options)
111
+ standard_finalize(options)
112
+ end
113
+
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,113 @@
1
+ module Rscons
2
+ module Builders
3
+ # A default Rscons builder which knows how to produce an object file which
4
+ # is capable of being linked into a shared library from various types of
5
+ # source files.
6
+ class SharedObject < Builder
7
+
8
+ # Mapping of known sources from which to build object files.
9
+ KNOWN_SUFFIXES = {
10
+ "AS" => "ASSUFFIX",
11
+ "SHCC" => "CSUFFIX",
12
+ "SHCXX" => "CXXSUFFIX",
13
+ "SHDC" => "DSUFFIX",
14
+ }
15
+
16
+ # Return default construction variables for the builder.
17
+ #
18
+ # @param env [Environment] The Environment using the builder.
19
+ #
20
+ # @return [Hash] Default construction variables for the builder.
21
+ def default_variables(env)
22
+ pic_flags = (RUBY_PLATFORM =~ /mingw/ ? [] : ['-fPIC'])
23
+ {
24
+ 'SHCCFLAGS' => ['${CCFLAGS}'] + pic_flags,
25
+
26
+ 'SHCC' => '${CC}',
27
+ 'SHCFLAGS' => [],
28
+ 'SHCCCMD' => ['${SHCC}', '-c', '-o', '${_TARGET}', '${CCDEPGEN}', '${INCPREFIX}${CPPPATH}', '${CPPFLAGS}', '${SHCFLAGS}', '${SHCCFLAGS}', '${_SOURCES}'],
29
+
30
+ 'SHCXX' => '${CXX}',
31
+ 'SHCXXFLAGS' => [],
32
+ 'SHCXXCMD' => ['${SHCXX}', '-c', '-o', '${_TARGET}', '${CXXDEPGEN}', '${INCPREFIX}${CPPPATH}', '${CPPFLAGS}', '${SHCXXFLAGS}', '${SHCCFLAGS}', '${_SOURCES}'],
33
+
34
+ 'SHDC' => 'gdc',
35
+ 'SHDFLAGS' => ['${DFLAGS}'] + pic_flags,
36
+ 'SHDCCMD' => ['${SHDC}', '-c', '-o', '${_TARGET}', '${INCPREFIX}${D_IMPORT_PATH}', '${SHDFLAGS}', '${_SOURCES}'],
37
+ }
38
+ end
39
+
40
+ # Return a set of build features that this builder provides.
41
+ #
42
+ # @return [Array<String>]
43
+ # Set of build features that this builder provides.
44
+ def features
45
+ %w[shared]
46
+ end
47
+
48
+ # Return whether this builder object is capable of producing a given target
49
+ # file name from a given source file name.
50
+ #
51
+ # @param target [String]
52
+ # The target file name.
53
+ # @param source [String]
54
+ # The source file name.
55
+ # @param env [Environment]
56
+ # The Environment.
57
+ #
58
+ # @return [Boolean]
59
+ # Whether this builder object is capable of producing a given target
60
+ # file name from a given source file name.
61
+ def produces?(target, source, env)
62
+ target.end_with?(*env['OBJSUFFIX']) and
63
+ KNOWN_SUFFIXES.find do |compiler, suffix_var|
64
+ source.end_with?(*env[suffix_var])
65
+ end
66
+ end
67
+
68
+ # Run the builder to produce a build target.
69
+ #
70
+ # @param options [Hash] Builder run options.
71
+ #
72
+ # @return [String, ThreadedCommand]
73
+ # Target file name if target is up to date or a {ThreadedCommand}
74
+ # to execute to build the target.
75
+ def run(options)
76
+ target, sources, cache, env, vars = options.values_at(:target, :sources, :cache, :env, :vars)
77
+ vars = vars.merge({
78
+ '_TARGET' => target,
79
+ '_SOURCES' => sources,
80
+ '_DEPFILE' => Rscons.set_suffix(target, env.expand_varref("${DEPFILESUFFIX}", vars)),
81
+ })
82
+ com_prefix = KNOWN_SUFFIXES.find do |compiler, suffix_var|
83
+ sources.first.end_with?(*env.expand_varref("${#{suffix_var}}", vars))
84
+ end.tap do |v|
85
+ v.nil? and raise "Error: unknown input file type: #{sources.first.inspect}"
86
+ end.first
87
+ command = env.build_command("${#{com_prefix}CMD}", vars)
88
+ # Store vars back into options so new keys are accessible in #finalize.
89
+ options[:vars] = vars
90
+ standard_threaded_build("#{com_prefix} #{target}", target, command, sources, env, cache)
91
+ end
92
+
93
+ # Finalize the build operation.
94
+ #
95
+ # @param options [Hash] Builder finalize options.
96
+ #
97
+ # @return [String, nil]
98
+ # Name of the target file on success or nil on failure.
99
+ def finalize(options)
100
+ if options[:command_status]
101
+ target, deps, cache, env, vars = options.values_at(:target, :sources, :cache, :env, :vars)
102
+ if File.exists?(vars['_DEPFILE'])
103
+ deps += Environment.parse_makefile_deps(vars['_DEPFILE'], target)
104
+ FileUtils.rm_f(vars['_DEPFILE'])
105
+ end
106
+ cache.register_build(target, options[:tc].command, deps.uniq, env)
107
+ target
108
+ end
109
+ end
110
+
111
+ end
112
+ end
113
+ end