143 lines
4.0 KiB
Lua
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
|