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