99 lines
2.1 KiB
Lua
99 lines
2.1 KiB
Lua
|
--
|
||
|
-- gmake2_makefile.lua
|
||
|
-- Generate a C/C++ project makefile.
|
||
|
-- (c) 2016-2017 Jason Perkins, Blizzard Entertainment and the Premake project
|
||
|
--
|
||
|
|
||
|
local p = premake
|
||
|
local gmake2 = p.modules.gmake2
|
||
|
|
||
|
gmake2.makefile = {}
|
||
|
local makefile = gmake2.makefile
|
||
|
|
||
|
local project = p.project
|
||
|
local config = p.config
|
||
|
local fileconfig = p.fileconfig
|
||
|
|
||
|
---
|
||
|
-- Add namespace for element definition lists for p.callarray()
|
||
|
---
|
||
|
makefile.elements = {}
|
||
|
|
||
|
--
|
||
|
-- Generate a GNU make makefile project makefile.
|
||
|
--
|
||
|
|
||
|
makefile.elements.makefile = function(prj)
|
||
|
return {
|
||
|
gmake2.header,
|
||
|
gmake2.phonyRules,
|
||
|
makefile.configs,
|
||
|
makefile.targetRules
|
||
|
}
|
||
|
end
|
||
|
|
||
|
function makefile.generate(prj)
|
||
|
p.eol("\n")
|
||
|
p.callarray(make, makefile.elements.makefile, prj)
|
||
|
end
|
||
|
|
||
|
|
||
|
makefile.elements.configuration = function(cfg)
|
||
|
return {
|
||
|
gmake2.target,
|
||
|
gmake2.buildCommands,
|
||
|
gmake2.cleanCommands,
|
||
|
}
|
||
|
end
|
||
|
|
||
|
function makefile.configs(prj)
|
||
|
for cfg in project.eachconfig(prj) do
|
||
|
-- identify the toolset used by this configurations (would be nicer if
|
||
|
-- this were computed and stored with the configuration up front)
|
||
|
|
||
|
local toolset = p.tools[cfg.toolset or "gcc"]
|
||
|
if not toolset then
|
||
|
error("Invalid toolset '" .. cfg.toolset .. "'")
|
||
|
end
|
||
|
|
||
|
_x('ifeq ($(config),%s)', cfg.shortname)
|
||
|
p.callarray(make, makefile.elements.configuration, cfg, toolset)
|
||
|
_p('endif')
|
||
|
_p('')
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function makefile.targetRules(prj)
|
||
|
_p('$(TARGET):')
|
||
|
_p('\t$(BUILDCMDS)')
|
||
|
_p('')
|
||
|
_p('clean:')
|
||
|
_p('\t$(CLEANCMDS)')
|
||
|
_p('')
|
||
|
end
|
||
|
|
||
|
|
||
|
function gmake2.buildCommands(cfg)
|
||
|
_p(' define BUILDCMDS')
|
||
|
local steps = cfg.buildcommands
|
||
|
if #steps > 0 then
|
||
|
steps = os.translateCommandsAndPaths(steps, cfg.project.basedir, cfg.project.location)
|
||
|
_p('\t@echo Running build commands')
|
||
|
_p('\t%s', table.implode(steps, "", "", "\n\t"))
|
||
|
end
|
||
|
_p(' endef')
|
||
|
end
|
||
|
|
||
|
|
||
|
function gmake2.cleanCommands(cfg)
|
||
|
_p(' define CLEANCMDS')
|
||
|
local steps = cfg.cleancommands
|
||
|
if #steps > 0 then
|
||
|
steps = os.translateCommandsAndPaths(steps, cfg.project.basedir, cfg.project.location)
|
||
|
_p('\t@echo Running clean commands')
|
||
|
_p('\t%s', table.implode(steps, "", "", "\n\t"))
|
||
|
end
|
||
|
_p(' endef')
|
||
|
end
|
||
|
|