summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/genie/src/actions/ninja/ninja_solution.lua
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/genie/src/actions/ninja/ninja_solution.lua')
-rw-r--r--3rdparty/genie/src/actions/ninja/ninja_solution.lua162
1 files changed, 162 insertions, 0 deletions
diff --git a/3rdparty/genie/src/actions/ninja/ninja_solution.lua b/3rdparty/genie/src/actions/ninja/ninja_solution.lua
new file mode 100644
index 00000000000..383c9c4e752
--- /dev/null
+++ b/3rdparty/genie/src/actions/ninja/ninja_solution.lua
@@ -0,0 +1,162 @@
+local ninja = premake.ninja
+local p = premake
+local solution = p.solution
+
+function ninja.generate_solution(sln)
+ -- create a shortcut to the compiler interface
+ local cc = premake[_OPTIONS.cc]
+
+ -- build a list of supported target platforms that also includes a generic build
+ local platforms = premake.filterplatforms(sln, cc.platforms, "Native")
+
+ -- write a header showing the build options
+ _p('# %s solution makefile autogenerated by GENie', premake.action.current().shortname)
+ _p('# Type "make help" for usage help')
+ _p('')
+ _p('NINJA=ninja')
+
+ -- set a default configuration
+ _p('ifndef config')
+ _p(' config=%s', _MAKE.esc(premake.getconfigname(sln.configurations[1], platforms[1], true)))
+ _p('endif')
+ _p('')
+
+ local projects = table.extract(sln.projects, "name")
+ table.sort(projects)
+
+ _p('')
+ _p('.PHONY: all clean help $(PROJECTS)')
+ _p('')
+ _p('all:')
+ if (not sln.messageskip) or (not table.contains(sln.messageskip, "SkipBuildingMessage")) then
+ _p(1, '@echo "==== Building all ($(config)) ===="')
+ end
+ _p(1, '@${NINJA} -C ${config} all')
+ _p('')
+
+ -- write the project build rules
+ for _, prj in ipairs(sln.projects) do
+ local prjx = ninja.get_proxy("prj", prj)
+ _p('%s:', _MAKE.esc(prj.name))
+ if (not sln.messageskip) or (not table.contains(sln.messageskip, "SkipBuildingMessage")) then
+ _p(1, '@echo "==== Building %s ($(config)) ===="', prj.name)
+ end
+ _p(1, '@${NINJA} -C ${config} %s', prj.name)
+ _p('')
+ end
+
+ -- clean rules
+ _p('clean:')
+ _p(1, '@${NINJA} -C ${config} -t clean')
+ _p('')
+
+ -- help rule
+ _p('help:')
+ _p(1,'@echo "Usage: make [config=name] [target]"')
+ _p(1,'@echo ""')
+ _p(1,'@echo "CONFIGURATIONS:"')
+
+ local cfgpairs = { }
+ for _, platform in ipairs(platforms) do
+ for _, cfgname in ipairs(sln.configurations) do
+ _p(1,'@echo " %s"', premake.getconfigname(cfgname, platform, true))
+ end
+ end
+
+ _p(1,'@echo ""')
+ _p(1,'@echo "TARGETS:"')
+ _p(1,'@echo " all (default)"')
+ _p(1,'@echo " clean"')
+
+ for _, prj in ipairs(sln.projects) do
+ _p(1,'@echo " %s"', prj.name)
+ end
+
+ _p(1,'@echo ""')
+ _p(1,'@echo "For more information, see https://github.com/bkaradzic/genie"')
+end
+
+-- generate solution that will call ninja for projects
+ local generate
+
+ local function getconfigs(sln, name, plat)
+ local cfgs = {}
+ for prj in solution.eachproject(sln) do
+ prj = ninja.get_proxy("prj", prj)
+ for cfg in p.eachconfig(prj, plat) do
+ if cfg.name == name then
+ table.insert(cfgs, cfg)
+ end
+ end
+ end
+ return cfgs
+ end
+
+ function ninja.generate_ninja_builds(sln)
+ -- create a shortcut to the compiler interface
+ local cc = premake[_OPTIONS.cc]
+
+ sln.getlocation = function(cfg, plat)
+ return path.join(sln.location, premake.getconfigname(cfg, plat, true))
+ end
+
+ -- build a list of supported target platforms that also includes a generic build
+ local platforms = premake.filterplatforms(sln, cc.platforms, "Native")
+
+ for _,plat in ipairs(platforms) do
+ for _,name in ipairs(sln.configurations) do
+ p.generate(sln, ninja.get_solution_name(sln, name, plat), function(sln)
+ generate(getconfigs(sln, name, plat))
+ end)
+ end
+ end
+ end
+
+ function ninja.get_solution_name(sln, cfg, plat)
+ return path.join(sln.getlocation(cfg, plat), "build.ninja")
+ end
+
+ function generate(prjcfgs)
+ local cfgs = {}
+ local cfg_first = nil
+ local cfg_first_lib = nil
+
+ _p("# solution build file")
+ _p("# generated with GENie ninja")
+ _p("")
+
+ _p("# build projects")
+ for _,cfg in ipairs(prjcfgs) do
+ local key = cfg.project.name
+
+ -- fill list of output files
+ if not cfgs[key] then cfgs[key] = "" end
+ cfgs[key] = cfg:getoutputfilename() .. " "
+
+ if not cfgs["all"] then cfgs["all"] = "" end
+ cfgs["all"] = cfgs["all"] .. cfg:getoutputfilename() .. " "
+
+ -- set first configuration name
+ if (cfg_first == nil) and (cfg.kind == "ConsoleApp" or cfg.kind == "WindowedApp") then
+ cfg_first = key
+ end
+ if (cfg_first_lib == nil) and (cfg.kind == "StaticLib" or cfg.kind == "SharedLib") then
+ cfg_first_lib = key
+ end
+
+ -- include other ninja file
+ _p("subninja " .. cfg:getprojectfilename())
+ end
+
+ _p("")
+
+ _p("# targets")
+ for cfg, outputs in iter.sortByKeys(cfgs) do
+ _p("build " .. cfg .. ": phony " .. outputs)
+ end
+ _p("")
+
+ _p("# default target")
+ _p("default " .. (cfg_first or cfg_first_lib))
+ _p("")
+ end