diff options
author | Brad King <brad.king@kitware.com> | 2022-03-04 14:09:26 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2022-03-04 14:09:31 (GMT) |
commit | 65da32c924e97ad1e0e0ed0ea59644f87f770c34 (patch) | |
tree | a4d16152d59b4e08fb0d97b1bb88b0ba3c8f294a | |
parent | 31743aaf5d131b326fc05d07632cdb2844f26121 (diff) | |
parent | b357d334fc0c2f47ebc6a3a2b0ceba25d4818bb0 (diff) | |
download | CMake-65da32c924e97ad1e0e0ed0ea59644f87f770c34.zip CMake-65da32c924e97ad1e0e0ed0ea59644f87f770c34.tar.gz CMake-65da32c924e97ad1e0e0ed0ea59644f87f770c34.tar.bz2 |
Merge topic 'file-set-name-requirements' into release-3.23
b357d334fc target_sources(): Enforce stricter requirements for FILE_SET name
Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Merge-request: !7037
-rw-r--r-- | Help/command/target_sources.rst | 3 | ||||
-rw-r--r-- | Source/cmFileSet.cxx | 10 | ||||
-rw-r--r-- | Source/cmFileSet.h | 2 | ||||
-rw-r--r-- | Source/cmTargetSourcesCommand.cxx | 7 | ||||
-rw-r--r-- | Tests/RunCMake/target_sources/FileSetBadName-result.txt | 1 | ||||
-rw-r--r-- | Tests/RunCMake/target_sources/FileSetBadName-stderr.txt | 6 | ||||
-rw-r--r-- | Tests/RunCMake/target_sources/FileSetBadName.cmake | 4 | ||||
-rw-r--r-- | Tests/RunCMake/target_sources/RunCMakeTest.cmake | 1 |
8 files changed, 30 insertions, 4 deletions
diff --git a/Help/command/target_sources.rst b/Help/command/target_sources.rst index 234f5be..3f8fdd9 100644 --- a/Help/command/target_sources.rst +++ b/Help/command/target_sources.rst @@ -92,7 +92,8 @@ Each ``target_sources(FILE_SET)`` entry starts with ``INTERFACE``, ``PUBLIC``, o ``FILE_SET <set>`` A string representing the name of the file set to create or add to. This must - not start with a capital letter, unless its name is ``HEADERS``. + contain only numbers, letters, and underscores, and must not start with a + capital letter or underscore, unless its name is ``HEADERS``. ``TYPE <type>`` diff --git a/Source/cmFileSet.cxx b/Source/cmFileSet.cxx index 08d56ba..2c06dc6 100644 --- a/Source/cmFileSet.cxx +++ b/Source/cmFileSet.cxx @@ -7,6 +7,8 @@ #include <utility> #include <vector> +#include "cmsys/RegularExpression.hxx" + #include "cmGeneratorExpression.h" #include "cmListFileCache.h" #include "cmLocalGenerator.h" @@ -149,3 +151,11 @@ void cmFileSet::EvaluateFileEntry( filesPerDir[relDir].push_back(file); } } + +bool cmFileSet::IsValidName(const std::string& name) +{ + static const cmsys::RegularExpression regex("^[a-z0-9][a-zA-Z0-9_]*$"); + + cmsys::RegularExpressionMatch match; + return regex.find(name.c_str(), match); +} diff --git a/Source/cmFileSet.h b/Source/cmFileSet.h index 5ee4a98..3aad75f 100644 --- a/Source/cmFileSet.h +++ b/Source/cmFileSet.h @@ -56,6 +56,8 @@ public: const cmGeneratorTarget* target, cmGeneratorExpressionDAGChecker* dagChecker = nullptr) const; + static bool IsValidName(const std::string& name); + private: std::string Name; std::string Type; diff --git a/Source/cmTargetSourcesCommand.cxx b/Source/cmTargetSourcesCommand.cxx index 17af789..43a9b3a 100644 --- a/Source/cmTargetSourcesCommand.cxx +++ b/Source/cmTargetSourcesCommand.cxx @@ -238,9 +238,10 @@ bool TargetSourcesImpl::HandleOneFileSet( auto fileSet = this->Target->GetOrCreateFileSet(args.FileSet, type); if (fileSet.second) { if (!isDefault) { - if (args.FileSet[0] >= 'A' && args.FileSet[0] <= 'Z') { - this->SetError( - "Non-default file set name must not start with a capital letter"); + if (!cmFileSet::IsValidName(args.FileSet)) { + this->SetError("Non-default file set name must contain only letters, " + "numbers, and underscores, and must not start with a " + "capital letter or underscore"); return false; } } diff --git a/Tests/RunCMake/target_sources/FileSetBadName-result.txt b/Tests/RunCMake/target_sources/FileSetBadName-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/target_sources/FileSetBadName-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/target_sources/FileSetBadName-stderr.txt b/Tests/RunCMake/target_sources/FileSetBadName-stderr.txt new file mode 100644 index 0000000..a0b8054 --- /dev/null +++ b/Tests/RunCMake/target_sources/FileSetBadName-stderr.txt @@ -0,0 +1,6 @@ +^CMake Error at FileSetBadName\.cmake:[0-9]+ \(target_sources\): + target_sources Non-default file set name must contain only letters, + numbers, and underscores, and must not start with a capital letter or + underscore +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/target_sources/FileSetBadName.cmake b/Tests/RunCMake/target_sources/FileSetBadName.cmake new file mode 100644 index 0000000..325843f --- /dev/null +++ b/Tests/RunCMake/target_sources/FileSetBadName.cmake @@ -0,0 +1,4 @@ +enable_language(C) + +add_library(lib1 STATIC empty.c) +target_sources(lib1 INTERFACE FILE_SET a+ TYPE HEADERS) diff --git a/Tests/RunCMake/target_sources/RunCMakeTest.cmake b/Tests/RunCMake/target_sources/RunCMakeTest.cmake index da9944d..d23bce1 100644 --- a/Tests/RunCMake/target_sources/RunCMakeTest.cmake +++ b/Tests/RunCMake/target_sources/RunCMakeTest.cmake @@ -39,6 +39,7 @@ run_cmake(FileSetNoExistInterface) run_cmake(FileSetNoExistInstall) run_cmake(FileSetDirectories) run_cmake(FileSetCustomTarget) +run_cmake(FileSetBadName) set(RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0115=NEW) run_cmake(FileSetFileNoExist) |