mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-08 14:50:10 -06:00
Merge branch 'upstream-KWSys' into normalize-input-paths
# By KWSys Upstream * upstream-KWSys: KWSys 2024-11-04 (bef1f021)
This commit is contained in:
@@ -410,14 +410,6 @@ if(KWSYS_USE_DynamicLoader)
|
||||
endif()
|
||||
|
||||
if(KWSYS_USE_SystemTools)
|
||||
if (NOT DEFINED KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP)
|
||||
set(KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP 1)
|
||||
endif ()
|
||||
if (KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP)
|
||||
set(KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP 1)
|
||||
else ()
|
||||
set(KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP 0)
|
||||
endif ()
|
||||
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_SETENV
|
||||
"Checking whether CXX compiler has setenv" DIRECT)
|
||||
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_UNSETENV
|
||||
|
||||
@@ -11,9 +11,6 @@
|
||||
/* Whether <ext/stdio_filebuf.h> is available. */
|
||||
#define @KWSYS_NAMESPACE@_CXX_HAS_EXT_STDIO_FILEBUF_H \
|
||||
@KWSYS_CXX_HAS_EXT_STDIO_FILEBUF_H@
|
||||
/* Whether the translation map is available or not. */
|
||||
#define @KWSYS_NAMESPACE@_SYSTEMTOOLS_USE_TRANSLATION_MAP \
|
||||
@KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP@
|
||||
|
||||
#if defined(__SUNPRO_CC) && __SUNPRO_CC > 0x5130 && defined(__has_attribute)
|
||||
# define @KWSYS_NAMESPACE@_has_cpp_attribute(x) __has_attribute(x)
|
||||
@@ -58,8 +55,6 @@
|
||||
# define KWSYS_CXX_HAS_EXT_STDIO_FILEBUF_H \
|
||||
@KWSYS_NAMESPACE@_CXX_HAS_EXT_STDIO_FILEBUF_H
|
||||
# define KWSYS_FALLTHROUGH @KWSYS_NAMESPACE@_FALLTHROUGH
|
||||
# define KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP \
|
||||
@KWSYS_NAMESPACE@_SYSTEMTOOLS_USE_TRANSLATION_MAP
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -535,14 +535,6 @@ struct SystemToolsPathCaseEqual
|
||||
class SystemToolsStatic
|
||||
{
|
||||
public:
|
||||
using StringMap = std::map<std::string, std::string>;
|
||||
#if KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP
|
||||
/**
|
||||
* Path translation table from dir to refdir
|
||||
* Each time 'dir' will be found it will be replace by 'refdir'
|
||||
*/
|
||||
StringMap TranslationMap;
|
||||
#endif
|
||||
#ifdef _WIN32
|
||||
static std::string GetCasePathName(std::string const& pathIn,
|
||||
bool const cache);
|
||||
@@ -556,9 +548,6 @@ public:
|
||||
PathCaseMap;
|
||||
std::map<std::string, std::string> EnvMap;
|
||||
#endif
|
||||
#ifdef __CYGWIN__
|
||||
StringMap Cyg2Win32Map;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Actual implementation of ReplaceString.
|
||||
@@ -3494,72 +3483,6 @@ bool SystemTools::FindProgramPath(const char* argv0, std::string& pathOut,
|
||||
return true;
|
||||
}
|
||||
|
||||
#if KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP
|
||||
void SystemTools::AddTranslationPath(const std::string& a,
|
||||
const std::string& b)
|
||||
{
|
||||
std::string path_a = a;
|
||||
std::string path_b = b;
|
||||
SystemTools::ConvertToUnixSlashes(path_a);
|
||||
SystemTools::ConvertToUnixSlashes(path_b);
|
||||
// First check this is a directory path, since we don't want the table to
|
||||
// grow too fat
|
||||
if (SystemTools::FileIsDirectory(path_a)) {
|
||||
// Make sure the path is a full path and does not contain no '..'
|
||||
// Ken--the following code is incorrect. .. can be in a valid path
|
||||
// for example /home/martink/MyHubba...Hubba/Src
|
||||
if (SystemTools::FileIsFullPath(path_b) &&
|
||||
path_b.find("..") == std::string::npos) {
|
||||
// Before inserting make sure path ends with '/'
|
||||
if (!path_a.empty() && path_a.back() != '/') {
|
||||
path_a += '/';
|
||||
}
|
||||
if (!path_b.empty() && path_b.back() != '/') {
|
||||
path_b += '/';
|
||||
}
|
||||
if (!(path_a == path_b)) {
|
||||
SystemToolsStatics->TranslationMap.insert(
|
||||
SystemToolsStatic::StringMap::value_type(std::move(path_a),
|
||||
std::move(path_b)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SystemTools::AddKeepPath(const std::string& dir)
|
||||
{
|
||||
std::string cdir;
|
||||
Realpath(SystemTools::CollapseFullPath(dir), cdir);
|
||||
SystemTools::AddTranslationPath(cdir, dir);
|
||||
}
|
||||
|
||||
void SystemTools::CheckTranslationPath(std::string& path)
|
||||
{
|
||||
// Do not translate paths that are too short to have meaningful
|
||||
// translations.
|
||||
if (path.size() < 2) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Always add a trailing slash before translation. It does not
|
||||
// matter if this adds an extra slash, but we do not want to
|
||||
// translate part of a directory (like the foo part of foo-dir).
|
||||
path += '/';
|
||||
|
||||
// In case a file was specified we still have to go through this:
|
||||
// Now convert any path found in the table back to the one desired:
|
||||
for (auto const& pair : SystemToolsStatics->TranslationMap) {
|
||||
// We need to check of the path is a substring of the other path
|
||||
if (path.compare(0, pair.first.size(), pair.first) == 0) {
|
||||
path = path.replace(0, pair.first.size(), pair.second);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove the trailing slash we added before.
|
||||
path.pop_back();
|
||||
}
|
||||
#endif
|
||||
|
||||
static void SystemToolsAppendComponents(
|
||||
std::vector<std::string>& out_components,
|
||||
std::vector<std::string>::iterator first,
|
||||
@@ -3622,23 +3545,6 @@ std::string CollapseFullPathImpl(std::string const& in_path,
|
||||
// Transform the path back to a string.
|
||||
std::string newPath = SystemTools::JoinPath(out_components);
|
||||
|
||||
#if KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP
|
||||
// Update the translation table with this potentially new path. I am not
|
||||
// sure why this line is here, it seems really questionable, but yet I
|
||||
// would put good money that if I remove it something will break, basically
|
||||
// from what I can see it created a mapping from the collapsed path, to be
|
||||
// replaced by the input path, which almost completely does the opposite of
|
||||
// this function, the only thing preventing this from happening a lot is
|
||||
// that if the in_path has a .. in it, then it is not added to the
|
||||
// translation table. So for most calls this either does nothing due to the
|
||||
// .. or it adds a translation between identical paths as nothing was
|
||||
// collapsed, so I am going to try to comment it out, and see what hits the
|
||||
// fan, hopefully quickly.
|
||||
// Commented out line below:
|
||||
// SystemTools::AddTranslationPath(newPath, in_path);
|
||||
|
||||
SystemTools::CheckTranslationPath(newPath);
|
||||
#endif
|
||||
#ifdef _WIN32
|
||||
SystemTools::ConvertToUnixSlashes(newPath);
|
||||
#endif
|
||||
@@ -4969,51 +4875,6 @@ void SystemTools::ClassInitialize()
|
||||
|
||||
// Create statics singleton instance
|
||||
SystemToolsStatics = new SystemToolsStatic;
|
||||
|
||||
#if KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP
|
||||
// Add some special translation paths for unix. These are not added
|
||||
// for windows because drive letters need to be maintained. Also,
|
||||
// there are not sym-links and mount points on windows anyway.
|
||||
# if !defined(_WIN32) || defined(__CYGWIN__)
|
||||
// The tmp path is frequently a logical path so always keep it:
|
||||
SystemTools::AddKeepPath("/tmp/");
|
||||
|
||||
// If the current working directory is a logical path then keep the
|
||||
// logical name.
|
||||
std::string pwd_str;
|
||||
if (SystemTools::GetEnv("PWD", pwd_str)) {
|
||||
char buf[2048];
|
||||
if (const char* cwd = Getcwd(buf, 2048)) {
|
||||
// The current working directory may be a logical path. Find
|
||||
// the shortest logical path that still produces the correct
|
||||
// physical path.
|
||||
std::string cwd_changed;
|
||||
std::string pwd_changed;
|
||||
|
||||
// Test progressively shorter logical-to-physical mappings.
|
||||
std::string cwd_str = cwd;
|
||||
std::string pwd_path;
|
||||
Realpath(pwd_str, pwd_path);
|
||||
while (cwd_str == pwd_path && cwd_str != pwd_str) {
|
||||
// The current pair of paths is a working logical mapping.
|
||||
cwd_changed = cwd_str;
|
||||
pwd_changed = pwd_str;
|
||||
|
||||
// Strip off one directory level and see if the logical
|
||||
// mapping still works.
|
||||
pwd_str = SystemTools::GetFilenamePath(pwd_str);
|
||||
cwd_str = SystemTools::GetFilenamePath(cwd_str);
|
||||
Realpath(pwd_str, pwd_path);
|
||||
}
|
||||
|
||||
// Add the translation to keep the logical path name.
|
||||
if (!cwd_changed.empty() && !pwd_changed.empty()) {
|
||||
SystemTools::AddTranslationPath(cwd_changed, pwd_changed);
|
||||
}
|
||||
}
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void SystemTools::ClassFinalize()
|
||||
|
||||
@@ -985,25 +985,6 @@ public:
|
||||
*/
|
||||
static int GetTerminalWidth();
|
||||
|
||||
#if @KWSYS_NAMESPACE@_SYSTEMTOOLS_USE_TRANSLATION_MAP
|
||||
/**
|
||||
* Add an entry in the path translation table.
|
||||
*/
|
||||
static void AddTranslationPath(const std::string& dir,
|
||||
const std::string& refdir);
|
||||
|
||||
/**
|
||||
* If dir is different after CollapseFullPath is called,
|
||||
* Then insert it into the path translation table
|
||||
*/
|
||||
static void AddKeepPath(const std::string& dir);
|
||||
|
||||
/**
|
||||
* Update path by going through the Path Translation table;
|
||||
*/
|
||||
static void CheckTranslationPath(std::string& path);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Delay the execution for a specified amount of time specified
|
||||
* in milliseconds
|
||||
@@ -1053,14 +1034,7 @@ public:
|
||||
static std::string DecodeURL(const std::string& url);
|
||||
|
||||
private:
|
||||
/**
|
||||
* Allocate the stl map that serve as the Path Translation table.
|
||||
*/
|
||||
static void ClassInitialize();
|
||||
|
||||
/**
|
||||
* Deallocate the stl map that serve as the Path Translation table.
|
||||
*/
|
||||
static void ClassFinalize();
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user