premake for usage / src / actions / make / make_solution.lua

--
-- make_solution.lua
-- Generate a solution-level makefile.
-- Copyright (c) 2002-2012 Jason Perkins and the Premake project
--

	local make = premake.make
	local solution = premake.solution
	local project = premake5.project


--
-- Generate a GNU make "solution" makefile, with support for the new platforms API.
--

	function make.generate_solution(sln)
		make.header(sln)

		make.configmap(sln)
		make.projects(sln)

		_p('.PHONY: all clean help $(PROJECTS)')
		_p('')
		_p('all: $(PROJECTS)')
		_p('')

		make.projectrules(sln)
		make.cleanrules(sln)
		make.helprule(sln)
	end


--
-- Write out the solution's configuration map, which maps solution
-- level configurations to the project level equivalents.
--

	function make.configmap(sln)
		for cfg in solution.eachconfig(sln) do
			_p('ifeq ($(config),%s)', cfg.shortname)
			for prj in solution.eachproject_ng(sln) do
				local prjcfg = project.getconfig(prj, cfg.buildcfg, cfg.platform)
				if prjcfg then
					_p('  %s_config = %s', make.tovar(prj.name), prjcfg.shortname)
				end
			end
			_p('endif')
		end
		_p('')
	end


--
-- Write out the rules for the `make clean` action.
--

	function make.cleanrules(sln)
		_p('clean:')
		for prj in solution.eachproject_ng(sln) do
			local slnpath = solution.getlocation(sln)
			local prjpath = path.getrelative(slnpath, project.getlocation(prj))
			_p(1,'@${MAKE} --no-print-directory -C %s -f %s clean', make.esc(prjpath), make.esc(make.getmakefilename(prj, true)))
		end
		_p('')
	end


--
-- Write out the make file help rule and configurations list.
--

	function make.helprule(sln)
		_p('help:')
		_p(1,'@echo "Usage: make [config=name] [target]"')
		_p(1,'@echo ""')
		_p(1,'@echo "CONFIGURATIONS:"')

		for cfg in solution.eachconfig(sln) do
			_p(1, '@echo "  %s"', make.esc(cfg.shortname))
		end

		_p(1,'@echo ""')

		_p(1,'@echo "TARGETS:"')
		_p(1,'@echo "   all (default)"')
		_p(1,'@echo "   clean"')

		for prj in solution.eachproject_ng(sln) do
			_p(1,'@echo "   %s"', prj.name)
		end

		_p(1,'@echo ""')
		_p(1,'@echo "For more information, see http://industriousone.com/premake/quick-start"')
	end


--
-- Write out the list of projects that comprise the solution.
--

	function make.projects(sln)
		_p('PROJECTS := %s', table.concat(make.esc(table.extract(sln.projects, "name")), " "))
		_p('')
	end


--
-- Write out the rules to build each of the solution's projects.
--

	function make.projectrules(sln)
		for prj in solution.eachproject_ng(sln) do
			local deps = project.getdependencies(prj)
			deps = table.extract(deps, "name")			
			_p('%s: %s', make.esc(prj.name), table.concat(deps, " "))
			
			local cfgvar = make.tovar(prj.name)
			_p('ifneq (,$(%s_config))', cfgvar)
			
			_p(1,'@echo "==== Building %s ($(%s_config)) ===="', prj.name, cfgvar)

			local slnpath = solution.getlocation(sln)
			local prjpath = path.getrelative(slnpath, project.getlocation(prj))
			local filename = make.getmakefilename(prj, true)
			_p(1,'@${MAKE} --no-print-directory -C %s -f %s config=$(%s_config)', make.esc(prjpath), make.esc(filename), cfgvar)
			
			_p('endif')
			_p('')
		end
	end
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.