Core/Scripting: Disallow the build directory to contain spaces

* I wasn't able to work arround a path which contains spaces,
  since it seems like a CMake specific issue.
* Closes #16947
This commit is contained in:
Naios
2016-04-14 20:30:31 +02:00
parent 9e43e50fa7
commit 42eeb28a8b
3 changed files with 38 additions and 19 deletions

View File

@@ -8,6 +8,21 @@
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# Returns the base path to the script directory in the source directory
function(WarnAboutSpacesInBuildPath)
# Only check win32 since unix doesn't allow spaces in paths
if (WIN32)
string(FIND "${CMAKE_BINARY_DIR}" " " SPACE_INDEX_POS)
if (SPACE_INDEX_POS GREATER -1)
message("")
message(WARNING " *** WARNING!\n"
" *** Your selected build directory contains spaces!\n"
" *** Please note that this will cause issues!")
endif()
endif()
endfunction()
# Returns the base path to the script directory in the source directory
function(GetScriptsBasePath variable)
set(${variable} "${CMAKE_SOURCE_DIR}/src/server/scripts" PARENT_SCOPE)

View File

@@ -122,6 +122,8 @@ if (BUILD_SHARED_LIBS)
message(" *** Dynamic linking was enforced through a dynamic script module!")
endif()
add_definitions(-DTRINITY_API_USE_DYNAMIC_LINKING)
WarnAboutSpacesInBuildPath()
endif()
message("")

View File

@@ -309,15 +309,6 @@ namespace std
};
}
/// Escapes spaces in the given path
static std::string EscapeWindowsPath(std::string str)
{
#ifdef _WIN32
boost::algorithm::replace_all(str, " ", "\\ ");
#endif
return str;
}
/// Invokes a synchronous CMake process with the given arguments
template<typename... T>
static int InvokeCMakeCommand(T&&... args)
@@ -518,6 +509,17 @@ public:
if (!sWorld->getBoolConfig(CONFIG_HOTSWAP_ENABLED))
return;
if (BuiltInConfig::GetBuildDirectory().find(" ") != std::string::npos)
{
TC_LOG_ERROR("scripts.hotswap", "Your build directory path \"%s\" "
"contains spaces, which isn't allowed for compatibility reasons! "
"You need to create a build directory which doesn't contain any space character "
"in it's path!",
BuiltInConfig::GetBuildDirectory().c_str());
return;
}
{
auto const library_directory = GetLibraryDirectory();
if (!fs::exists(library_directory) || !fs::is_directory(library_directory))
@@ -1116,7 +1118,7 @@ private:
TC_LOG_INFO("scripts.hotswap", "Rerunning CMake because there were sources added or removed...");
_build_job->UpdateCurrentJob(BuildJobType::BUILD_JOB_RERUN_CMAKE,
InvokeAsyncCMakeCommand(EscapeWindowsPath(BuiltInConfig::GetBuildDirectory())));
InvokeAsyncCMakeCommand(BuiltInConfig::GetBuildDirectory()));
}
/// Invokes a new build of the current active module job
@@ -1129,9 +1131,9 @@ private:
_build_job->UpdateCurrentJob(BuildJobType::BUILD_JOB_COMPILE,
InvokeAsyncCMakeCommand(
"--build", EscapeWindowsPath(BuiltInConfig::GetBuildDirectory()),
"--target", EscapeWindowsPath(_build_job->GetProjectName()),
"--config", EscapeWindowsPath(_build_job->GetBuildDirective())));
"--build", BuiltInConfig::GetBuildDirectory(),
"--target", _build_job->GetProjectName(),
"--config", _build_job->GetBuildDirective()));
}
/// Invokes a new asynchronous install of the current active module job
@@ -1144,10 +1146,10 @@ private:
_build_job->UpdateCurrentJob(BuildJobType::BUILD_JOB_INSTALL,
InvokeAsyncCMakeCommand(
"-DCOMPONENT=" + EscapeWindowsPath(_build_job->GetProjectName()),
"-DBUILD_TYPE=" + EscapeWindowsPath(_build_job->GetBuildDirective()),
"-P", EscapeWindowsPath(fs::absolute("cmake_install.cmake",
BuiltInConfig::GetBuildDirectory()).generic_string())));
"-DCOMPONENT=" + _build_job->GetProjectName(),
"-DBUILD_TYPE=" + _build_job->GetBuildDirective(),
"-P", fs::absolute("cmake_install.cmake",
BuiltInConfig::GetBuildDirectory()).generic_string()));
}
/// Sets the CMAKE_INSTALL_PREFIX variable in the CMake cache
@@ -1258,8 +1260,8 @@ private:
TC_LOG_INFO("scripts.hotswap", "Invoking CMake cache correction...");
auto const error = InvokeCMakeCommand(
"-DCMAKE_INSTALL_PREFIX:PATH=" + EscapeWindowsPath(fs::current_path().generic_string()),
EscapeWindowsPath(BuiltInConfig::GetBuildDirectory()));
"-DCMAKE_INSTALL_PREFIX:PATH=" + fs::current_path().generic_string(),
BuiltInConfig::GetBuildDirectory());
if (error)
{