|
@@ -47,7 +47,6 @@
|
|
#include "../utils/path_utils.h"
|
|
#include "../utils/path_utils.h"
|
|
#include "../utils/string_utils.h"
|
|
#include "../utils/string_utils.h"
|
|
#include "csharp_project.h"
|
|
#include "csharp_project.h"
|
|
-#include "net_solution.h"
|
|
|
|
|
|
|
|
#define CS_INDENT " " // 4 whitespaces
|
|
#define CS_INDENT " " // 4 whitespaces
|
|
|
|
|
|
@@ -401,32 +400,29 @@ void BindingsGenerator::_generate_global_constants(List<String> &p_output) {
|
|
p_output.push_back(CLOSE_BLOCK); // end of namespace
|
|
p_output.push_back(CLOSE_BLOCK); // end of namespace
|
|
}
|
|
}
|
|
|
|
|
|
-Error BindingsGenerator::generate_cs_core_project(const String &p_output_dir, bool p_verbose_output) {
|
|
|
|
|
|
+Error BindingsGenerator::generate_cs_core_project(const String &p_solution_dir, DotNetSolution &r_solution, bool p_verbose_output) {
|
|
|
|
|
|
verbose_output = p_verbose_output;
|
|
verbose_output = p_verbose_output;
|
|
|
|
|
|
|
|
+ String proj_dir = p_solution_dir.plus_file(CORE_API_ASSEMBLY_NAME);
|
|
|
|
+
|
|
DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
|
|
DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
|
|
ERR_FAIL_COND_V(!da, ERR_CANT_CREATE);
|
|
ERR_FAIL_COND_V(!da, ERR_CANT_CREATE);
|
|
|
|
|
|
- if (!DirAccess::exists(p_output_dir)) {
|
|
|
|
- Error err = da->make_dir_recursive(p_output_dir);
|
|
|
|
|
|
+ if (!DirAccess::exists(proj_dir)) {
|
|
|
|
+ Error err = da->make_dir_recursive(proj_dir);
|
|
ERR_FAIL_COND_V(err != OK, ERR_CANT_CREATE);
|
|
ERR_FAIL_COND_V(err != OK, ERR_CANT_CREATE);
|
|
}
|
|
}
|
|
|
|
|
|
- da->change_dir(p_output_dir);
|
|
|
|
|
|
+ da->change_dir(proj_dir);
|
|
da->make_dir("Core");
|
|
da->make_dir("Core");
|
|
da->make_dir("ObjectType");
|
|
da->make_dir("ObjectType");
|
|
|
|
|
|
- String core_dir = path_join(p_output_dir, "Core");
|
|
|
|
- String obj_type_dir = path_join(p_output_dir, "ObjectType");
|
|
|
|
|
|
+ String core_dir = path_join(proj_dir, "Core");
|
|
|
|
+ String obj_type_dir = path_join(proj_dir, "ObjectType");
|
|
|
|
|
|
Vector<String> compile_items;
|
|
Vector<String> compile_items;
|
|
|
|
|
|
- NETSolution solution(API_ASSEMBLY_NAME);
|
|
|
|
-
|
|
|
|
- if (!solution.set_path(p_output_dir))
|
|
|
|
- return ERR_FILE_NOT_FOUND;
|
|
|
|
-
|
|
|
|
// Generate source file for global scope constants and enums
|
|
// Generate source file for global scope constants and enums
|
|
{
|
|
{
|
|
List<String> constants_source;
|
|
List<String> constants_source;
|
|
@@ -530,15 +526,15 @@ Error BindingsGenerator::generate_cs_core_project(const String &p_output_dir, bo
|
|
|
|
|
|
compile_items.push_back(internal_methods_file);
|
|
compile_items.push_back(internal_methods_file);
|
|
|
|
|
|
- String guid = CSharpProject::generate_core_api_project(p_output_dir, compile_items);
|
|
|
|
|
|
+ String guid = CSharpProject::generate_core_api_project(proj_dir, compile_items);
|
|
|
|
|
|
- solution.add_new_project(API_ASSEMBLY_NAME, guid);
|
|
|
|
|
|
+ DotNetSolution::ProjectInfo proj_info;
|
|
|
|
+ proj_info.guid = guid;
|
|
|
|
+ proj_info.relpath = String(CORE_API_ASSEMBLY_NAME).plus_file(CORE_API_ASSEMBLY_NAME ".csproj");
|
|
|
|
+ proj_info.configs.push_back("Debug");
|
|
|
|
+ proj_info.configs.push_back("Release");
|
|
|
|
|
|
- Error sln_error = solution.save();
|
|
|
|
- if (sln_error != OK) {
|
|
|
|
- ERR_PRINT("Could not to save .NET solution.");
|
|
|
|
- return sln_error;
|
|
|
|
- }
|
|
|
|
|
|
+ r_solution.add_new_project(CORE_API_ASSEMBLY_NAME, proj_info);
|
|
|
|
|
|
if (verbose_output)
|
|
if (verbose_output)
|
|
OS::get_singleton()->print("The solution and C# project for the Core API was generated successfully\n");
|
|
OS::get_singleton()->print("The solution and C# project for the Core API was generated successfully\n");
|
|
@@ -546,32 +542,29 @@ Error BindingsGenerator::generate_cs_core_project(const String &p_output_dir, bo
|
|
return OK;
|
|
return OK;
|
|
}
|
|
}
|
|
|
|
|
|
-Error BindingsGenerator::generate_cs_editor_project(const String &p_output_dir, const String &p_core_dll_path, bool p_verbose_output) {
|
|
|
|
|
|
+Error BindingsGenerator::generate_cs_editor_project(const String &p_solution_dir, DotNetSolution &r_solution, bool p_verbose_output) {
|
|
|
|
|
|
verbose_output = p_verbose_output;
|
|
verbose_output = p_verbose_output;
|
|
|
|
|
|
|
|
+ String proj_dir = p_solution_dir.plus_file(EDITOR_API_ASSEMBLY_NAME);
|
|
|
|
+
|
|
DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
|
|
DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
|
|
ERR_FAIL_COND_V(!da, ERR_CANT_CREATE);
|
|
ERR_FAIL_COND_V(!da, ERR_CANT_CREATE);
|
|
|
|
|
|
- if (!DirAccess::exists(p_output_dir)) {
|
|
|
|
- Error err = da->make_dir_recursive(p_output_dir);
|
|
|
|
|
|
+ if (!DirAccess::exists(proj_dir)) {
|
|
|
|
+ Error err = da->make_dir_recursive(proj_dir);
|
|
ERR_FAIL_COND_V(err != OK, ERR_CANT_CREATE);
|
|
ERR_FAIL_COND_V(err != OK, ERR_CANT_CREATE);
|
|
}
|
|
}
|
|
|
|
|
|
- da->change_dir(p_output_dir);
|
|
|
|
|
|
+ da->change_dir(proj_dir);
|
|
da->make_dir("Core");
|
|
da->make_dir("Core");
|
|
da->make_dir("ObjectType");
|
|
da->make_dir("ObjectType");
|
|
|
|
|
|
- String core_dir = path_join(p_output_dir, "Core");
|
|
|
|
- String obj_type_dir = path_join(p_output_dir, "ObjectType");
|
|
|
|
|
|
+ String core_dir = path_join(proj_dir, "Core");
|
|
|
|
+ String obj_type_dir = path_join(proj_dir, "ObjectType");
|
|
|
|
|
|
Vector<String> compile_items;
|
|
Vector<String> compile_items;
|
|
|
|
|
|
- NETSolution solution(EDITOR_API_ASSEMBLY_NAME);
|
|
|
|
-
|
|
|
|
- if (!solution.set_path(p_output_dir))
|
|
|
|
- return ERR_FILE_NOT_FOUND;
|
|
|
|
-
|
|
|
|
for (OrderedHashMap<StringName, TypeInterface>::Element E = obj_types.front(); E; E = E.next()) {
|
|
for (OrderedHashMap<StringName, TypeInterface>::Element E = obj_types.front(); E; E = E.next()) {
|
|
const TypeInterface &itype = E.get();
|
|
const TypeInterface &itype = E.get();
|
|
|
|
|
|
@@ -632,19 +625,57 @@ Error BindingsGenerator::generate_cs_editor_project(const String &p_output_dir,
|
|
|
|
|
|
compile_items.push_back(internal_methods_file);
|
|
compile_items.push_back(internal_methods_file);
|
|
|
|
|
|
- String guid = CSharpProject::generate_editor_api_project(p_output_dir, p_core_dll_path, compile_items);
|
|
|
|
|
|
+ String guid = CSharpProject::generate_editor_api_project(proj_dir, "../" CORE_API_ASSEMBLY_NAME "/" CORE_API_ASSEMBLY_NAME ".csproj", compile_items);
|
|
|
|
+
|
|
|
|
+ DotNetSolution::ProjectInfo proj_info;
|
|
|
|
+ proj_info.guid = guid;
|
|
|
|
+ proj_info.relpath = String(EDITOR_API_ASSEMBLY_NAME).plus_file(EDITOR_API_ASSEMBLY_NAME ".csproj");
|
|
|
|
+ proj_info.configs.push_back("Debug");
|
|
|
|
+ proj_info.configs.push_back("Release");
|
|
|
|
+
|
|
|
|
+ r_solution.add_new_project(EDITOR_API_ASSEMBLY_NAME, proj_info);
|
|
|
|
+
|
|
|
|
+ if (verbose_output)
|
|
|
|
+ OS::get_singleton()->print("The solution and C# project for the Editor API was generated successfully\n");
|
|
|
|
+
|
|
|
|
+ return OK;
|
|
|
|
+}
|
|
|
|
|
|
- solution.add_new_project(EDITOR_API_ASSEMBLY_NAME, guid);
|
|
|
|
|
|
+Error BindingsGenerator::generate_cs_api(const String &p_output_dir, bool p_verbose_output) {
|
|
|
|
+
|
|
|
|
+ DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
|
|
|
|
+ ERR_FAIL_COND_V(!da, ERR_CANT_CREATE);
|
|
|
|
+
|
|
|
|
+ if (!DirAccess::exists(p_output_dir)) {
|
|
|
|
+ Error err = da->make_dir_recursive(p_output_dir);
|
|
|
|
+ ERR_FAIL_COND_V(err != OK, ERR_CANT_CREATE);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ DotNetSolution solution(API_SOLUTION_NAME);
|
|
|
|
+
|
|
|
|
+ if (!solution.set_path(p_output_dir))
|
|
|
|
+ return ERR_FILE_NOT_FOUND;
|
|
|
|
+
|
|
|
|
+ Error proj_err;
|
|
|
|
+
|
|
|
|
+ proj_err = generate_cs_core_project(p_output_dir, solution, p_verbose_output);
|
|
|
|
+ if (proj_err != OK) {
|
|
|
|
+ ERR_PRINT("Generation of the Core API C# project failed");
|
|
|
|
+ return proj_err;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ proj_err = generate_cs_editor_project(p_output_dir, solution, p_verbose_output);
|
|
|
|
+ if (proj_err != OK) {
|
|
|
|
+ ERR_PRINT("Generation of the Editor API C# project failed");
|
|
|
|
+ return proj_err;
|
|
|
|
+ }
|
|
|
|
|
|
Error sln_error = solution.save();
|
|
Error sln_error = solution.save();
|
|
if (sln_error != OK) {
|
|
if (sln_error != OK) {
|
|
- ERR_PRINT("Could not to save .NET solution.");
|
|
|
|
|
|
+ ERR_PRINT("Failed to save API solution");
|
|
return sln_error;
|
|
return sln_error;
|
|
}
|
|
}
|
|
|
|
|
|
- if (verbose_output)
|
|
|
|
- OS::get_singleton()->print("The solution and C# project for the Editor API was generated successfully\n");
|
|
|
|
-
|
|
|
|
return OK;
|
|
return OK;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2368,12 +2399,11 @@ void BindingsGenerator::initialize() {
|
|
|
|
|
|
void BindingsGenerator::handle_cmdline_args(const List<String> &p_cmdline_args) {
|
|
void BindingsGenerator::handle_cmdline_args(const List<String> &p_cmdline_args) {
|
|
|
|
|
|
- const int NUM_OPTIONS = 3;
|
|
|
|
|
|
+ const int NUM_OPTIONS = 2;
|
|
int options_left = NUM_OPTIONS;
|
|
int options_left = NUM_OPTIONS;
|
|
|
|
|
|
String mono_glue_option = "--generate-mono-glue";
|
|
String mono_glue_option = "--generate-mono-glue";
|
|
- String cs_core_api_option = "--generate-cs-core-api";
|
|
|
|
- String cs_editor_api_option = "--generate-cs-editor-api";
|
|
|
|
|
|
+ String cs_api_option = "--generate-cs-api";
|
|
|
|
|
|
verbose_output = true;
|
|
verbose_output = true;
|
|
|
|
|
|
@@ -2387,42 +2417,24 @@ void BindingsGenerator::handle_cmdline_args(const List<String> &p_cmdline_args)
|
|
|
|
|
|
if (path_elem) {
|
|
if (path_elem) {
|
|
if (get_singleton()->generate_glue(path_elem->get()) != OK)
|
|
if (get_singleton()->generate_glue(path_elem->get()) != OK)
|
|
- ERR_PRINT("Mono glue generation failed");
|
|
|
|
|
|
+ ERR_PRINTS(mono_glue_option + ": Failed to generate mono glue");
|
|
elem = elem->next();
|
|
elem = elem->next();
|
|
} else {
|
|
} else {
|
|
- ERR_PRINTS("--generate-mono-glue: No output directory specified");
|
|
|
|
|
|
+ ERR_PRINTS(mono_glue_option + ": No output directory specified");
|
|
}
|
|
}
|
|
|
|
|
|
--options_left;
|
|
--options_left;
|
|
|
|
|
|
- } else if (elem->get() == cs_core_api_option) {
|
|
|
|
|
|
+ } else if (elem->get() == cs_api_option) {
|
|
|
|
|
|
const List<String>::Element *path_elem = elem->next();
|
|
const List<String>::Element *path_elem = elem->next();
|
|
|
|
|
|
if (path_elem) {
|
|
if (path_elem) {
|
|
- if (get_singleton()->generate_cs_core_project(path_elem->get()) != OK)
|
|
|
|
- ERR_PRINT("Generation of solution and C# project for the Core API failed");
|
|
|
|
|
|
+ if (get_singleton()->generate_cs_api(path_elem->get()) != OK)
|
|
|
|
+ ERR_PRINTS(cs_api_option + ": Failed to generate the C# API");
|
|
elem = elem->next();
|
|
elem = elem->next();
|
|
} else {
|
|
} else {
|
|
- ERR_PRINTS(cs_core_api_option + ": No output directory specified");
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- --options_left;
|
|
|
|
-
|
|
|
|
- } else if (elem->get() == cs_editor_api_option) {
|
|
|
|
-
|
|
|
|
- const List<String>::Element *path_elem = elem->next();
|
|
|
|
-
|
|
|
|
- if (path_elem) {
|
|
|
|
- if (path_elem->next()) {
|
|
|
|
- if (get_singleton()->generate_cs_editor_project(path_elem->get(), path_elem->next()->get()) != OK)
|
|
|
|
- ERR_PRINT("Generation of solution and C# project for the Editor API failed");
|
|
|
|
- elem = path_elem->next();
|
|
|
|
- } else {
|
|
|
|
- ERR_PRINTS(cs_editor_api_option + ": No hint path for the Core API dll specified");
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- ERR_PRINTS(cs_editor_api_option + ": No output directory specified");
|
|
|
|
|
|
+ ERR_PRINTS(cs_api_option + ": No output directory specified");
|
|
}
|
|
}
|
|
|
|
|
|
--options_left;
|
|
--options_left;
|
|
@@ -2434,7 +2446,7 @@ void BindingsGenerator::handle_cmdline_args(const List<String> &p_cmdline_args)
|
|
verbose_output = false;
|
|
verbose_output = false;
|
|
|
|
|
|
if (options_left != NUM_OPTIONS)
|
|
if (options_left != NUM_OPTIONS)
|
|
- exit(0);
|
|
|
|
|
|
+ ::exit(0);
|
|
}
|
|
}
|
|
|
|
|
|
#endif
|
|
#endif
|