Class: Rscons::Builders::Object
- Inherits:
-
Rscons::Builder
- Object
- Rscons::Builder
- Rscons::Builders::Object
- Defined in:
- lib/rscons/builders/object.rb
Overview
A default Rscons builder which knows how to produce an object file from various types of source files.
Constant Summary collapse
- KNOWN_SUFFIXES =
Mapping of known sources from which to build object files.
{ "AS" => "ASSUFFIX", "CC" => "CSUFFIX", "CXX" => "CXXSUFFIX", "DC" => "DSUFFIX", }
Instance Method Summary collapse
-
#default_variables(env) ⇒ Hash
Return default construction variables for the builder.
-
#finalize(options) ⇒ String?
Finalize the build operation.
-
#produces?(target, source, env) ⇒ Boolean
Return whether this builder object is capable of producing a given target file name from a given source file name.
-
#run(options) ⇒ String, ThreadedCommand
Run the builder to produce a build target.
Methods inherited from Rscons::Builder
#create_build_target, #features, #name, #setup, #standard_build, #standard_finalize, #standard_threaded_build
Instance Method Details
#default_variables(env) ⇒ Hash
Return default construction variables for the builder.
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/rscons/builders/object.rb', line 20 def default_variables(env) { 'OBJSUFFIX' => ['.o'], 'DEPFILESUFFIX' => '.mf', 'CPPDEFPREFIX' => '-D', 'INCPREFIX' => '-I', 'AS' => '${CC}', 'ASFLAGS' => [], 'ASSUFFIX' => ['.S'], 'ASPPPATH' => '${CPPPATH}', 'ASPPFLAGS' => '${CPPFLAGS}', 'ASDEPGEN' => ['-MMD', '-MF', '${_DEPFILE}'], 'ASCMD' => ['${AS}', '-c', '-o', '${_TARGET}', '${ASDEPGEN}', '${INCPREFIX}${ASPPPATH}', '${ASPPFLAGS}', '${ASFLAGS}', '${_SOURCES}'], 'CPPFLAGS' => ['${CPPDEFPREFIX}${CPPDEFINES}'], 'CPPDEFINES' => [], 'CPPPATH' => [], 'CCFLAGS' => [], 'CC' => 'gcc', 'CFLAGS' => [], 'CSUFFIX' => ['.c'], 'CCDEPGEN' => ['-MMD', '-MF', '${_DEPFILE}'], 'CCCMD' => ['${CC}', '-c', '-o', '${_TARGET}', '${CCDEPGEN}', '${INCPREFIX}${CPPPATH}', '${CPPFLAGS}', '${CFLAGS}', '${CCFLAGS}', '${_SOURCES}'], 'CXX' => 'g++', 'CXXFLAGS' => [], 'CXXSUFFIX' => ['.cc', '.cpp', '.cxx', '.C'], 'CXXDEPGEN' => ['-MMD', '-MF', '${_DEPFILE}'], 'CXXCMD' =>['${CXX}', '-c', '-o', '${_TARGET}', '${CXXDEPGEN}', '${INCPREFIX}${CPPPATH}', '${CPPFLAGS}', '${CXXFLAGS}', '${CCFLAGS}', '${_SOURCES}'], 'DC' => 'gdc', 'DFLAGS' => [], 'DSUFFIX' => ['.d'], 'DDEPGEN' => ['-MMD', '-MF', '${_DEPFILE}'], 'D_IMPORT_PATH' => [], 'DCCMD' => ['${DC}', '-c', '-o', '${_TARGET}', '${DDEPGEN}', '${INCPREFIX}${D_IMPORT_PATH}', '${DFLAGS}', '${_SOURCES}'], } end |
#finalize(options) ⇒ String?
Finalize the build operation.
114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/rscons/builders/object.rb', line 114 def finalize() if [:command_status] target, deps, cache, env, vars = .values_at(:target, :sources, :cache, :env, :vars) if File.exists?(vars['_DEPFILE']) deps += Environment.parse_makefile_deps(vars['_DEPFILE']) FileUtils.rm_f(vars['_DEPFILE']) end cache.register_build(target, [:tc].command, deps.uniq, env) target end end |
#produces?(target, source, env) ⇒ Boolean
Return whether this builder object is capable of producing a given target file name from a given source file name.
76 77 78 79 80 81 |
# File 'lib/rscons/builders/object.rb', line 76 def produces?(target, source, env) target.end_with?(*env['OBJSUFFIX']) and KNOWN_SUFFIXES.find do |compiler, suffix_var| source.end_with?(*env[suffix_var]) end end |
#run(options) ⇒ String, ThreadedCommand
Run the builder to produce a build target.
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/rscons/builders/object.rb', line 90 def run() target, sources, cache, env, vars = .values_at(:target, :sources, :cache, :env, :vars) vars = vars.merge({ '_TARGET' => target, '_SOURCES' => sources, '_DEPFILE' => Rscons.set_suffix(target, env.("${DEPFILESUFFIX}", vars)), }) com_prefix = KNOWN_SUFFIXES.find do |compiler, suffix_var| sources.first.end_with?(*env.("${#{suffix_var}}", vars)) end.tap do |v| v.nil? and raise "Error: unknown input file type: #{sources.first.inspect}" end.first command = env.build_command("${#{com_prefix}CMD}", vars) # Store vars back into options so new keys are accessible in #finalize. [:vars] = vars standard_threaded_build("#{com_prefix} #{target}", target, command, sources, env, cache) end |