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:
Brad King 2012-06-13 08:42:39 -04:00
parent d17c58c853
commit a41557a2c8
1 changed files with 4 additions and 2 deletions

View File

@ -1003,7 +1003,9 @@ protected:
// Match rules are case-insensitive on some platforms. // Match rules are case-insensitive on some platforms.
#if defined(_WIN32) || defined(__APPLE__) || defined(__CYGWIN__) #if defined(_WIN32) || defined(__APPLE__) || defined(__CYGWIN__)
std::string lower = cmSystemTools::LowerCase(file); 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 #endif
// Collect properties from all matching rules. // Collect properties from all matching rules.
@ -1012,7 +1014,7 @@ protected:
for(std::vector<MatchRule>::iterator mr = this->MatchRules.begin(); for(std::vector<MatchRule>::iterator mr = this->MatchRules.begin();
mr != this->MatchRules.end(); ++mr) mr != this->MatchRules.end(); ++mr)
{ {
if(mr->Regex.find(file)) if(mr->Regex.find(file_to_match))
{ {
matched = true; matched = true;
result.Exclude |= mr->Properties.Exclude; result.Exclude |= mr->Properties.Exclude;