BuildWindows.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. //
  2. // Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
  3. // LICENSE: Atomic Game Engine Editor and Tools EULA
  4. // Please see LICENSE_ATOMIC_EDITOR_AND_TOOLS.md in repository root for
  5. // license information: https://github.com/AtomicGameEngine/AtomicGameEngine
  6. //
  7. #include <Atomic/Core/StringUtils.h>
  8. #include <Atomic/IO/FileSystem.h>
  9. #include <Atomic/Resource/ResourceCache.h>
  10. #include "../ToolSystem.h"
  11. #include "../ToolEnvironment.h"
  12. #include "../Project/Project.h"
  13. #include "BuildWindows.h"
  14. #include "BuildSystem.h"
  15. #include "BuildEvents.h"
  16. namespace ToolCore
  17. {
  18. BuildWindows::BuildWindows(Context * context, Project *project) : BuildBase(context, project, PLATFORMID_WINDOWS)
  19. {
  20. }
  21. BuildWindows::~BuildWindows()
  22. {
  23. }
  24. void BuildWindows::Initialize()
  25. {
  26. ToolSystem* tsystem = GetSubsystem<ToolSystem>();
  27. Project* project = tsystem->GetProject();
  28. Vector<String> defaultResourcePaths;
  29. GetDefaultResourcePaths(defaultResourcePaths);
  30. String projectResources = project->GetResourcePath();
  31. for (unsigned i = 0; i < defaultResourcePaths.Size(); i++)
  32. {
  33. AddResourceDir(defaultResourcePaths[i]);
  34. }
  35. // TODO: smart filtering of cache
  36. AddResourceDir(project->GetProjectPath() + "Cache/");
  37. AddResourceDir(projectResources);
  38. BuildResourceEntries();
  39. }
  40. void BuildWindows::BuildAtomicNET()
  41. {
  42. // AtomicNET
  43. FileSystem* fileSystem = GetSubsystem<FileSystem>();
  44. ToolEnvironment* tenv = GetSubsystem<ToolEnvironment>();
  45. ToolSystem* tsystem = GetSubsystem<ToolSystem>();
  46. Project* project = tsystem->GetProject();
  47. String projectResources = project->GetResourcePath();
  48. String assembliesPath = projectResources + "Assemblies/";
  49. // if no assemblies path, no need to install AtomicNET
  50. if (!fileSystem->DirExists(assembliesPath))
  51. return;
  52. Vector<String> results;
  53. fileSystem->ScanDir(results, assembliesPath, "*.dll", SCAN_FILES, true);
  54. // if no assembiles in Assemblies path, no need to install AtomicNET
  55. if (!results.Size())
  56. return;
  57. fileSystem->CreateDir(buildPath_ + "/AtomicPlayer_Resources/AtomicNET");
  58. fileSystem->CreateDir(buildPath_ + "/AtomicPlayer_Resources/AtomicNET/Atomic");
  59. fileSystem->CreateDir(buildPath_ + "/AtomicPlayer_Resources/AtomicNET/Atomic/Assemblies");
  60. fileSystem->CopyDir(tenv->GetNETCoreCLRAbsPath(), buildPath_ + "/AtomicPlayer_Resources/AtomicNET/CoreCLR");
  61. fileSystem->CopyDir(tenv->GetNETTPAPaths(), buildPath_ + "/AtomicPlayer_Resources/AtomicNET/Atomic/TPA");
  62. // Atomic Assemblies
  63. const String& assemblyLoadPaths = tenv->GetNETAssemblyLoadPaths();
  64. Vector<String> paths = assemblyLoadPaths.Split(';');
  65. for (unsigned i = 0; i < paths.Size(); i++)
  66. {
  67. Vector<String> loadResults;
  68. fileSystem->ScanDir(loadResults, paths[i], "*.dll", SCAN_FILES, true);
  69. for (unsigned j = 0; j < loadResults.Size(); j++)
  70. {
  71. String pathName, fileName, ext;
  72. SplitPath(loadResults[j], pathName, fileName, ext);
  73. if (fileName != "AtomicNETEngine")
  74. continue;
  75. fileSystem->Copy(paths[i] + "/" + loadResults[j], ToString("%s/AtomicPlayer_Resources/AtomicNET/Atomic/Assemblies/%s.dll", buildPath_.CString(), fileName.CString()));
  76. }
  77. }
  78. // Project assemblied
  79. for (unsigned i = 0; i < results.Size(); i++)
  80. {
  81. String pathName, fileName, ext;
  82. SplitPath(results[i], pathName, fileName, ext);
  83. fileSystem->Copy(assembliesPath + results[i], ToString("%s/AtomicPlayer_Resources/AtomicNET/Atomic/Assemblies/%s.dll", buildPath_.CString(), fileName.CString()));
  84. }
  85. }
  86. void BuildWindows::Build(const String& buildPath)
  87. {
  88. ToolEnvironment* tenv = GetSubsystem<ToolEnvironment>();
  89. buildPath_ = AddTrailingSlash(buildPath) + GetBuildSubfolder();
  90. VariantMap buildOutput;
  91. buildOutput[BuildOutput::P_TEXT] = "\n\n<color #D4FB79>Starting Windows Deployment</color>\n\n";
  92. SendEvent(E_BUILDOUTPUT, buildOutput);
  93. Initialize();
  94. BuildSystem* buildSystem = GetSubsystem<BuildSystem>();
  95. FileSystem* fileSystem = GetSubsystem<FileSystem>();
  96. if (fileSystem->DirExists(buildPath_))
  97. fileSystem->RemoveDir(buildPath_, true);
  98. String rootSourceDir = tenv->GetRootSourceDir();
  99. String playerBinary = tenv->GetPlayerBinary();
  100. String d3d9dll = GetPath(playerBinary) + "/D3DCompiler_47.dll";
  101. fileSystem->CreateDir(buildPath_);
  102. fileSystem->CreateDir(buildPath_ + "/AtomicPlayer_Resources");
  103. String resourcePackagePath = buildPath_ + "/AtomicPlayer_Resources/AtomicResources" + PAK_EXTENSION;
  104. GenerateResourcePackage(resourcePackagePath);
  105. fileSystem->Copy(playerBinary, buildPath_ + "/AtomicPlayer.exe");
  106. fileSystem->Copy(d3d9dll, buildPath_ + "/D3DCompiler_47.dll");
  107. buildOutput[BuildOutput::P_TEXT] = "\n\n<color #D4FB79>Building AtomicNET</color>\n\n";
  108. SendEvent(E_BUILDOUTPUT, buildOutput);
  109. BuildAtomicNET();
  110. buildOutput[BuildOutput::P_TEXT] = "\n\n<color #D4FB79>Building AtomicNET Complete</color>\n\n";
  111. SendEvent(E_BUILDOUTPUT, buildOutput);
  112. buildOutput[BuildOutput::P_TEXT] = "\n\n<color #D4FB79>Windows Deployment Complete</color>\n\n";
  113. SendEvent(E_BUILDOUTPUT, buildOutput);
  114. buildSystem->BuildComplete(PLATFORMID_WINDOWS, buildPath_);
  115. }
  116. }