Add code generation on compiling to premake scripts using custom build commands

This commit is contained in:
Jan
2019-10-25 02:13:37 +02:00
parent d93b4f5fac
commit 034de70bbc
27 changed files with 345 additions and 325 deletions

View File

@ -10,9 +10,11 @@ function Crypto:link()
libtomcrypt:link()
libtommath:link()
salsa20:link()
links {
"Crypto"
}
links "Crypto"
end
function Crypto:use()
end
function Crypto:project()

View File

@ -10,6 +10,10 @@ function Linker:link()
end
function Linker:use()
dependson "Linker"
end
function Linker:project()
local folder = ProjectFolder();

View File

@ -10,6 +10,10 @@ function Unlinker:link()
end
function Unlinker:use()
dependson "Unlinker"
end
function Unlinker:project()
local folder = ProjectFolder();

View File

@ -7,9 +7,11 @@ function Utils:include()
end
function Utils:link()
links {
"Utils"
}
links "Utils"
end
function Utils:use()
end
function Utils:project()

168
src/ZoneCode.lua Normal file
View File

@ -0,0 +1,168 @@
ZoneCode = {}
ZoneCode.Assets = {
T6 = {
"PhysPreset",
"PhysConstraints",
"DestructibleDef",
"XAnimParts",
"XModel",
"Material",
"MaterialTechniqueSet",
"GfxImage",
"SndBank",
"SndPatch",
"clipMap_t",
"ComWorld",
"GameWorldSp",
"GameWorldMp",
"MapEnts",
"GfxWorld",
"GfxLightDef",
"Font_s",
"FontIcon",
"MenuList",
"menuDef_t",
"LocalizeEntry",
"WeaponVariantDef",
"WeaponAttachment",
"WeaponAttachmentUnique",
"WeaponCamo",
"SndDriverGlobals",
"FxEffectDef",
"FxImpactTable",
"RawFile",
"StringTable",
"LeaderboardDef",
"XGlobals",
"ddlRoot_t",
"Glasses",
"EmblemSet",
"ScriptParseTree",
"KeyValuePairs",
"VehicleDef",
"MemoryBlock",
"AddonMapEnts",
"TracerDef",
"SkinnedVertsDef",
"Qdb",
"Slug",
"FootstepTableDef",
"FootstepFXTableDef",
"ZBarrierDef"
}
}
function ZoneCode:outputForAssets(assetList)
for i = 1, #assetList do
local assetNameLower = string.lower(assetList[i])
buildoutputs {
"%{wks.location}/src/ZoneCode/Game/%{file.basename}/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_load_db.cpp",
"%{wks.location}/src/ZoneCode/Game/%{file.basename}/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_load_db.h",
"%{wks.location}/src/ZoneCode/Game/%{file.basename}/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_write_db.cpp",
"%{wks.location}/src/ZoneCode/Game/%{file.basename}/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_write_db.h",
"%{wks.location}/src/ZoneCode/Game/%{file.basename}/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_struct_test.cpp",
}
end
end
function ZoneCode:allTestFiles()
result = {}
for game, assets in pairs(self.Assets) do
for i, assetName in ipairs(assets) do
local assetNameLower = string.lower(assetName)
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_struct_test.cpp")
end
end
return result
end
function ZoneCode:allLoadFiles()
result = {}
for game, assets in pairs(self.Assets) do
for i, assetName in ipairs(assets) do
local assetNameLower = string.lower(assetName)
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_load_db.cpp")
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_load_db.h")
end
end
return result
end
function ZoneCode:allWriteFiles()
result = {}
for game, assets in pairs(self.Assets) do
for i, assetName in ipairs(assets) do
local assetNameLower = string.lower(assetName)
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_write_db.cpp")
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_write_db.h")
end
end
return result
end
function ZoneCode:include()
includedirs {
path.join(ProjectFolder(), "ZoneCode"),
"%{wks.location}/src/ZoneCode"
}
end
function ZoneCode:link()
end
function ZoneCode:use()
dependson "ZoneCode"
end
function ZoneCode:project()
local folder = ProjectFolder();
project "ZoneCode"
targetdir(TargetDirectoryLib)
location "%{wks.location}/src/%{prj.name}"
kind "Utility"
files {
path.join(folder, "ZoneCode/**.gen"),
path.join(folder, "ZoneCode/**.h"),
path.join(folder, "ZoneCode/**_Commands.txt")
}
vpaths {
["*"] = {
path.join(folder, "ZoneCode")
}
}
ZoneCodeGenerator:use()
filter "files:**.gen"
buildmessage "Generating ZoneCode for game %{file.basename}"
buildcommands {
'"' .. TargetDirectoryLib .. '/ZoneCodeGenerator.exe"'
.. ' -h "' .. path.join(path.getabsolute(ProjectFolder()), 'ZoneCode/Game/%{file.basename}/%{file.basename}.h') .. '"'
.. ' -e "' .. path.join(path.getabsolute(ProjectFolder()), 'ZoneCode/Game/%{file.basename}/%{file.basename}_Commands.txt') .. '"'
.. ' -o "%{wks.location}/src/ZoneCode/Game/%{file.basename}/XAssets"'
.. ' -g * ZoneLoad'
.. ' -g * ZoneWrite'
.. ' -g * AssetStructTests'
}
buildinputs {
path.join(ProjectFolder(), "ZoneCode/Game/%{file.basename}/%{file.basename}.h"),
path.join(ProjectFolder(), "ZoneCode/Game/%{file.basename}/%{file.basename}_Commands.txt"),
TargetDirectoryLib .. "/ZoneCodeGenerator.exe"
}
filter {}
filter "files:**/T6.gen"
self:outputForAssets(self.Assets.T6)
filter {}
end

View File

@ -3,6 +3,6 @@
// Entry point for T6 code generation
#include "../Common.h"
#include "../../ZoneCommon/Game/T6/T6_Assets.h"
#include "../../../ZoneCommon/Game/T6/T6_Assets.h"
// EOF

View File

@ -5,25 +5,32 @@ function ZoneCodeGenerator:include()
end
function ZoneCodeGenerator:link()
links {
"ZoneCodeGenerator"
}
links "ZoneCodeGenerator"
end
function ZoneCodeGenerator:use()
dependson "ZoneCodeGenerator"
end
function ZoneCodeGenerator:project()
local folder = ProjectFolder();
project "ZoneCodeGenerator"
targetdir(TargetDirectoryBin)
targetdir(TargetDirectoryLib)
location "%{wks.location}/src/%{prj.name}"
kind "ConsoleApp"
language "C#"
namespace "ZoneCodeGenerator"
files {
path.join(folder, "ZoneCodeGenerator/**.cs")
path.join(folder, "ZoneCodeGenerator/**.cs"),
path.join(folder, "ZoneCodeGenerator/**.stg")
}
filter "files:**.stg"
buildaction "Embed"
filter {}
vpaths { ["*"] = "src/ZoneCodeGenerator" }
nuget {

View File

@ -31,7 +31,7 @@ namespace ZoneCodeGenerator.Generating
"ZoneWrite", new GeneratorPreset("$asset/$asset_write_db", "ZoneWrite.stg")
},
{
"AssetStructTests", new GeneratorPreset("$asset_struct_test", "AssetStructTests.stg")
"AssetStructTests", new GeneratorPreset("$asset/$asset_struct_test", "AssetStructTests.stg")
}
};
@ -40,7 +40,10 @@ namespace ZoneCodeGenerator.Generating
public static bool GenerateCodeForPreset(string presetName, StructureInformation asset, CUISession session)
{
if (!presets.ContainsKey(presetName))
{
Console.WriteLine($"Unknown preset '{presetName}'");
return false;
}
var preset = presets[presetName];
@ -67,12 +70,19 @@ namespace ZoneCodeGenerator.Generating
var renderingContext = RenderingContext.BuildContext(session, asset);
if (renderingContext == null)
{
Console.WriteLine("Building rendering context failed");
return false;
}
if (!codeTemplate.HasHeaderTemplate && !codeTemplate.HasSourceTemplate)
{
Console.WriteLine($"Preset '{presetName}' does not have a header or a source! This is weird.");
return false;
}
var generatedCode = false;
if (codeTemplate.HasHeaderTemplate)
{
generatedCode = true;
using (var fileStream = new FileStream(fullPath + ".h", FileMode.Create))
{
codeTemplate.RenderHeaderFile(fileStream, renderingContext);
@ -82,7 +92,6 @@ namespace ZoneCodeGenerator.Generating
if (codeTemplate.HasSourceTemplate)
{
generatedCode = true;
using (var fileStream = new FileStream(fullPath + ".cpp", FileMode.Create))
{
codeTemplate.RenderSourceFile(fileStream, renderingContext);
@ -90,10 +99,13 @@ namespace ZoneCodeGenerator.Generating
}
}
return generatedCode;
return true;
}
catch (Exception)
catch (Exception e)
{
Console.WriteLine("An exception occured while trying to generate code");
Console.WriteLine(e.GetType().Name);
Console.WriteLine(e.Message);
return false;
}
}

View File

@ -82,8 +82,8 @@ namespace ZoneCodeGenerator.Generating
{
if (resourceStream == null)
{
if (Verbose)
Console.WriteLine($"Resource '{fileName}' doesn't exist");
Console.WriteLine($"Resource '{fileName}' doesn't exist");
Console.WriteLine("The following files do exist: " + string.Join(", ", Assembly.GetExecutingAssembly().GetManifestResourceNames()));
return;
}

View File

@ -56,8 +56,10 @@ namespace ZoneCodeGenerator.Parsing.C_Header
return dataRepository;
}
}
catch (IOException)
catch (IOException e)
{
Console.WriteLine("An exception occured while trying to read header file");
Console.WriteLine(e.Message);
return null;
}
}

View File

@ -12,6 +12,10 @@ function ZoneCommon:link()
}
end
function ZoneCommon:use()
end
function ZoneCommon:project()
local folder = ProjectFolder();

View File

@ -17,6 +17,10 @@ function ZoneLoading:link()
}
end
function ZoneLoading:use()
end
function ZoneLoading:project()
local folder = ProjectFolder();
@ -28,11 +32,22 @@ function ZoneLoading:project()
files {
path.join(folder, "ZoneLoading/**.h"),
path.join(folder, "ZoneLoading/**.cpp")
path.join(folder, "ZoneLoading/**.cpp"),
ZoneCode:allLoadFiles()
}
vpaths {
["*"] = {
path.join(folder, "ZoneLoading"),
path.join(BuildFolder(), "src/ZoneCode")
}
}
self:include()
Crypto:include()
Utils:include()
zlib:include()
ZoneCode:include()
ZoneCode:use()
end

View File

@ -4,54 +4,54 @@
#include <cassert>
#include "XAssets/gen/addonmapents/addonmapents_load_db.h"
#include "XAssets/gen/clipmap_t/clipmap_t_load_db.h"
#include "XAssets/gen/comworld/comworld_load_db.h"
#include "XAssets/gen/ddlroot_t/ddlroot_t_load_db.h"
#include "XAssets/gen/destructibledef/destructibledef_load_db.h"
#include "XAssets/gen/emblemset/emblemset_load_db.h"
#include "XAssets/gen/font_s/font_s_load_db.h"
#include "XAssets/gen/fonticon/fonticon_load_db.h"
#include "XAssets/gen/footstepfxtabledef/footstepfxtabledef_load_db.h"
#include "XAssets/gen/footsteptabledef/footsteptabledef_load_db.h"
#include "XAssets/gen/fxeffectdef/fxeffectdef_load_db.h"
#include "XAssets/gen/fximpacttable/fximpacttable_load_db.h"
#include "XAssets/gen/gameworldmp/gameworldmp_load_db.h"
#include "XAssets/gen/gameworldsp/gameworldsp_load_db.h"
#include "XAssets/gen/gfximage/gfximage_load_db.h"
#include "XAssets/gen/gfxlightdef/gfxlightdef_load_db.h"
#include "XAssets/gen/gfxworld/gfxworld_load_db.h"
#include "XAssets/gen/glasses/glasses_load_db.h"
#include "XAssets/gen/keyvaluepairs/keyvaluepairs_load_db.h"
#include "XAssets/gen/leaderboarddef/leaderboarddef_load_db.h"
#include "XAssets/gen/localizeentry/localizeentry_load_db.h"
#include "XAssets/gen/mapents/mapents_load_db.h"
#include "XAssets/gen/material/material_load_db.h"
#include "XAssets/gen/materialtechniqueset/materialtechniqueset_load_db.h"
#include "XAssets/gen/memoryblock/memoryblock_load_db.h"
#include "XAssets/gen/menudef_t/menudef_t_load_db.h"
#include "XAssets/gen/menulist/menulist_load_db.h"
#include "XAssets/gen/physconstraints/physconstraints_load_db.h"
#include "XAssets/gen/physpreset/physpreset_load_db.h"
#include "XAssets/gen/qdb/qdb_load_db.h"
#include "XAssets/gen/rawfile/rawfile_load_db.h"
#include "XAssets/gen/scriptparsetree/scriptparsetree_load_db.h"
#include "XAssets/gen/skinnedvertsdef/skinnedvertsdef_load_db.h"
#include "XAssets/gen/slug/slug_load_db.h"
#include "XAssets/gen/sndbank/sndbank_load_db.h"
#include "XAssets/gen/snddriverglobals/snddriverglobals_load_db.h"
#include "XAssets/gen/sndpatch/sndpatch_load_db.h"
#include "XAssets/gen/stringtable/stringtable_load_db.h"
#include "XAssets/gen/tracerdef/tracerdef_load_db.h"
#include "XAssets/gen/vehicledef/vehicledef_load_db.h"
#include "XAssets/gen/weaponattachment/weaponattachment_load_db.h"
#include "XAssets/gen/weaponattachmentunique/weaponattachmentunique_load_db.h"
#include "XAssets/gen/weaponcamo/weaponcamo_load_db.h"
#include "XAssets/gen/weaponvariantdef/weaponvariantdef_load_db.h"
#include "XAssets/gen/xanimparts/xanimparts_load_db.h"
#include "XAssets/gen/xglobals/xglobals_load_db.h"
#include "XAssets/gen/xmodel/xmodel_load_db.h"
#include "XAssets/gen/zbarrierdef/zbarrierdef_load_db.h"
#include "Game/T6/XAssets/addonmapents/addonmapents_load_db.h"
#include "Game/T6/XAssets/clipmap_t/clipmap_t_load_db.h"
#include "Game/T6/XAssets/comworld/comworld_load_db.h"
#include "Game/T6/XAssets/ddlroot_t/ddlroot_t_load_db.h"
#include "Game/T6/XAssets/destructibledef/destructibledef_load_db.h"
#include "Game/T6/XAssets/emblemset/emblemset_load_db.h"
#include "Game/T6/XAssets/font_s/font_s_load_db.h"
#include "Game/T6/XAssets/fonticon/fonticon_load_db.h"
#include "Game/T6/XAssets/footstepfxtabledef/footstepfxtabledef_load_db.h"
#include "Game/T6/XAssets/footsteptabledef/footsteptabledef_load_db.h"
#include "Game/T6/XAssets/fxeffectdef/fxeffectdef_load_db.h"
#include "Game/T6/XAssets/fximpacttable/fximpacttable_load_db.h"
#include "Game/T6/XAssets/gameworldmp/gameworldmp_load_db.h"
#include "Game/T6/XAssets/gameworldsp/gameworldsp_load_db.h"
#include "Game/T6/XAssets/gfximage/gfximage_load_db.h"
#include "Game/T6/XAssets/gfxlightdef/gfxlightdef_load_db.h"
#include "Game/T6/XAssets/gfxworld/gfxworld_load_db.h"
#include "Game/T6/XAssets/glasses/glasses_load_db.h"
#include "Game/T6/XAssets/keyvaluepairs/keyvaluepairs_load_db.h"
#include "Game/T6/XAssets/leaderboarddef/leaderboarddef_load_db.h"
#include "Game/T6/XAssets/localizeentry/localizeentry_load_db.h"
#include "Game/T6/XAssets/mapents/mapents_load_db.h"
#include "Game/T6/XAssets/material/material_load_db.h"
#include "Game/T6/XAssets/materialtechniqueset/materialtechniqueset_load_db.h"
#include "Game/T6/XAssets/memoryblock/memoryblock_load_db.h"
#include "Game/T6/XAssets/menudef_t/menudef_t_load_db.h"
#include "Game/T6/XAssets/menulist/menulist_load_db.h"
#include "Game/T6/XAssets/physconstraints/physconstraints_load_db.h"
#include "Game/T6/XAssets/physpreset/physpreset_load_db.h"
#include "Game/T6/XAssets/qdb/qdb_load_db.h"
#include "Game/T6/XAssets/rawfile/rawfile_load_db.h"
#include "Game/T6/XAssets/scriptparsetree/scriptparsetree_load_db.h"
#include "Game/T6/XAssets/skinnedvertsdef/skinnedvertsdef_load_db.h"
#include "Game/T6/XAssets/slug/slug_load_db.h"
#include "Game/T6/XAssets/sndbank/sndbank_load_db.h"
#include "Game/T6/XAssets/snddriverglobals/snddriverglobals_load_db.h"
#include "Game/T6/XAssets/sndpatch/sndpatch_load_db.h"
#include "Game/T6/XAssets/stringtable/stringtable_load_db.h"
#include "Game/T6/XAssets/tracerdef/tracerdef_load_db.h"
#include "Game/T6/XAssets/vehicledef/vehicledef_load_db.h"
#include "Game/T6/XAssets/weaponattachment/weaponattachment_load_db.h"
#include "Game/T6/XAssets/weaponattachmentunique/weaponattachmentunique_load_db.h"
#include "Game/T6/XAssets/weaponcamo/weaponcamo_load_db.h"
#include "Game/T6/XAssets/weaponvariantdef/weaponvariantdef_load_db.h"
#include "Game/T6/XAssets/xanimparts/xanimparts_load_db.h"
#include "Game/T6/XAssets/xglobals/xglobals_load_db.h"
#include "Game/T6/XAssets/xmodel/xmodel_load_db.h"
#include "Game/T6/XAssets/zbarrierdef/zbarrierdef_load_db.h"
using namespace T6;

View File

@ -17,6 +17,10 @@ function ZoneWriting:link()
}
end
function ZoneWriting:use()
end
function ZoneWriting:project()
local folder = ProjectFolder();
@ -35,4 +39,6 @@ function ZoneWriting:project()
Crypto:include()
Utils:include()
zlib:include()
ZoneCode:use()
end