Build: Add a separate config file and library/binary search paths support

Former-commit-id: cdab236bb7e31f9a49f60c88de22a2d7b4c63a8a [formerly 7fa3e521de3428ce9d451c3117629a5e84ec675f]
Former-commit-id: 71abf8891e423fecdfea0d80a13c156ed9a427a2
This commit is contained in:
Lynix 2016-07-29 23:47:09 +02:00
parent a7041185de
commit f3fa95ee4f
2 changed files with 304 additions and 213 deletions

17
build/config.lua Normal file
View File

@ -0,0 +1,17 @@
-- This file contains special configurations values, such as directories to extern libraries (Qt)
-- Editing this file is not required to use/compile the engine, as default values should be enough
-- Builds Nazara extern libraries (such as lua/STB)
BuildDependencies = true
-- Builds Nazara examples
BuildExamples = true
-- Setup additionnals install directories, separated by a semi-colon ; (library binaries will be copied there)
--InstallDir = "/usr/local/lib64"
-- Excludes client-only modules/tools/examples
ServerMode = false
-- Builds modules as one united library (useless on POSIX systems)
UniteModules = false

View File

@ -24,7 +24,7 @@ function NazaraBuild:Execute()
if (self.Actions[_ACTION] == nil) then
local makeLibDir = os.is("windows") and "mingw" or "gmake"
if (_OPTIONS["with-extlibs"]) then
if (self.Config["BuildDependencies"]) then
workspace("NazaraExtlibs")
platforms(platformData)
@ -39,12 +39,6 @@ function NazaraBuild:Execute()
location(_ACTION)
kind("StaticLib")
configuration("x32")
libdirs("../extlibs/lib/common/x86")
configuration("x64")
libdirs("../extlibs/lib/common/x64")
configuration({"codeblocks or codelite or gmake", "x32"})
libdirs("../extlibs/lib/" .. makeLibDir .. "/x86")
targetdir("../extlibs/lib/" .. makeLibDir .. "/x86")
@ -111,6 +105,12 @@ function NazaraBuild:Execute()
includedirs(libTable.Includes)
links(libTable.Libraries)
configuration("x32")
libdirs(libTable.LibraryPaths.x86)
configuration("x64")
libdirs(libTable.LibraryPaths.x64)
for k,v in pairs(libTable.ConfigurationLibraries) do
configuration(k)
links(v)
@ -188,11 +188,11 @@ function NazaraBuild:Execute()
libdirs("../extlibs/lib/common")
configuration("x32")
libdirs("../extlibs/lib/common/x86")
libdirs(moduleTable.LibraryPaths.x86)
configuration("x64")
defines("NAZARA_PLATFORM_x64")
libdirs("../extlibs/lib/common/x64")
libdirs(moduleTable.LibraryPaths.x64)
configuration({"codeblocks or codelite or gmake", "x32"})
libdirs("../extlibs/lib/" .. makeLibDir .. "/x86")
@ -297,11 +297,11 @@ function NazaraBuild:Execute()
libdirs("../extlibs/lib/common")
configuration("x32")
libdirs("../extlibs/lib/common/x86")
libdirs(toolTable.LibraryPaths.x86)
configuration("x64")
defines("NAZARA_PLATFORM_x64")
libdirs("../extlibs/lib/common/x64")
libdirs(toolTable.LibraryPaths.x64)
configuration({"codeblocks or codelite or gmake", "x32"})
libdirs("../extlibs/lib/" .. makeLibDir .. "/x86")
@ -431,11 +431,11 @@ function NazaraBuild:Execute()
links(exampleTable.Libraries)
configuration("x32")
libdirs("../extlibs/lib/common/x86")
libdirs(exampleTable.LibraryPaths.x86)
configuration("x64")
defines("NAZARA_PLATFORM_x64")
libdirs("../extlibs/lib/common/x64")
libdirs(exampleTable.LibraryPaths.x64)
configuration({"codeblocks or codelite or gmake", "x32"})
libdirs("../lib/" .. makeLibDir .. "/x86")
@ -465,33 +465,29 @@ function NazaraBuild:Execute()
end
end
function NazaraBuild:GetConfig()
return self.Config
end
function NazaraBuild:GetDependency(infoTable, name)
local projectName = name:match("Nazara(%w+)")
if (projectName) then
-- tool or module
local moduleTable = self.Modules[projectName:lower()]
if (moduleTable) then
return moduleTable
else
local toolTable = self.Tools[projectName:lower()]
if (toolTable) then
return toolTable
end
end
else
return self.ExtLibs[name:lower()]
end
end
function NazaraBuild:Initialize()
-- Commençons par les options
newoption({
trigger = "install-path",
description = "Setup additionnals install directories (library binaries will be copied there)"
})
newoption({
trigger = "server",
description = "Excludes client-only modules/tools/examples"
})
newoption({
trigger = "united",
description = "Builds all the modules as one united library"
})
newoption({
trigger = "with-extlibs",
description = "Builds the extern libraries"
})
newoption({
trigger = "with-examples",
description = "Builds the examples"
})
self.Actions = {}
self.Examples = {}
self.ExecutableDir = {}
@ -500,12 +496,8 @@ function NazaraBuild:Initialize()
self.Modules = {}
self.Tools = {}
if (_OPTIONS["install-path"]) then
local paths = string.explode(_OPTIONS["install-path"], ";")
for k,v in pairs(paths) do
self:AddInstallPath(v)
end
end
self.Config = {}
self:LoadConfig()
-- Actions
modules = os.matchfiles("scripts/actions/*.lua")
@ -593,7 +585,7 @@ function NazaraBuild:Initialize()
TOOL = nil
-- Examples
if (_OPTIONS["with-examples"]) then
if (self.Config["BuildExamples"]) then
local examples = os.matchdirs("../examples/*")
for k,v in pairs(examples) do
local dirName = v:match(".*/(.*)")
@ -643,6 +635,236 @@ function NazaraBuild:Initialize()
end
end
function NazaraBuild:LoadConfig()
local f = io.open("config.lua", "r")
if (not f) then
print("Failed to open config.lua")
return
end
local content = f:read("*a")
f:close()
local func, err = loadstring(content)
if (not func) then
print("Failed to parse config.lua: " .. err)
return
end
setfenv(func, self.Config)
local status, err = pcall(func)
if (not status) then
print("Failed to load config.lua: " .. err)
return
end
local configTable = self.Config
local AddBoolOption = function (option, name, description)
newoption({
trigger = name,
description = description
})
local str = _OPTIONS[name]
if (str) then
if (#str == 0 or str == "1" or str == "yes" or str == "true") then
configTable[option] = true
elseif (str == "0" or str == "no" or str == "false") then
configTable[option] = false
else
error("Invalid entry for " .. name .. " option: \"" .. str .. "\"")
end
end
end
AddBoolOption("BuildDependencies", "with-extlibs", "Builds the extern libraries")
AddBoolOption("BuildExamples", "with-examples", "Builds the examples")
AddBoolOption("ServerMode", "server", "Excludes client-only modules/tools/examples")
AddBoolOption("UniteModules", "united", "Builds all the modules as one united library")
-- InstallDir
newoption({
trigger = "install-path",
description = "Setup additionnals install directories (library binaries will be copied there)"
})
self.Config["InstallDir"] = self.Config["InstallDir"] or ""
if (_OPTIONS["install-path"] ~= nil) then
self.Config["InstallDir"] = self.Config["InstallDir"] .. ";" .. _OPTIONS["install-path"]
end
local paths = string.explode(self.Config["InstallDir"], ";")
for k,v in pairs(paths) do
self:AddInstallPath(v)
end
end
function NazaraBuild:MakeInstallCommands(infoTable)
if (PremakeVersion < 50) then
return
end
if (os.is("windows")) then
configuration({})
for k,v in pairs(self.InstallDir) do
local destPath = path.translate(path.isabsolute(k) and k or "../../" .. k)
postbuildcommands({[[xcopy "%{path.translate(cfg.linktarget.relpath):sub(1, -5) .. ".dll"}" "]] .. destPath .. [[\" /E /Y]]})
end
for k,fileName in pairs(table.join(infoTable.Libraries, infoTable.DynLib)) do
local paths = {}
for k,v in pairs(infoTable.BinaryPaths.x86) do
table.insert(paths, {"x32", v .. "/" .. fileName .. ".dll"})
table.insert(paths, {"x32", v .. "/lib" .. fileName .. ".dll"})
end
for k,v in pairs(infoTable.BinaryPaths.x64) do
table.insert(paths, {"x64", v .. "/" .. fileName .. ".dll"})
table.insert(paths, {"x64", v .. "/lib" .. fileName .. ".dll"})
end
for k,v in pairs(paths) do
local config = v[1]
local srcPath = v[2]
if (os.isfile(srcPath)) then
if (infoTable.Kind == "plugin") then
srcPath = "../../" .. srcPath
end
configuration(config)
for k,v in pairs(self.ExecutableDir) do
local srcPath = path.isabsolute(srcPath) and path.translate(srcPath) or [[%{path.translate(cfg.linktarget.relpath:sub(1, -#cfg.linktarget.name - 1) .. "../../]] .. srcPath .. [[")}]]
local destPath = path.translate(path.isabsolute(k) and k or "../../" .. k)
postbuildcommands({[[xcopy "]] .. srcPath .. [[" "]] .. destPath .. [[\" /E /Y]]})
end
end
end
end
end
end
local PosixOSes = {
["bsd"] = true,
["linux"] = true,
["macosx"] = true,
["solaris"] = true
}
function NazaraBuild:Process(infoTable)
local libraries = {}
for k, library in pairs(infoTable.Libraries) do
local libraryTable = self:GetDependency(infoTable, library)
if (libraryTable) then
if (libraryTable.Excluded) then
infoTable.Excluded = true
infoTable.ExcludeReason = "depends on excluded " .. library .. " " .. libraryTable.Type:lower()
return false
end
if (libraryTable.Type == "Module") then
if (_OPTIONS["united"]) then
library = "NazaraEngine"
else
library = "Nazara" .. libraryTable.Name
end
if (not self.Config["UniteModules"] or infoTable.Type ~= "Module") then
table.insert(infoTable.ConfigurationLibraries.DebugStatic, library .. "-s-d")
table.insert(infoTable.ConfigurationLibraries.ReleaseStatic, library .. "-s")
table.insert(infoTable.ConfigurationLibraries.DebugDynamic, library .. "-d")
table.insert(infoTable.ConfigurationLibraries.ReleaseDynamic, library)
end
elseif (libraryTable.Type == "ExternLib") then
library = libraryTable.Name
table.insert(infoTable.ConfigurationLibraries.DebugStatic, library .. "-s-d")
table.insert(infoTable.ConfigurationLibraries.ReleaseStatic, library .. "-s")
table.insert(infoTable.ConfigurationLibraries.DebugDynamic, library .. "-s-d")
table.insert(infoTable.ConfigurationLibraries.ReleaseDynamic, library .. "-s")
elseif (libraryTable.Type == "Tool") then
library = "Nazara" .. libraryTable.Name
-- Import tools includes
for k,v in ipairs(libraryTable.Includes) do
table.insert(infoTable.Includes, v)
end
-- And libraries
for k, v in pairs(libraryTable.Libraries) do
table.insert(infoTable.Libraries, v)
end
for config, libs in pairs(libraryTable.ConfigurationLibraries) do
for k,v in pairs(libs) do
table.insert(infoTable.ConfigurationLibraries[config], v)
end
end
table.insert(infoTable.ConfigurationLibraries.DebugStatic, library .. "-s-d")
table.insert(infoTable.ConfigurationLibraries.ReleaseStatic, library .. "-s")
table.insert(infoTable.ConfigurationLibraries.DebugDynamic, library .. "-d")
table.insert(infoTable.ConfigurationLibraries.ReleaseDynamic, library)
else
infoTable.Excluded = true
infoTable.ExcludeReason = "dependency " .. library .. " has invalid type \"" .. libraryTable.Type .. "\""
return false
end
else
table.insert(libraries, library)
end
end
infoTable.Libraries = libraries
for k,v in pairs(infoTable) do
local target = k:match("Os(%w+)")
if (target) then
local targetTable = infoTable[target]
if (targetTable) then
local excludeTargetTable = infoTable[target .. "Excluded"]
for platform, defineTable in pairs(v) do
platform = string.lower(platform)
if (platform == "posix") then
local osname = os.get()
if (PosixOSes[osname]) then
platform = osname
end
end
if (os.is(platform)) then
for k,v in ipairs(defineTable) do
table.insert(targetTable, v)
end
elseif (excludeTargetTable) then
for k,v in ipairs(defineTable) do
table.insert(excludeTargetTable, v)
end
end
end
infoTable[k] = nil
end
end
end
if (infoTable.Kind == "application") then
self:AddExecutablePath(infoTable.TargetDirectory)
end
if (infoTable.Validate) then
local ret, err = infoTable:Validate()
if (not ret) then
infoTable.Excluded = true
infoTable.ExcludeReason = "validation failed: " .. err
return false
end
end
return true
end
function NazaraBuild:RegisterAction(actionTable)
if (actionTable.Name == nil or type(actionTable.Name) ~= "string" or string.len(actionTable.Name) == 0) then
return false, "Invalid action name"
@ -750,7 +972,7 @@ function NazaraBuild:RegisterModule(moduleTable)
table.insert(moduleTable.Files, "../src/Nazara/" .. moduleTable.Name .. "/**.inl")
table.insert(moduleTable.Files, "../src/Nazara/" .. moduleTable.Name .. "/**.cpp")
if (_OPTIONS["united"] and lowerCaseName ~= "core") then
if (self.Config["UniteModules"] and lowerCaseName ~= "core") then
table.insert(moduleTable.FilesExcluded, "../src/Nazara/" .. moduleTable.Name .. "/Debug/NewOverload.cpp")
end
@ -789,132 +1011,8 @@ function NazaraBuild:RegisterTool(toolTable)
return true
end
local PosixOSes = {
["bsd"] = true,
["linux"] = true,
["macosx"] = true,
["solaris"] = true
}
function NazaraBuild:Process(infoTable)
local libraries = {}
for k, library in pairs(infoTable.Libraries) do
local projectName = library:match("Nazara(%w+)")
local moduleTable = projectName and self.Modules[projectName:lower()]
local toolTable = projectName and self.Tools[projectName:lower()]
if (moduleTable) then
if (moduleTable.Excluded) then
infoTable.Excluded = true
infoTable.ExcludeReason = "depends on excluded " .. projectName .. " module"
return false
end
if (_OPTIONS["united"]) then
library = "NazaraEngine"
else
library = "Nazara" .. moduleTable.Name
end
if (not _OPTIONS["united"] or infoTable.Type ~= "Module") then
table.insert(infoTable.ConfigurationLibraries.DebugStatic, library .. "-s-d")
table.insert(infoTable.ConfigurationLibraries.ReleaseStatic, library .. "-s")
table.insert(infoTable.ConfigurationLibraries.DebugDynamic, library .. "-d")
table.insert(infoTable.ConfigurationLibraries.ReleaseDynamic, library)
end
else
local extLibTable = self.ExtLibs[library:lower()]
if (extLibTable) then
if (extLibTable.Excluded) then
infoTable.Excluded = true
infoTable.ExcludeReason = "depends on excluded " .. extLibTable.Name .. " external library"
return false
end
library = extLibTable.Name
table.insert(infoTable.ConfigurationLibraries.DebugStatic, library .. "-s-d")
table.insert(infoTable.ConfigurationLibraries.ReleaseStatic, library .. "-s")
table.insert(infoTable.ConfigurationLibraries.DebugDynamic, library .. "-s-d")
table.insert(infoTable.ConfigurationLibraries.ReleaseDynamic, library .. "-s")
else
if (toolTable and toolTable.Kind == "library") then
if (toolTable.Excluded) then
infoTable.Excluded = true
infoTable.ExcludeReason = "depends on excluded " .. toolTable.Name .. " tool"
return false
end
library = "Nazara" .. toolTable.Name
-- Import tools includes
for k,v in ipairs(toolTable.Includes) do
table.insert(infoTable.Includes, v)
end
-- And libraries
for k, v in pairs(toolTable.Libraries) do
table.insert(infoTable.Libraries, v)
end
for config, libs in pairs(toolTable.ConfigurationLibraries) do
for k,v in pairs(libs) do
table.insert(infoTable.ConfigurationLibraries[config], v)
end
end
table.insert(infoTable.ConfigurationLibraries.DebugStatic, library .. "-s-d")
table.insert(infoTable.ConfigurationLibraries.ReleaseStatic, library .. "-s")
table.insert(infoTable.ConfigurationLibraries.DebugDynamic, library .. "-d")
table.insert(infoTable.ConfigurationLibraries.ReleaseDynamic, library)
else
table.insert(libraries, library)
end
end
end
end
infoTable.Libraries = libraries
for k,v in pairs(infoTable) do
local target = k:match("Os(%w+)")
if (target) then
local targetTable = infoTable[target]
if (targetTable) then
local excludeTargetTable = infoTable[target .. "Excluded"]
for platform, defineTable in pairs(v) do
platform = string.lower(platform)
if (platform == "posix") then
local osname = os.get()
if (PosixOSes[osname]) then
platform = osname
end
end
if (os.is(platform)) then
for k,v in ipairs(defineTable) do
table.insert(targetTable, v)
end
elseif (excludeTargetTable) then
for k,v in ipairs(defineTable) do
table.insert(excludeTargetTable, v)
end
end
end
infoTable[k] = nil
end
end
end
if (infoTable.Kind == "application") then
self:AddExecutablePath(infoTable.TargetDirectory)
end
return true
end
function NazaraBuild:Resolve(infoTable)
if (infoTable.ClientOnly and _OPTIONS["server"]) then
if (infoTable.ClientOnly and self.Config["ServerMode"]) then
infoTable.Excluded = true
infoTable.ExcludeReason = "excluded by command-line options (client-only)"
end
@ -937,53 +1035,19 @@ function NazaraBuild:Resolve(infoTable)
end
end
function NazaraBuild:MakeInstallCommands(infoTable)
if (PremakeVersion < 50) then
return
end
if (os.is("windows")) then
configuration({})
for k,v in pairs(self.InstallDir) do
local destPath = path.translate(path.isabsolute(k) and k or "../../" .. k)
postbuildcommands({[[xcopy "%{path.translate(cfg.linktarget.relpath):sub(1, -5) .. ".dll"}" "]] .. destPath .. [[\" /E /Y]]})
end
for k,v in pairs(table.join(infoTable.Libraries, infoTable.DynLib)) do
local paths = {}
table.insert(paths, {"x32", "../extlibs/lib/common/x86/" .. v .. ".dll"})
table.insert(paths, {"x32", "../extlibs/lib/common/x86/lib" .. v .. ".dll"})
table.insert(paths, {"x64", "../extlibs/lib/common/x64/" .. v .. ".dll"})
table.insert(paths, {"x64", "../extlibs/lib/common/x64/lib" .. v .. ".dll"})
for k,v in pairs(paths) do
local config = v[1]
local srcPath = v[2]
if (os.isfile(srcPath)) then
if (infoTable.Kind == "plugin") then
srcPath = "../../" .. srcPath
end
configuration(config)
for k,v in pairs(self.ExecutableDir) do
local destPath = path.translate(path.isabsolute(k) and k or "../../" .. k)
postbuildcommands({[[xcopy "%{path.translate(cfg.linktarget.relpath:sub(1, -#cfg.linktarget.name - 1) .. "../../]] .. srcPath .. [[")}" "]] .. destPath .. [[\" /E /Y]]})
end
end
end
end
end
end
function NazaraBuild:SetupInfoTable(infoTable)
infoTable.Excludable = true
infoTable.BinaryPaths = {}
infoTable.BinaryPaths.x86 = {}
infoTable.BinaryPaths.x64 = {}
infoTable.ConfigurationLibraries = {}
infoTable.ConfigurationLibraries.DebugStatic = {}
infoTable.ConfigurationLibraries.ReleaseStatic = {}
infoTable.ConfigurationLibraries.DebugDynamic = {}
infoTable.ConfigurationLibraries.ReleaseDynamic = {}
infoTable.Excludable = true
infoTable.LibraryPaths = {}
infoTable.LibraryPaths.x86 = {}
infoTable.LibraryPaths.x64 = {}
local infos = {"Defines", "DynLib", "Files", "FilesExcluded", "Flags", "Includes", "Libraries"}
for k,v in ipairs(infos) do
@ -1003,12 +1067,22 @@ function NazaraBuild:SetupExtlibTable(infoTable)
self:SetupInfoTable(infoTable)
infoTable.Kind = "library"
table.insert(infoTable.BinaryPaths.x86, "../extlibs/lib/common/x86")
table.insert(infoTable.BinaryPaths.x64, "../extlibs/lib/common/x64")
table.insert(infoTable.LibraryPaths.x86, "../extlibs/lib/common/x86")
table.insert(infoTable.LibraryPaths.x64, "../extlibs/lib/common/x64")
end
function NazaraBuild:SetupModuleTable(infoTable)
self:SetupInfoTable(infoTable)
infoTable.Kind = "library"
table.insert(infoTable.BinaryPaths.x86, "../extlibs/lib/common/x86")
table.insert(infoTable.BinaryPaths.x64, "../extlibs/lib/common/x64")
table.insert(infoTable.LibraryPaths.x86, "../extlibs/lib/common/x86")
table.insert(infoTable.LibraryPaths.x64, "../extlibs/lib/common/x64")
end
NazaraBuild.SetupToolTable = NazaraBuild.SetupInfoTable