2014-09-14 08:36:58 +02:00

143 lines
4.0 KiB
Lua

module(..., package.seeall)
-- Use "strict" when developing to flag accesses to nil global variables
-- This has very low perf impact (<0.1%), so always leave it on.
require "strict"
local os = require "os"
local platform = require "tundra.platform"
local util = require "tundra.util"
local depgraph = require "tundra.depgraph"
local unitgen = require "tundra.unitgen"
local buildfile = require "tundra.buildfile"
local native = require "tundra.native"
-- This trio is so useful we want them everywhere without imports.
function _G.printf(msg, ...)
local str = string.format(msg, ...)
print(str)
end
function _G.errorf(msg, ...)
local str = string.format(msg, ...)
error(str)
end
function _G.croak(msg, ...)
local str = string.format(msg, ...)
io.stderr:write(str, "\n")
os.exit(1)
end
-- Expose benchmarking function for those times everything sucks
--
-- Wrap a function so that it prints execution times.
--
-- Usage:
-- foo = bench("foo", foo) -- benchmark function foo
function _G.bench(name, fn)
return function (...)
local t1 = native.get_timer()
local result = { fn(...) }
local t2 = native.get_timer()
printf("%s: %ss", name, native.timerdiff(t1, t2))
return unpack(result)
end
end
local environment = require "tundra.environment"
local nodegen = require "tundra.nodegen"
local decl = require "tundra.decl"
local path = require "tundra.path"
local depgraph = require "tundra.depgraph"
local dagsave = require "tundra.dagsave"
_G.SEP = platform.host_platform() == "windows" and "\\" or "/"
_G.Options = {
FullPaths = 1
}
local function make_default_env(build_data, add_unfiltered_vars)
local default_env = environment.create()
default_env:set_many {
["OBJECTROOT"] = "t2-output",
["SEP"] = SEP,
}
local host_platform = platform.host_platform()
do
local mod_name = "tundra.host." .. host_platform
local mod = require(mod_name)
mod.apply_host(default_env)
end
-- Add any unfiltered entries from the build data's Env and ReplaceEnv to the
-- default environment. For config environments, this will be false, because we
-- want to wait until the config's tools have run before adding any user
-- customizations.
if add_unfiltered_vars then
if build_data.Env then
nodegen.append_filtered_env_vars(default_env, build_data.Env, nil, true)
end
if build_data.ReplaceEnv then
nodegen.replace_filtered_env_vars(default_env, build_data.ReplaceEnv, nil, true)
end
end
return default_env
end
function generate_dag_data(build_script_fn)
local build_data = buildfile.run(build_script_fn)
local env = make_default_env(build_data.BuildData, false)
local raw_nodes, node_bindings = unitgen.generate_dag(
build_data.BuildTuples,
build_data.BuildData,
build_data.Passes,
build_data.Configs,
env)
dagsave.save_dag_data(
node_bindings,
build_data.DefaultVariant,
build_data.DefaultSubVariant,
build_data.ContentDigestExtensions,
build_data.Options)
end
function generate_ide_files(build_script_fn, ide_script)
-- We are generating IDE integration files. Load the specified
-- integration module rather than DAG builders.
--
-- Also, default to using full paths for all commands to aid with locating
-- sources better.
Options.FullPaths = 1
local build_data = buildfile.run(build_script_fn)
local build_tuples = assert(build_data.BuildTuples)
local raw_data = assert(build_data.BuildData)
local passes = assert(build_data.Passes)
local env = make_default_env(raw_data, true)
if not ide_script:find('.', 1, true) then
ide_script = 'tundra.ide.' .. ide_script
end
require(ide_script)
-- Generate dag
local raw_nodes, node_bindings = unitgen.generate_dag(
build_data.BuildTuples,
build_data.BuildData,
build_data.Passes,
build_data.Configs,
env)
-- Pass the build tuples directly to the generator and let it write
-- files.
nodegen.generate_ide_files(build_tuples, build_data.DefaultNodes, raw_nodes, env, raw_data.IdeGenerationHints, ide_script)
end