Add Godot constants to Mono project builds

This adds constants to projects build via Godot Mono which allows project to conditionally react to different operating systems and 32/64 Bit architecture. Additionally .NET libraries could support multiple engines like Unity and Godot at the same time when compiled from Godot and reacting to definitions.
This commit is contained in:
ShyRed 2019-05-09 19:54:56 +02:00
parent 0d8f1ba6a9
commit 60e711a115
6 changed files with 37 additions and 9 deletions

View file

@ -186,7 +186,7 @@ namespace GodotSharpTools.Build
private string BuildArguments(string loggerAssemblyPath, string loggerOutputDir, List<string> customProperties) private string BuildArguments(string loggerAssemblyPath, string loggerOutputDir, List<string> customProperties)
{ {
string arguments = string.Format(@"""{0}"" /v:normal /t:Build ""/p:{1}"" ""/l:{2},{3};{4}""", string arguments = string.Format(@"""{0}"" /v:normal /t:Rebuild ""/p:{1}"" ""/l:{2},{3};{4}""",
solution, solution,
"Configuration=" + config, "Configuration=" + config,
typeof(GodotBuildLogger).FullName, typeof(GodotBuildLogger).FullName,
@ -196,7 +196,7 @@ namespace GodotSharpTools.Build
foreach (string customProperty in customProperties) foreach (string customProperty in customProperties)
{ {
arguments += " \"/p:" + customProperty + "\""; arguments += " /p:" + customProperty;
} }
return arguments; return arguments;

View file

@ -80,7 +80,7 @@ namespace GodotSharpTools.Project
toolsGroup.AddProperty("DebugSymbols", "true"); toolsGroup.AddProperty("DebugSymbols", "true");
toolsGroup.AddProperty("DebugType", "portable"); toolsGroup.AddProperty("DebugType", "portable");
toolsGroup.AddProperty("Optimize", "false"); toolsGroup.AddProperty("Optimize", "false");
toolsGroup.AddProperty("DefineConstants", "DEBUG;TOOLS;"); toolsGroup.AddProperty("DefineConstants", "$(GodotDefineConstants);GODOT;DEBUG;TOOLS;");
toolsGroup.AddProperty("ErrorReport", "prompt"); toolsGroup.AddProperty("ErrorReport", "prompt");
toolsGroup.AddProperty("WarningLevel", "4"); toolsGroup.AddProperty("WarningLevel", "4");
toolsGroup.AddProperty("ConsolePause", "false"); toolsGroup.AddProperty("ConsolePause", "false");
@ -161,7 +161,7 @@ namespace GodotSharpTools.Project
debugGroup.AddProperty("DebugSymbols", "true"); debugGroup.AddProperty("DebugSymbols", "true");
debugGroup.AddProperty("DebugType", "portable"); debugGroup.AddProperty("DebugType", "portable");
debugGroup.AddProperty("Optimize", "false"); debugGroup.AddProperty("Optimize", "false");
debugGroup.AddProperty("DefineConstants", "DEBUG;"); debugGroup.AddProperty("DefineConstants", "$(GodotDefineConstants);GODOT;DEBUG;");
debugGroup.AddProperty("ErrorReport", "prompt"); debugGroup.AddProperty("ErrorReport", "prompt");
debugGroup.AddProperty("WarningLevel", "4"); debugGroup.AddProperty("WarningLevel", "4");
debugGroup.AddProperty("ConsolePause", "false"); debugGroup.AddProperty("ConsolePause", "false");
@ -170,6 +170,7 @@ namespace GodotSharpTools.Project
releaseGroup.Condition = " '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "; releaseGroup.Condition = " '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ";
releaseGroup.AddProperty("DebugType", "portable"); releaseGroup.AddProperty("DebugType", "portable");
releaseGroup.AddProperty("Optimize", "true"); releaseGroup.AddProperty("Optimize", "true");
releaseGroup.AddProperty("DefineConstants", "$(GodotDefineConstants);GODOT;");
releaseGroup.AddProperty("ErrorReport", "prompt"); releaseGroup.AddProperty("ErrorReport", "prompt");
releaseGroup.AddProperty("WarningLevel", "4"); releaseGroup.AddProperty("WarningLevel", "4");
releaseGroup.AddProperty("ConsolePause", "false"); releaseGroup.AddProperty("ConsolePause", "false");

View file

@ -30,6 +30,7 @@
#include "godotsharp_builds.h" #include "godotsharp_builds.h"
#include "core/os/os.h"
#include "core/vector.h" #include "core/vector.h"
#include "main/main.h" #include "main/main.h"
@ -351,7 +352,7 @@ bool GodotSharpBuilds::make_api_assembly(APIAssembly::Type p_api_type) {
return true; return true;
} }
bool GodotSharpBuilds::build_project_blocking(const String &p_config) { bool GodotSharpBuilds::build_project_blocking(const String &p_config, const Vector<String> &p_godot_defines) {
if (!FileAccess::exists(GodotSharpDirs::get_project_sln_path())) if (!FileAccess::exists(GodotSharpDirs::get_project_sln_path()))
return true; // No solution to build return true; // No solution to build
@ -366,6 +367,21 @@ bool GodotSharpBuilds::build_project_blocking(const String &p_config) {
pr.step("Building project solution", 0); pr.step("Building project solution", 0);
MonoBuildInfo build_info(GodotSharpDirs::get_project_sln_path(), p_config); MonoBuildInfo build_info(GodotSharpDirs::get_project_sln_path(), p_config);
// Add Godot defines
String constants = "GodotDefineConstants=\"";
for (int i = 0; i < p_godot_defines.size(); i++) {
constants += "GODOT_" + p_godot_defines[i].to_upper().replace("-", "_").replace(" ", "_").replace(";", "_") + ";";
}
#ifdef REAL_T_IS_DOUBLE
constants += "GODOT_REAL_T_IS_DOUBLE;";
#endif
constants += "\"";
build_info.custom_props.push_back(constants);
if (!GodotSharpBuilds::get_singleton()->build(build_info)) { if (!GodotSharpBuilds::get_singleton()->build(build_info)) {
GodotSharpBuilds::show_build_error_dialog("Failed to build project solution"); GodotSharpBuilds::show_build_error_dialog("Failed to build project solution");
return false; return false;
@ -393,7 +409,10 @@ bool GodotSharpBuilds::editor_build_callback() {
ERR_FAIL_COND_V(copy_err != OK, false); ERR_FAIL_COND_V(copy_err != OK, false);
} }
return build_project_blocking("Tools"); Vector<String> godot_defines;
godot_defines.push_back(OS::get_singleton()->get_name());
godot_defines.push_back(sizeof(void *) == 4 ? "32" : "64");
return build_project_blocking("Tools", godot_defines);
} }
GodotSharpBuilds *GodotSharpBuilds::singleton = NULL; GodotSharpBuilds *GodotSharpBuilds::singleton = NULL;

View file

@ -92,7 +92,7 @@ public:
static bool make_api_assembly(APIAssembly::Type p_api_type); static bool make_api_assembly(APIAssembly::Type p_api_type);
static bool build_project_blocking(const String &p_config); static bool build_project_blocking(const String &p_config, const Vector<String> &p_godot_defines);
static bool editor_build_callback(); static bool editor_build_callback();

View file

@ -94,7 +94,12 @@ void GodotSharpExport::_export_begin(const Set<String> &p_features, bool p_debug
ERR_FAIL_COND(!_add_file(scripts_metadata_path, scripts_metadata_path)); ERR_FAIL_COND(!_add_file(scripts_metadata_path, scripts_metadata_path));
ERR_FAIL_COND(!GodotSharpBuilds::build_project_blocking(build_config)); // Turn export features into defines
Vector<String> godot_defines;
for (Set<String>::Element *E = p_features.front(); E; E = E->next()) {
godot_defines.push_back(E->get());
}
ERR_FAIL_COND(!GodotSharpBuilds::build_project_blocking(build_config, godot_defines));
// Add dependency assemblies // Add dependency assemblies

View file

@ -175,7 +175,10 @@ void MonoBottomPanel::_build_project_pressed() {
ERR_FAIL_COND(copy_err != OK); ERR_FAIL_COND(copy_err != OK);
} }
bool build_success = GodotSharpBuilds::get_singleton()->build_project_blocking("Tools"); Vector<String> godot_defines;
godot_defines.push_back(OS::get_singleton()->get_name());
godot_defines.push_back((sizeof(void *) == 4 ? "32" : "64"));
bool build_success = GodotSharpBuilds::get_singleton()->build_project_blocking("Tools", godot_defines);
if (build_success) { if (build_success) {
// Notify running game for hot-reload // Notify running game for hot-reload