80 lines
2.7 KiB
Ruby
80 lines
2.7 KiB
Ruby
module Rscons
|
|
# A default RScons builder which knows how to produce an object file from
|
|
# various types of source files.
|
|
class Object < Builder
|
|
KNOWN_SUFFIXES = {
|
|
"AS" => "ASSUFFIX",
|
|
"CC" => "CSUFFIX",
|
|
"CXX" => "CXXSUFFIX",
|
|
"DC" => "DSUFFIX",
|
|
}
|
|
|
|
def default_variables(env)
|
|
{
|
|
'OBJSUFFIX' => '.o',
|
|
|
|
'AS' => '${CC}',
|
|
'ASFLAGS' => [],
|
|
'ASSUFFIX' => '.S',
|
|
'ASPPPATH' => '${CPPPATH}',
|
|
'ASPPFLAGS' => '${CPPFLAGS}',
|
|
'ASDEPGEN' => ['-MMD', '-MF', '${_DEPFILE}'],
|
|
'ASCMD' => ['${AS}', '-c', '-o', '${_TARGET}', '${ASDEPGEN}', '-I${ASPPPATH}', '${ASPPFLAGS}', '${ASFLAGS}', '${_SOURCES}'],
|
|
|
|
'CPPFLAGS' => [],
|
|
'CPPPATH' => [],
|
|
|
|
'CC' => 'gcc',
|
|
'CFLAGS' => [],
|
|
'CSUFFIX' => '.c',
|
|
'CCDEPGEN' => ['-MMD', '-MF', '${_DEPFILE}'],
|
|
'CCCMD' => ['${CC}', '-c', '-o', '${_TARGET}', '${CCDEPGEN}', '-I${CPPPATH}', '${CPPFLAGS}', '${CFLAGS}', '${_SOURCES}'],
|
|
|
|
'CXX' => 'g++',
|
|
'CXXFLAGS' => [],
|
|
'CXXSUFFIX' => '.cc',
|
|
'CXXDEPGEN' => ['-MMD', '-MF', '${_DEPFILE}'],
|
|
'CXXCMD' =>['${CXX}', '-c', '-o', '${_TARGET}', '${CXXDEPGEN}', '-I${CPPPATH}', '${CPPFLAGS}', '${CXXFLAGS}', '${_SOURCES}'],
|
|
|
|
'DC' => 'gdc',
|
|
'DFLAGS' => [],
|
|
'DSUFFIX' => '.d',
|
|
'D_IMPORT_PATH' => [],
|
|
'DCCMD' => ['${DC}', '-c', '-o', '${_TARGET}', '-I${D_IMPORT_PATH}', '${DFLAGS}', '${_SOURCES}'],
|
|
}
|
|
end
|
|
|
|
def produces?(target, source, env)
|
|
target.has_suffix?(env['OBJSUFFIX']) and KNOWN_SUFFIXES.find do |compiler, suffix_var|
|
|
source.has_suffix?(env[suffix_var])
|
|
end
|
|
end
|
|
|
|
def run(target, sources, user_deps, cache, env, vars)
|
|
vars = vars.merge({
|
|
'_TARGET' => target,
|
|
'_SOURCES' => sources,
|
|
'_DEPFILE' => target.set_suffix('.mf'),
|
|
})
|
|
com_prefix = KNOWN_SUFFIXES.find do |compiler, suffix_var|
|
|
sources.first.has_suffix?(env[suffix_var])
|
|
end.tap do |v|
|
|
v.nil? and raise "Error: unknown input file type: #{sources.first.inspect}"
|
|
end.first
|
|
command = env.build_command(env["#{com_prefix}CMD"], vars)
|
|
unless cache.up_to_date?(target, command, sources, user_deps)
|
|
cache.mkdir_p(File.dirname(target))
|
|
FileUtils.rm_f(target)
|
|
return false unless env.execute("#{com_prefix} #{target}", command)
|
|
deps = sources
|
|
if File.exists?(vars['_DEPFILE'])
|
|
deps += Environment.parse_makefile_deps(vars['_DEPFILE'], target)
|
|
FileUtils.rm_f(vars['_DEPFILE'])
|
|
end
|
|
cache.register_build(target, command, deps.uniq, user_deps)
|
|
end
|
|
target
|
|
end
|
|
end
|
|
end
|