install: Fix FILES_MATCHING on case-sensitive Mac filesystems (#13177)
Windows and Apple machines have predominantly used case-insensitive filesystems so our file(INSTALL) command uses case-insensitive pattern matching. It is implemented by converting the pattern and file path to lower case before matching. The FILES_MATCHING option is implemented by excluding a path that does not match any pattern unless it is a directory that must be searched recursively. However, the test that an excluded path is a directory is executed on the lower-case path and therefore fails on mixed-case input paths on case-sensitive filesystems. Fix the file(INSTALL) implementation to use the lower-case path only for pattern matching and preserve the original path for tests against the real filesystem.
This commit is contained in:
parent
d17c58c853
commit
a41557a2c8
|
@ -1003,7 +1003,9 @@ protected:
|
|||
// Match rules are case-insensitive on some platforms.
|
||||
#if defined(_WIN32) || defined(__APPLE__) || defined(__CYGWIN__)
|
||||
std::string lower = cmSystemTools::LowerCase(file);
|
||||
file = lower.c_str();
|
||||
const char* file_to_match = lower.c_str();
|
||||
#else
|
||||
const char* file_to_match = file;
|
||||
#endif
|
||||
|
||||
// Collect properties from all matching rules.
|
||||
|
@ -1012,7 +1014,7 @@ protected:
|
|||
for(std::vector<MatchRule>::iterator mr = this->MatchRules.begin();
|
||||
mr != this->MatchRules.end(); ++mr)
|
||||
{
|
||||
if(mr->Regex.find(file))
|
||||
if(mr->Regex.find(file_to_match))
|
||||
{
|
||||
matched = true;
|
||||
result.Exclude |= mr->Properties.Exclude;
|
||||
|
|
Loading…
Reference in New Issue