48 lines
1.4 KiB
Ruby

module Rscons
class Program < Builder
VARIABLE_DEFAULTS = {
'LD' => nil,
'OBJSUFFIX' => '.o',
'LIBSUFFIX' => '.a',
'LDFLAGS' => [],
'LIBPATHS' => [],
'LIBS' => [],
}
def run(env, target, sources)
sources = [sources] if sources.is_a?(String)
# convert sources to object file names
sources = sources.map do |source|
if source =~ /#{env['OBJSUFFIX']}$/ or source =~ /#{env['LIBSUFFIX']}$/
source
else
builder_class = env.builders.values.find { |klass| klass.produces?(env, env['OBJSUFFIX']) }
if builder_class
builder = builder_class.new
builder.run(env, env.stem(source) + env['OBJSUFFIX'], source)
else
raise "No builder found to convert input source #{source.inspect} to an object file."
end
end
end
unless Cache.open.up_to_date?(target, sources)
command = [
env['LD'] || env['CC'],
'-o', target,
*env['LDFLAGS'],
*sources,
*env['LIBPATHS'].map {|lp| "-L#{lp}"},
*env['LIBS'].map {|lib| "-l#{lib}"}
]
vars = {
'TARGET' => target,
'SOURCES' => sources,
}
env.execute("LINK #{target}", command, vars)
Cache.open.register_build(target, sources)
end
target
end
end
end