98 lines
3.2 KiB
Ruby

module Rscons
class Builder
# @return [String, nil]
# Preferred linker for this object file, or a construction variable
# reference thereto.
attr_reader :preferred_ld
end
module Builders
module Mixins
module Object
include Depfile
class << self
# Hook called by Ruby when this module is included by a class (klass).
def included(klass)
klass.__send__(:extend, ClassMethods)
end
end
# Object mixin class methods.
module ClassMethods
# @return [Array<Hash>]
# Parameters used to build.
def providers
@providers ||= []
end
# Register a set of parameters that can be used to build an Object.
#
# @param params [Hash]
# Build parameters.
# @option params [Array, String] :command
# Command or construction variable reference thereto.
# @option params [Array, String] :suffix
# Suffix(es) or construction variable reference thereto.
# @option params [String] :short_description
# Short description to be printed when the builder runs (default:
# "Compiling")
# @option params [String] :preferred_ld
# Preferred linker for this object file, or a construction variable
# reference thereto.
def register(params)
providers << params
end
end
# Construct a builder conforming to the Object interface.
def initialize(params)
super
build_params = self.class.providers.find do |build_params|
@sources.first.end_with?(*@env.expand_varref(build_params[:suffix], @vars))
end
unless build_params
raise "Unknown input file type: #{@sources.first.inspect}"
end
@command_template =
if @vars[:direct]
build_params[:direct_command]
else
build_params[:command]
end
@short_description = build_params[:short_description] || "Compiling"
@preferred_ld = build_params[:preferred_ld]
end
# Run the builder to produce a build target.
def run(params)
if @command
finalize_command_with_depfile
else
@vars["_TARGET"] = @target
@vars["_SOURCES"] = @sources
depfilesuffix = @env.expand_varref("${DEPFILESUFFIX}", vars)
@vars["_DEPFILE"] =
if @vars[:direct]
@env.get_build_fname(target, depfilesuffix, self.class)
else
Rscons.set_suffix(target, depfilesuffix)
end
@cache.mkdir_p(File.dirname(@vars["_DEPFILE"]))
command = @env.build_command(@command_template, @vars)
@env.produces(@target, @vars["_DEPFILE"])
if @vars[:direct]
message = "#{@short_description}/Linking #{Util.short_format_paths(@sources)} => #{@target}"
else
message = "#{@short_description} #{Util.short_format_paths(@sources)}"
end
standard_command(message, command)
end
end
end
end
end
end