diff --git a/Boilerplate/jsonProcessor.lua b/Boilerplate/jsonProcessor.lua index 7ef897e..51b8d52 100644 --- a/Boilerplate/jsonProcessor.lua +++ b/Boilerplate/jsonProcessor.lua @@ -322,15 +322,11 @@ function JsonProcessor(info) local iface = proj.processor - if (isWeakCircularReference(dep)) then - print("handling circular reference", dep) - iface:handleReference(true) - return - end - if (isProjectLoaded(dep)) then defines(("_auhas_" .. dep):upper() .. "=1") - iface:handleReference() + + iface:handleReference(isWeakCircularReference(dep)) + if (not this.info.isStatic) then iface:handleLink() end diff --git a/Boilerplate/project.lua b/Boilerplate/project.lua index 8e1c277..c79fb58 100644 --- a/Boilerplate/project.lua +++ b/Boilerplate/project.lua @@ -76,6 +76,16 @@ local boilerplateProject = function(name, projectType, src, inc, dest, root) if ((projectType == "SharedLib") or (projectType == "StaticLib")) then pic "On" + + if (usingGXX) then + -- TODO: we dont actually support gxx + -- We expect clang or msvc + -- msvcs thread local is fine, windows has always had decent thread in/out callbacks + -- clang has a cross platform, per variable solution + -- -> `__thread __attribute__((tls_model("initial-exec")));` + -- initial-exec is recommended when pic is on. does not work for dynamically loaded modules + buildoptions{"-ftls-model=initial-exec"} + end end end diff --git a/aurora.lua b/aurora.lua index d7750ff..d33fca6 100644 --- a/aurora.lua +++ b/aurora.lua @@ -90,7 +90,8 @@ function addVisit(ina) local project = { info = info, - processor = nil + processor = nil, + deps = {} } local cwd = getroot() @@ -143,7 +144,8 @@ function addScript(ina) local project = { info = info, - processor = nil + processor = nil, + deps = {} } local procesor = userRequire(args.script) @@ -185,12 +187,15 @@ _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) + table.insert(proj.deps, name) + if (_G["_resolved_dep"][name]) then return end @@ -316,8 +321,26 @@ function processProject(name, required, noNs) return true end -function isWeakCircularReference(name) - return projectsblocked[name] and not projectsemitted[name] +function isWeakCircularReference(depName) + local curName = getCurrentProjectName() + + local cur = projectsprocessor[curName] + if (not cur) then + return + end + + local dep = projectsprocessor[depName] + if (not dep) then + return + end + + for index, value in ipairs(dep.deps) do + if value == curName then + return true + end + end + + return false end function isProjectLoaded(name)