diff --git a/Boilerplate/jsonProcessor.lua b/Boilerplate/jsonProcessor.lua index 91035e2..7ef897e 100644 --- a/Boilerplate/jsonProcessor.lua +++ b/Boilerplate/jsonProcessor.lua @@ -12,6 +12,18 @@ function JsonProcessor(info) info.name = result.name end + local translateDep = function(this, dep) + + if (this.info.translations) then + local override = this.info.translations[dep] + if (override) then + dep = override + end + end + + return dep + end + local includeDirEx = function(path, incFiles) includedirs(path) @@ -86,18 +98,107 @@ function JsonProcessor(info) end end + local handleDependsShort = function(dep, this, soft) + dep = translateDep(this, dep) + + local proj = _G["projectsprocessor"][dep] + if (not proj) then + if (soft) then + print("Not including, ", dep) + return + end + fatal("Missing project", dep) + end + + local iface = proj.processor + if (isProjectLoaded(dep) and not _G["_linkingcur"][dep]) then + iface:handleLink() + end + end + + local processJsonBlockForLinks = function(object, this) + forEach(object.links, links) + forEach(object.depends, handleDependsShort, this, false) + forEach(object["soft-depends"], handleDependsShort, this, true) + end + + function handleEvalForLinks(object, this) + if (isArray(object)) then + forEach(object, handleEvalForLinks, this) + return + end + + if (type(object) == "string") then + return + end + + processJsonBlockForLinks(object, this) + end + + local handleActionCommon = function(action, cb, ...) + local _if = action["if"] + local _then = action["then"] + + _G["info"] = info + + local loadstring = loadstring or load + + if (_if) then + local val = eval("return " .. _if) + if (not val) then + return + end + + if (_then) then + cb(_then, ...) + end + else + if (action.eval) then + cb(action.eval, ...) + end + end + + _G["info"] = nil + end + + local handleActionsForLinks = function(action, this) + handleActionCommon(action, handleEvalForLinks, this) + end + + local processSubLinks = function(this) + processJsonBlockForLinks(result, this) + forEach(result.actions, handleActionsForLinks, this) + end + local handleLink = function(this) - dependson(this.info.name) + dependson (this.info.name) + + local erase = false; + if (not _G["_linkingcur"]) then + erase = true + _G["_linkingcur"] = {} + end + + + _G["_linkingcur"][this.info.name] = true + local type = this.result.type if ((type:lower() == "utility") or (type:lower() == "blank")) then return end - if (not this.result.noLink) then + if ((not this.result.noLink)) then links(this.info.name) end - handleDllImportMaybe(this) + + --if (not this.info.isStatic) then + processSubLinks(this) + --end + + if (erase) then + _G["_linkingcur"] = nil + end end local handleReference = function(this, circular) @@ -133,18 +234,6 @@ function JsonProcessor(info) defines(("_auhas_" .. this.result.name):upper() .. "=1") end - local translateDep = function(this, dep) - - if (this.info.translations) then - local override = this.info.translations[dep] - if (override) then - dep = override - end - end - - return dep - end - local handleDependsPreemptive = function(dep, this, soft, resolve) dep = translateDep(this, dep) @@ -199,6 +288,10 @@ function JsonProcessor(info) os.exit() end + + _G["_linkingcur"] = {} + _G["_linkingcur"][name] = true + handleInclude(a, true) --forEach(result.defines, defines) @@ -238,7 +331,9 @@ function JsonProcessor(info) if (isProjectLoaded(dep)) then defines(("_auhas_" .. dep):upper() .. "=1") iface:handleReference() - iface:handleLink() + if (not this.info.isStatic) then + iface:handleLink() + end else defines(("_auhas_" .. dep):upper() .. "=0") if (not soft) then @@ -301,29 +396,7 @@ function JsonProcessor(info) end local handleAction = function(action) - local _if = action["if"] - local _then = action["then"] - - _G["info"] = info - - local loadstring = loadstring or load - - if (_if) then - local val = eval("return " .. _if) - if (not val) then - return - end - - if (_then) then - handleEval(_then) - end - else - if (action.eval) then - handleEval(action.eval) - end - end - - _G["info"] = nil + handleActionCommon(action, handleEval) end forEach(result.require, handleRequire) @@ -344,6 +417,8 @@ function JsonProcessor(info) forEach(result.staticImpDefines, defines) end + _G["_linkingcur"] = nil + end forEach(result.subprojs, function(subproj) diff --git a/Boilerplate/workspace.lua b/Boilerplate/workspace.lua index 1c84639..8b0e2d8 100644 --- a/Boilerplate/workspace.lua +++ b/Boilerplate/workspace.lua @@ -38,16 +38,15 @@ workspace "Aurora Project" flags { - "NoIncrementalLink", - "MultiProcessorCompile", - "LinkTimeOptimization"--, - --"NoEditAndContinue" + "NoPCH", + "MultiProcessorCompile" } filter "configurations:Debug" defines { "DEBUG" } targetdir(getroot() .. "/Build_CompilerWorkingDirectory/Bin/Debug") debugdir( getroot() .. "/Build_Develop") + flags "NoIncrementalLink" filter "configurations:Release or configurations:Ship" defines { "NDEBUG" } @@ -57,12 +56,13 @@ workspace "Aurora Project" defines {"INTERNAL", "STAGING"} targetdir(getroot() .. "/Build_CompilerWorkingDirectory/Bin/Release") debugdir(getroot() .. "/Build_Stage") + flags "NoIncrementalLink" filter "configurations:Ship" defines {"SHIP"} targetdir(getroot() .. "/Build_CompilerWorkingDirectory/Bin/Ship") debugdir(getroot() .. "/Build_Ship") - + flags "LinkTimeOptimization" filter {} @@ -103,18 +103,16 @@ workspace "Aurora Project" -- even microsofts docs dont state what is guaranteed to be safe. -- dont mix optimizations, cookie/security flags, and so on. rtti works so who cares - "4244", -- conversion from 'double' to 'float', possible loss of data + "4244" -- conversion from 'double' to 'float', possible loss of data -- this warning is extremely important; however, we're making a game engine. -- pragma warning push + disable + pop and/or static_casts to hint we expect floating point precision -- loss is extremely annoying and impractical. further, projects including harfbuzz, freetype, -- and v8 don't seem to care about this warning either - - "4267" -- TODO: remove. its not that we dont want this warning - we see spam where clang doesnt care, annoying } end - if (_G.linux and usingClang) then - + if (usingClang or usingMSVC) then + defines "_AU_HAS_ATOMIC_INTRINS" end if (isWin) then diff --git a/Features/guess-platform-code.lua b/Features/guess-platform-code.lua index 235443f..bb7f37c 100644 --- a/Features/guess-platform-code.lua +++ b/Features/guess-platform-code.lua @@ -1,52 +1,55 @@ local feature = function() local readdPattern = function(pattern) - files (getProjectInfo(getCurrentProjectName()).path + "/" + pattern) + files (getProjectInfo(getCurrentProjectName()).path .. "/" .. pattern) end local readd = function(name) - readdPattern "**/" .. name .. "/**.c" - readdPattern "**/" .. name .. "/**.*pp" - readdPattern "**/" .. name .. "/**.masm" - readdPattern "**/" .. name .. "/**.inl" - readdPattern "**/" .. name .. "/**.h" - readdPattern "**/*." .. name .. ".cc" - readdPattern "**/*." .. name .. ".c" - readdPattern "**/*." .. name .. ".h" - readdPattern "**/*." .. name .. ".*pp" - readdPattern "**/*." .. name .. ".masm" - readdPattern "**/*." .. name .. ".inl" + readdPattern("**/*" .. name .. ".cc") + readdPattern("**/*" .. name .. ".c") + readdPattern("**/*" .. name .. ".h") + readdPattern("**/*" .. name .. ".*pp") + readdPattern("**/*" .. name .. ".masm") + readdPattern("**/*" .. name .. ".inl") end - if (_G["target-win32"]) then - if (_G["target-x86_64"]) then + if (_G["win32"]) then + if (_G["x86_64"]) then readd "win64" end readd "win32" readd "windows" end - if (_G["target-linux"]) then + if (_G["linux"]) then readd "linux" + readd "unix" end - if (_G["target-mac"]) then + if (_G["android"]) then + readd "linux" + readd "android" + readd "unix" + end + + if (_G["mac"]) then readd "macos" readd "mac" readd "apple" + readd "unix" end - if (_G["target-ios"]) then + if (_G["ios"]) then readd "apple" readd "ios" end - if (_G["target-x86_64"]) then + if (_G["x86_64"]) then readd "x64" readd "x86_64" readd "amd64" end - if (_G["target-x86_32"]) then + if (_G["x86_32"]) then readdPattern "**/x86/**" readdPattern "**/x86/**.c" readdPattern "**/x86/**.h" @@ -59,7 +62,7 @@ local feature = function() readd "intel" end - if (_G["target-arm"]) then + if (_G["arm"]) then readd "arm" readd "aarch64" readd "aarch" diff --git a/Features/remove-platform-code.lua b/Features/remove-platform-code.lua index fe9c558..03b82f8 100644 --- a/Features/remove-platform-code.lua +++ b/Features/remove-platform-code.lua @@ -1,8 +1,9 @@ local feature = function() - local platforms = {"win32", "linux", "xnu", "mac", "osx", "ios", "x86_64", "x86_32", "aarch", "arm64", "mips", "mips64", "riscv", "intel", "powerpc", "amiga"} + local platforms = {"win32", "linux", "xnu", "mac", "osx", "ios", "x86_64", "x86_32", "aarch", "arm64", "mips", "mips64", "riscv", "intel", "powerpc", "amiga", "unix", "android", "apple", "amd64", "freebsd", "bsd"} forEach(platforms, function(platform) if (not _G[platform]) then - excludes("**/" .. platform .. "/**"); + excludes("**/" .. platform .. "/**.*"); + excludes("**/*" .. platform .. ".*"); end end) diff --git a/aurora.lua b/aurora.lua index dacd98a..d7750ff 100644 --- a/aurora.lua +++ b/aurora.lua @@ -148,8 +148,11 @@ function addScript(ina) local procesor = userRequire(args.script) if (not procesor) then - print("missing project script:", args.script, path) - return + processor = requireAbs(args.script) + if (not procesor) then + print("missing project script:", args.script, path) + return + end end project.processor = procesor(info) @@ -166,6 +169,51 @@ local processLocalProject = function(proj) processProject(proj.info.name) end +-- private +local processInit = function(project) + if (not project.isInitialized) then + if (project.processor.init) then + project.processor:init() + end + project.isInitialized = true + end +end + +-- private +_G["_resolved_dep_res"] = {} +_G["_resolved_dep"] = {} +function processDepSearch(proj, resolveProject) + local name = proj.info.name + + _G["_resolved_dep"][name] = name + + if (not proj.resolvedDeps) then + if (proj.processor.resolveDependencies) then + proj.processor:resolveDependencies(function(name, soft) + + if (_G["_resolved_dep"][name]) then + return + end + + local depProj = projectsprocessor[name] + if (not depProj) then + if (not soft) then + fatal("missing dependency: ", name) + else + return false + end + end + + processDepSearch(depProj, true) + end) + end + proj.resolvedDeps = true + end + + processInit(proj) +end + +-- private local processNS = function(namespace) local projs = {} local projsIdxs = {} @@ -185,6 +233,10 @@ local processNS = function(namespace) return a:upper() < b:upper() end) + forEach(projsIdxs, function(idx) + processDepSearch(projs[idx], true) + end) + forEach(projsIdxs, function(idx) processLocalProject(projs[idx]) end) @@ -232,28 +284,7 @@ function processProject(name, required, noNs) end end - if (not a.isParsed) then - if (a.processor.parse) then - a.processor:parse() - end - a.isParsed = true - end - - - resolved[name] = name - - if (not a.resolvedDeps) then - if (a.processor.resolveDependencies) then - a.processor:resolveDependencies(function(name, soft) - if (resolved[name]) then - return - end - - processProject(name, not soft, noNs) - end) - end - a.resolvedDeps = true - end + processInit(a) if (projectsblocked[name]) then return true @@ -290,7 +321,12 @@ function isWeakCircularReference(name) end function isProjectLoaded(name) - return projectsemitted[name] and true + local a = projectsprocessor[name] + if (not a) then + return false + end + + return a.isInitialized end function getProjectInfo(name) @@ -317,9 +353,10 @@ end -- executes inline under iprocessor::process function addFeature(feature) - local script = os.getcwd() .. "/Build_Scripts/Features/" .. feature:lower() .. ".lua" + local script = getroot() .. "/Build_Scripts/Features/" .. feature:lower() .. ".lua" if (not os.isfile(script)) then + fatal("missing feature", feature, script) return end