add CFile builder to create C/C++ sources from lex/yacc input files

This commit is contained in:
josh committed 2014-03-18 21:57:53 -04:00
1 parent 831b9bf2c7
commit 533ee9c16c
3 files changed
+65

No files matched your search

+2
View File
@@ -5,6 +5,7 @@ require_relative "rscons/varset"
require_relative "rscons/version"
# default builders
require_relative "rscons/builders/cfile"
require_relative "rscons/builders/library"
require_relative "rscons/builders/object"
require_relative "rscons/builders/program"
@@ -12,6 +13,7 @@ require_relative "rscons/builders/program"
# Namespace module for rscons classes
module Rscons
DEFAULT_BUILDERS = [
:CFile,
:Library,
:Object,
:Program,
+40
View File
@@ -0,0 +1,40 @@
module Rscons
module Builders
# Build a C or C++ source file given a lex (.l, .ll) or yacc (.y, .yy)
# input file.
#
# Examples::
# env.CFile("parser.tab.cc", "parser.yy")
# env.CFile("lex.yy.cc", "parser.ll")
class CFile < Builder
def default_variables(env)
{
"YACC" => "bison",
"YACC_FLAGS" => ["-d"],
"YACC_CMD" => ["${YACC}", "${YACC_FLAGS}", "-o", "${_TARGET}", "${_SOURCES}"],
"LEX" => "flex",
"LEX_FLAGS" => [],
"LEX_CMD" => ["${LEX}", "${LEX_FLAGS}", "-o", "${_TARGET}", "${_SOURCES}"],
}
end
def run(target, sources, cache, env, vars)
vars = vars.merge({
"_TARGET" => target,
"_SOURCES" => sources,
})
cmd =
case
when sources.first.end_with?(".l", ".ll")
"LEX"
when sources.first.end_with?(".y", ".yy")
"YACC"
else
raise "Unknown source file #{sources.first.inspect} for CFile builder"
end
command = env.build_command(env["#{cmd}_CMD"], vars)
standard_build("#{cmd} #{target}", target, command, sources, env, cache)
end
end
end
end