Build/aurora.lua
Reece 3d5cc16ca8 Attempt to read build information from the users build scripts directory
Ensure all build scripts are executed relative to the projects root directory
2021-05-27 11:02:12 +01:00

239 lines
5.6 KiB
Lua

require("Utils.utils")
-------------------------------------------------------
-- globals
-------------------------------------------------------
_G["projectsprocessor"] = {}
_G["projectsblocked"] = {}
_G["projectsemitted"] = {}
_G["namespacesemitted"] = {}
_G["usingClang"] = false
_G["usingMSVC"] = false
-------------------------------------------------------
-- process command line arguments into global space
-------------------------------------------------------
require("Boilerplate.options")
-------------------------------------------------------
-- debug stuff
-------------------------------------------------------
function printHeader(key, val)
print("-------------------------------------------------------")
print(key, val)
print("-------------------------------------------------------")
end
function dbgGroup(name)
printHeader("group", name);
group(name)
end
-------------------------------------------------------
-- API
-------------------------------------------------------
local jsonProcessor = require("Boilerplate.jsonProcessor")
local normalizeSourceRoot = function(path)
local backup = path
path = os.realpath(_G.path.join(os.getcwd(), path));
if (not path) then
print("path error, not found?", backup)
return
end
return path
end
local extendInfo = function(this)
local type = this.projectType:lower()
this.isShared = type == "sharedlib"
this.isStatic = type == "staticlib"
this.isExec = type == "consoleapp" or type == 'windowedapp'
this.isConsole = type == "consoleapp"
this.isWindowed = type == "windowedapp"
end
function addVisit(ina)
local args = {
namespace = ina.namespace,
name = ina.name, -- OPT: recommended
path = ina.path,
type = ina.type,
out = ina.out,
translations = ina.translations -- OPT: dictionary of dependency maps
}
local path = normalizeSourceRoot(args.path)
if (not path) then
return
end
local info = {
namespace = args.namespace,
path = path,
projectType = args.type,
out = args.out,
name = args.name,
translations = args.translations
}
extendInfo(info)
local project = {
info = info,
processor = nil
}
local cwd = getroot()
local remoteLua = path .. "/Aurora.lua"
local remoteJson = path .. "/Aurora.json"
local localJson = cwd .. "/Build_UserScripts/" .. args.name .. ".aurora.json"
local localLua = cwd .. "/Build_UserScripts/" .. args.name .. ".aurora.lua"
if (os.isfile(localLua)) then
project.processor = require(localLua)(info)
elseif (os.isfile(localJson)) then
info.jpath = localJson
project.processor = jsonProcessor(info)
elseif (os.isfile(remoteLua)) then
project.processor = require(remoteLua)(info)
elseif (os.isfile(remoteJson)) then
info.jpath = remoteJson
project.processor = jsonProcessor(info)
else
print("Couldnt find Aurora build script for: ", path)
return
end
projectsprocessor[info.name] = project
end
function addScript(ina)
local args = {
namespace = ina.namespace,
script = ina.script,
path = ina.path,
type = ina.type,
out = ina.out
}
local path = normalizeSourceRoot(args.path)
if (not path) then
return
end
local info = {
namespace = args.namespace,
path = path,
projectType = args.type,
out = args.out
}
extendInfo(info)
local project = {
info = info,
processor = nil
}
local procesor = userRequire(args.script)
if (not procesor) then
print("missing project script:", args.script, path)
return
end
project.processor = procesor(info)
if (not project.processor) then
print("script error")
return
end
projectsprocessor[info.name] = project
end
-- private
local processLocalProject = function(proj)
processSubproject(proj.info.name);
end
function processProject()
forEach(projectsprocessor, processLocalProject)
end
function processSubproject(name)
if (projectsblocked[name]) then
return
end
projectsblocked[name] = name
local a = projectsprocessor[name]
if (not a) then
print("missing project: ", name)
return
end
local info = a.info
local ns = info.namespace
if (not namespacesemitted[ns]) then
namespacesemitted[ns] = "";
dbgGroup(ns)
end
local cwd = os.getcwd()
local old = _G["current_project"]
_G["current_project"] = name
os.chdir(info.path)
a.processor:process(a.processor)
os.chdir(cwd)
_G["current_project"] = old
projectsemitted[name] = name
end
function isWeakCircularReference(name)
return projectsblocked[name] and not projectsemitted[name]
end
function isProjectLoaded(name)
return projectsemitted[name] and true
end
function getProjectInfo(name)
if (not name) then
return
end
local scre = projectsprocessor[name]
if (not scre) then
return
end
return scre.info
end
function getCurrentProjectName()
return current_project
end
-- private
local buildAction = require("Actions.buildAction")
-- executes inline under iprocessor::process
function addBuildAction(...)
buildAction(...)
end
-- executes inline under iprocessor::process
function addFeature(feature)
local script = os.getcwd() .. "/Build_Script/Features/" .. feature:lower() .. ".lua"
if (not os.isfile(script)) then
return
end
require(script)()
end
require ("Boilerplate.workspace")