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 = ""; if (iswin) 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) return string.format("{COPY} \"%s\" \"%s%s", 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 }