diff options
author | Brad King <brad.king@kitware.com> | 2017-09-27 11:10:46 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2017-09-27 11:11:07 (GMT) |
commit | 09350f19e073e33ea698ecb3bc45bb0a22d62a25 (patch) | |
tree | 1fdc9766f559759bc54fd490ca69e6fd5c0f5e22 | |
parent | f4517a4767560d7822885443434eb185612a6817 (diff) | |
parent | a7005c985d2ed22f1192864a358eb89e2c1b63f7 (diff) | |
download | CMake-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.cxx | 50 | ||||
-rw-r--r-- | Source/cmMakefile.h | 11 | ||||
-rw-r--r-- | Tests/RunCMake/get_property/source_properties-stderr.txt | 8 | ||||
-rw-r--r-- | Tests/RunCMake/get_property/source_properties.cmake | 10 |
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 |