Build/Core/BuildHooks/BuildHooks.lua
2023-12-19 06:01:14 +00:00

180 lines
6.2 KiB
Lua

local kPathPrefix = "!"
local function normalizeCpyPath(absPath)
return absPath -- path.getrelative(os.getcwd(), Aurora.Settings.sAbsRoot) .. '/' .. path.getrelative(Aurora.Settings.sAbsRoot, absPath)
end
-- file name, type, directory, extension, is windows, configuration, real name
local function formatCpy(name, type, dir, ex, iswin, config, platformName, arch, realName)
local pathSuffix = "";
local hack2 = os.host() == "windows" and _ACTION == "gmake2"
if (iswin and not hack2) then
pathSuffix = "*\"";
else
pathSuffix = "\"";
end
local platform = Aurora.Platforms[platformName]
if (platform) then
platformName = platform.outputName
end
if (Aurora.Settings.bDefinePartialABIInTargetName) then
name = string.format("%s.%s.%s.%s", name, config, platformName, arch)
end
local outputPath = string.format("%s/%s%s", dir, name, ex)
local outputTarget = string.format("%s/%s", dir, name)
local uglyBuildPath = string.format("%%{cfg.targetdir}/%s%s", name, ex)
local hack = "{COPY}"
if (hack2) then
hack = "cp -rf"
end
return string.format("%s \"%s\" \"%s%s", hack, uglyBuildPath, outputPath, pathSuffix), outputPath, uglyBuildPath
end
local function gnuCoreUtilsMkdirRecursive(dir)
return string.format("mkdir -p \"%s\"", dir);
end
local function archiveShipPdb(pdbPath)
-- TODO (reece):
end
local function isUtils(projectType)
return projectType:lower() == "blank" or projectType:lower() == "utility" or projectType:lower() == "none"
end
local function isNoLinkType(projectType)
return projectType == "StaticLib" or isUtils(projectType)
end
local function addUserDestCopy(name, type, config, platformName, arch, dir)
local isWin = platformName == "win32"
local debugSymbolPath = nil
local platform = Aurora.Platforms[platformName]
if (not platform) then
return
end
local ext = (platform.exts or {})[type] or ""
local copy, outputPath, file = formatCpy(Aurora.Settings.sLibPrefix .. name, type, dir, ext, isWin, config, platformName, arch, name)
if (platform.devChainCoreUtils) then
gnuCoreUtilsMkdirRecursive(dir)
end
if (platform.devChainRequiresElfStrip and
platform.devChainSupportsElfStrip and
config ~= Aurora.Settings.sNameOfDebug) then
local debugSymbolPath = normalizeCpyPath(Aurora.Settings.sAbsSymbols) .. "/" .. name .. ".dwarf"
postbuildcommands("objcopy --strip-debug --strip-unneeded \"" .. file .. "\" \"" .. outputPath .. "\"")
if (Aurora.Settings.bUseAuBuildHooks and config ~= Aurora.Settings.sNameOfShip) then
postbuildcommands("objcopy --add-gnu-debuglink=\"" .. debugSymbolPath .. "\" \"" .. outputPath .. "\"")
end
else
postbuildcommands(copy)
end
end
local function addDest(name, projectType, dest)
local lookup = {}
local append = ""
if (isNoLinkType(projectType)) then
return
end
if (dest:starts(kPathPrefix)) then
append = dest:sub(#kPathPrefix + 1)
local fu = auFilterConfig(Aurora.Settings.sNameOfDebug)
lookup[Aurora.Settings.sNameOfDebug] = normalizeCpyPath(Aurora.Settings.sAbsDebug)
lookup[Aurora.Settings.sNameOfInternal] = normalizeCpyPath(Aurora.Settings.sAbsStage)
lookup[Aurora.Settings.sNameOfShip] = normalizeCpyPath(Aurora.Settings.sAbsShip)
else
lookup[Aurora.Settings.sNameOfDebug] = dest
lookup[Aurora.Settings.sNameOfInternal] = dest
lookup[Aurora.Settings.sNameOfShip] = dest
end
auFilterForConfigPlatforms(function(config, platform, arch)
addUserDestCopy(name, projectType, config, platform, arch, lookup[config] .. append)
end)
end
local function postBuildCommands(name, type, config, platformName, arch)
local compilerDirectOutput = nil
if (platformName == "win32") then
postbuildcommands(formatCpy(Aurora.Settings.sLibPrefix .. name, type, normalizeCpyPath(Aurora.Settings.sAbsSymbols), ".pdb", true, config, platformName, arch, name))
if (type == "SharedLib" or
type == "StaticLib") then
postbuildcommands(formatCpy(Aurora.Settings.sLibPrefix .. name, type, normalizeCpyPath(Aurora.Settings.sAbsLinkLibs), ".lib", true, config, platformName, arch, name))
end
else
local ext = (Aurora.Platforms[platformName].exts[type] or "")
if (type == "SharedLib" or
type == "StaticLib") then
local ext = (Aurora.Platforms[platformName].exts[type] or "")
local cmd = nil
cmd, compilerDirectOutput = formatCpy(Aurora.Settings.sLibPrefix .. name, type, normalizeCpyPath(Aurora.Settings.sAbsLinkLibs), ext, false, config, platformName, arch, name)
postbuildcommands(cmd)
end
local idc = nil
idc, idc, compilerDirectOutput = formatCpy(Aurora.Settings.sLibPrefix .. name, type, normalizeCpyPath(Aurora.Settings.sAbsLinkLibs), ext, false, config, platformName, arch, name)
end
if (config == Aurora.Settings.sNameOfDebug) then
return
end
local platform = Aurora.Platforms[platformName]
if (not platform) then
return
end
local debugSymbolPath = nil
local debugExt = ""
if (platform.devChainRequiresElfStrip and
platform.devChainSupportsElfStrip) then
debugEx = ".dwarf"
debugSymbolPath = normalizeCpyPath(Aurora.Settings.sAbsSymbols) .. "/" .. name .. ".dwarf"
postbuildcommands("objcopy --only-keep-debug \"" .. compilerDirectOutput .. "\" \"" .. debugSymbolPath .. "\"")
elseif (isWin) then
debugEx = ".pdb"
debugSymbolPath = normalizeCpyPath(Aurora.Settings.sAbsSymbols) .. "/" .. name .. ".pdb"
end
if (debugSymbolPath and
config == Aurora.Settings.sNameOfShip) then
archiveShipPdb(debugSymbolPath, debugEx)
end
end
local function startProject(name, projectType)
if (not Aurora.Settings.bUseAuBuildHooks) then
return
end
if (isUtils(projectType)) then
return
end
auFilterForConfigPlatforms(function(config, platform, arch)
postBuildCommands(name, projectType, config, platform, arch)
end)
end
return {
startProject = startProject,
addDest = addDest
}