87 lines
3.0 KiB
Lua
87 lines
3.0 KiB
Lua
|
|
--- Build back-end for using Makefile-based packages.
|
|
module("luarocks.build.make", package.seeall)
|
|
|
|
local fs = require("luarocks.fs")
|
|
local util = require("luarocks.util")
|
|
local cfg = require("luarocks.cfg")
|
|
|
|
--- Call "make" with given target and variables
|
|
-- @param pass boolean: If true, run make; if false, do nothing.
|
|
-- @param target string: The make target; an empty string indicates
|
|
-- the default target.
|
|
-- @param variables table: A table containing string-string key-value
|
|
-- pairs representing variable assignments to be passed to make.
|
|
-- @return boolean: false if any errors occurred, true otherwise.
|
|
local function make_pass(pass, target, variables)
|
|
assert(type(pass) == "boolean")
|
|
assert(type(target) == "string")
|
|
assert(type(variables) == "table")
|
|
|
|
local assignments = {}
|
|
for k,v in pairs(variables) do
|
|
table.insert(assignments, k.."="..v)
|
|
end
|
|
if pass then
|
|
return fs.execute(cfg.make.." "..target, unpack(assignments))
|
|
else
|
|
return true
|
|
end
|
|
end
|
|
|
|
--- Driver function for the "make" build back-end.
|
|
-- @param rockspec table: the loaded rockspec.
|
|
-- @return boolean or (nil, string): true if no errors ocurred,
|
|
-- nil and an error message otherwise.
|
|
function run(rockspec)
|
|
assert(type(rockspec) == "table")
|
|
|
|
local build = rockspec.build
|
|
|
|
if build.build_pass == nil then build.build_pass = true end
|
|
if build.install_pass == nil then build.install_pass = true end
|
|
build.build_variables = build.build_variables or {}
|
|
build.install_variables = build.install_variables or {}
|
|
build.build_target = build.build_target or ""
|
|
build.install_target = build.install_target or "install"
|
|
local makefile = build.makefile or cfg.makefile
|
|
if makefile then
|
|
-- Assumes all make's accept -f. True for POSIX make, GNU make and Microsoft nmake.
|
|
build.build_target = "-f "..makefile.." "..build.build_target
|
|
build.install_target = "-f "..makefile.." "..build.install_target
|
|
end
|
|
|
|
if build.variables then
|
|
for var, val in pairs(build.variables) do
|
|
build.build_variables[var] = val
|
|
build.install_variables[var] = val
|
|
end
|
|
end
|
|
|
|
util.warn_if_not_used(build.build_variables, { CFLAGS=true }, "variable %s was not passed in build_variables")
|
|
|
|
util.variable_substitutions(build.build_variables, rockspec.variables)
|
|
util.variable_substitutions(build.install_variables, rockspec.variables)
|
|
|
|
local auto_variables = { "CC" }
|
|
|
|
for _, variable in pairs(auto_variables) do
|
|
if not build.build_variables[variable] then
|
|
build.build_variables[variable] = rockspec.variables[variable]
|
|
end
|
|
if not build.install_variables[variable] then
|
|
build.install_variables[variable] = rockspec.variables[variable]
|
|
end
|
|
end
|
|
|
|
local ok = make_pass(build.build_pass, build.build_target, build.build_variables)
|
|
if not ok then
|
|
return nil, "Failed building."
|
|
end
|
|
ok = make_pass(build.install_pass, build.install_target, build.install_variables)
|
|
if not ok then
|
|
return nil, "Failed installing."
|
|
end
|
|
return true
|
|
end
|