summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2017-09-27 11:10:46 (GMT)
committerKitware Robot <kwrobot@kitware.com>2017-09-27 11:11:07 (GMT)
commit09350f19e073e33ea698ecb3bc45bb0a22d62a25 (patch)
tree1fdc9766f559759bc54fd490ca69e6fd5c0f5e22
parentf4517a4767560d7822885443434eb185612a6817 (diff)
parenta7005c985d2ed22f1192864a358eb89e2c1b63f7 (diff)
downloadCMake-09350f19e073e33ea698ecb3bc45bb0a22d62a25.zip
CMake-09350f19e073e33ea698ecb3bc45bb0a22d62a25.tar.gz
CMake-09350f19e073e33ea698ecb3bc45bb0a22d62a25.tar.bz2
Merge topic 'revert-perf-source-lookup'
a7005c98 Tests: Add case for legacy source file property behavior 1604716d Revert "Performance: Improve efficiency of source file lookup in cmMakefile" Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !1308
-rw-r--r--Source/cmMakefile.cxx50
-rw-r--r--Source/cmMakefile.h11
-rw-r--r--Tests/RunCMake/get_property/source_properties-stderr.txt8
-rw-r--r--Tests/RunCMake/get_property/source_properties.cmake10
4 files changed, 20 insertions, 59 deletions
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index c96b892..e51cfcc 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -3082,18 +3082,9 @@ void cmMakefile::SetArgcArgv(const std::vector<std::string>& args)
cmSourceFile* cmMakefile::GetSource(const std::string& sourceName) const
{
cmSourceFileLocation sfl(this, sourceName);
-
-#if defined(_WIN32) || defined(__APPLE__)
- const auto& name = cmSystemTools::LowerCase(sfl.GetName());
-#else
- const auto& name = sfl.GetName();
-#endif
- auto sfsi = this->SourceFileSearchIndex.find(name);
- if (sfsi != this->SourceFileSearchIndex.end()) {
- for (auto sf : sfsi->second) {
- if (sf->Matches(sfl)) {
- return sf;
- }
+ for (cmSourceFile* sf : this->SourceFiles) {
+ if (sf->Matches(sfl)) {
+ return sf;
}
}
return nullptr;
@@ -3107,41 +3098,6 @@ cmSourceFile* cmMakefile::CreateSource(const std::string& sourceName,
sf->SetProperty("GENERATED", "1");
}
this->SourceFiles.push_back(sf);
-
- auto name = sf->GetLocation().GetName();
-#if defined(_WIN32) || defined(__APPLE__)
- name = cmSystemTools::LowerCase(name);
-#endif
-
- // For a file in the form "a.b.c" add the cmSourceFile to the index
- // at "a.b.c", "a.b" and "a".
- auto partial = name;
- while (true) {
- this->SourceFileSearchIndex[partial].insert(sf);
- auto i = partial.rfind('.');
- if (i == std::string::npos) {
- break;
- }
- partial = partial.substr(0, i);
- }
-
- if (sf->GetLocation().ExtensionIsAmbiguous()) {
- // For an ambiguous extension also add the various "known"
- // extensions to the original filename.
-
- const auto& srcExts = this->GetCMakeInstance()->GetSourceExtensions();
- for (const auto& ext : srcExts) {
- auto name_ext = name + "." + cmSystemTools::LowerCase(ext);
- this->SourceFileSearchIndex[name_ext].insert(sf);
- }
-
- const auto& hdrExts = this->GetCMakeInstance()->GetHeaderExtensions();
- for (const auto& ext : hdrExts) {
- auto name_ext = name + "." + cmSystemTools::LowerCase(ext);
- this->SourceFileSearchIndex[name_ext].insert(sf);
- }
- }
-
return sf;
}
diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h
index 2cae659..272522c 100644
--- a/Source/cmMakefile.h
+++ b/Source/cmMakefile.h
@@ -13,7 +13,6 @@
#include <stddef.h>
#include <string>
#include <unordered_map>
-#include <unordered_set>
#include <vector>
#include "cmAlgorithms.h"
@@ -809,17 +808,7 @@ protected:
// libraries, classes, and executables
mutable cmTargets Targets;
std::map<std::string, std::string> AliasTargets;
-
std::vector<cmSourceFile*> SourceFiles;
- // Because cmSourceFile names are compared in a fuzzy way (see
- // cmSourceFileLocation::Match()) we can't have a straight mapping from
- // filename to cmSourceFile. To make lookups more efficient we store the
- // Name portion of the cmSourceFileLocation and then compare on the list of
- // cmSourceFiles that might match that name. Note that on platforms which
- // have a case-insensitive filesystem we store the key in all lowercase.
- typedef std::unordered_set<cmSourceFile*> SourceFileSet;
- typedef std::unordered_map<std::string, SourceFileSet> SourceFileMap;
- SourceFileMap SourceFileSearchIndex;
// Tests
std::map<std::string, cmTest*> Tests;
diff --git a/Tests/RunCMake/get_property/source_properties-stderr.txt b/Tests/RunCMake/get_property/source_properties-stderr.txt
index 0a46f96..00a9b82 100644
--- a/Tests/RunCMake/get_property/source_properties-stderr.txt
+++ b/Tests/RunCMake/get_property/source_properties-stderr.txt
@@ -3,4 +3,10 @@ get_property: --><--
get_source_file_property: -->value<--
get_property: -->value<--
get_source_file_property: -->NOTFOUND<--
-get_property: --><--$
+get_property: --><--
+get_source_file_property: -->value<--
+get_property: -->value<--
+get_source_file_property: -->NOTFOUND<--
+get_property: --><--
+get_source_file_property: -->value<--
+get_property: -->value<--$
diff --git a/Tests/RunCMake/get_property/source_properties.cmake b/Tests/RunCMake/get_property/source_properties.cmake
index 263ffe1..12d2d07 100644
--- a/Tests/RunCMake/get_property/source_properties.cmake
+++ b/Tests/RunCMake/get_property/source_properties.cmake
@@ -13,3 +13,13 @@ set_source_files_properties(file.c PROPERTIES empty "" custom value)
check_source_file_property(file.c empty)
check_source_file_property(file.c custom)
check_source_file_property(file.c noexist)
+
+# Test strange legacy behavior in which the order in which source files are
+# first accessed affects how properties are applied without an extension.
+# See also issue #15208.
+get_property(lang SOURCE ${CMAKE_CURRENT_BINARY_DIR}/file2.c PROPERTY LANGUAGE)
+get_property(lang SOURCE ${CMAKE_CURRENT_BINARY_DIR}/file2.h PROPERTY LANGUAGE)
+set_property(SOURCE file2 PROPERTY custom value) # set property without extension
+check_source_file_property(file2 custom) # should have property
+check_source_file_property(file2.h custom) # should not have property
+check_source_file_property(file2.c custom) # should have property