1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-20 04:24:36 +08:00

source_group: Restore TREE support for relative paths

The fix in commit v3.8.1~4^2 (source_group: Fix TREE with root that is
not current source dir, 2017-04-20) accidentally broke support for
specifying paths relative to the source directory.  Fix it and add a
test covering the case.

While at it, fix a typo in a variable name.

Fixes: #16876
This commit is contained in:
Mateusz Janek
2017-05-15 22:01:10 +02:00
committed by Brad King
parent 8bd6af0d63
commit 4716f2be83
6 changed files with 39 additions and 23 deletions

View File

@@ -2,8 +2,6 @@
file Copyright.txt or https://cmake.org/licensing for details. */ file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmSourceGroupCommand.h" #include "cmSourceGroupCommand.h"
#include <algorithm>
#include <iterator>
#include <set> #include <set>
#include <sstream> #include <sstream>
@@ -15,7 +13,7 @@ namespace {
const size_t RootIndex = 1; const size_t RootIndex = 1;
const size_t FilesWithoutPrefixKeywordIndex = 2; const size_t FilesWithoutPrefixKeywordIndex = 2;
const size_t FilesWithPrefixKeywordIndex = 4; const size_t FilesWithPrefixKeywordIndex = 4;
const size_t PrefixKeywordIdex = 2; const size_t PrefixKeywordIndex = 2;
std::vector<std::string> tokenizePath(const std::string& path) std::vector<std::string> tokenizePath(const std::string& path)
{ {
@@ -79,17 +77,26 @@ cmSourceGroup* addSourceGroup(const std::vector<std::string>& tokenizedPath,
return sg; return sg;
} }
std::string prepareFilePathForTree(const std::string& path) std::string prepareFilePathForTree(const std::string& path,
const std::string& currentSourceDir)
{ {
if (!cmSystemTools::FileIsFullPath(path)) {
return cmSystemTools::CollapseFullPath(currentSourceDir + "/" + path);
}
return cmSystemTools::CollapseFullPath(path); return cmSystemTools::CollapseFullPath(path);
} }
std::vector<std::string> prepareFilesPathsForTree( std::vector<std::string> prepareFilesPathsForTree(
std::vector<std::string>::const_iterator begin, std::vector<std::string>::const_iterator begin,
std::vector<std::string>::const_iterator end) std::vector<std::string>::const_iterator end,
const std::string& currentSourceDir)
{ {
std::vector<std::string> prepared(std::distance(begin, end)); std::vector<std::string> prepared;
std::transform(begin, end, prepared.begin(), prepareFilePathForTree);
for (; begin != end; ++begin) {
prepared.push_back(prepareFilePathForTree(*begin, currentSourceDir));
}
return prepared; return prepared;
} }
@@ -228,13 +235,13 @@ bool cmSourceGroupCommand::checkTreeArgumentsPreconditions(
} }
if (args[FilesWithoutPrefixKeywordIndex] != "FILES" && if (args[FilesWithoutPrefixKeywordIndex] != "FILES" &&
args[PrefixKeywordIdex] != "PREFIX") { args[PrefixKeywordIndex] != "PREFIX") {
errorMsg = "Unknown argument \"" + args[2] + errorMsg = "Unknown argument \"" + args[2] +
"\". Perhaps the FILES keyword is missing.\n"; "\". Perhaps the FILES keyword is missing.\n";
return false; return false;
} }
if (args[PrefixKeywordIdex] == "PREFIX" && if (args[PrefixKeywordIndex] == "PREFIX" &&
(args.size() < 5 || args[FilesWithPrefixKeywordIndex] != "FILES")) { (args.size() < 5 || args[FilesWithPrefixKeywordIndex] != "FILES")) {
errorMsg = "Missing FILES arguments."; errorMsg = "Missing FILES arguments.";
return false; return false;
@@ -253,13 +260,14 @@ bool cmSourceGroupCommand::processTree(const std::vector<std::string>& args,
const std::string root = cmSystemTools::CollapseFullPath(args[RootIndex]); const std::string root = cmSystemTools::CollapseFullPath(args[RootIndex]);
std::string prefix; std::string prefix;
size_t filesBegin = FilesWithoutPrefixKeywordIndex + 1; size_t filesBegin = FilesWithoutPrefixKeywordIndex + 1;
if (args[PrefixKeywordIdex] == "PREFIX") { if (args[PrefixKeywordIndex] == "PREFIX") {
prefix = args[PrefixKeywordIdex + 1]; prefix = args[PrefixKeywordIndex + 1];
filesBegin = FilesWithPrefixKeywordIndex + 1; filesBegin = FilesWithPrefixKeywordIndex + 1;
} }
const std::vector<std::string> filesVector = const std::vector<std::string> filesVector =
prepareFilesPathsForTree(args.begin() + filesBegin, args.end()); prepareFilesPathsForTree(args.begin() + filesBegin, args.end(),
this->Makefile->GetCurrentSourceDirectory());
if (!rootIsPrefix(root, filesVector, errorMsg)) { if (!rootIsPrefix(root, filesVector, errorMsg)) {
return false; return false;

View File

@@ -1,4 +1,4 @@
cmake_minimum_required (VERSION 2.6) cmake_minimum_required (VERSION 3.8)
project(SourceGroups) project(SourceGroups)
# this is not really a test which can fail # this is not really a test which can fail
@@ -33,10 +33,11 @@ source_group(EmptyGroup)
set(root ${CMAKE_CURRENT_SOURCE_DIR}) set(root ${CMAKE_CURRENT_SOURCE_DIR})
set(tree_files_without_prefix ${root}/sub1/tree_bar.c set(tree_files_without_prefix ${root}/sub1/tree_bar.c
${root}/sub1/tree_baz.c sub1/tree_baz.c
${root}/sub1/tree_subdir/tree_foobar.c) sub1/../sub1/tree_subdir/tree_foobar.c)
set(tree_files_with_prefix ${root}/tree_foo.c) set(tree_files_with_prefix ${root}/tree_prefix_foo.c
tree_prefix_bar.c)
source_group(TREE ${root} FILES ${tree_files_without_prefix}) source_group(TREE ${root} FILES ${tree_files_without_prefix})

View File

@@ -5,7 +5,8 @@ extern int bar(void);
extern int foobar(void); extern int foobar(void);
extern int barbar(void); extern int barbar(void);
extern int baz(void); extern int baz(void);
extern int tree_foo(void); extern int tree_prefix_foo(void);
extern int tree_prefix_bar(void);
extern int tree_bar(void); extern int tree_bar(void);
extern int tree_foobar(void); extern int tree_foobar(void);
extern int tree_baz(void); extern int tree_baz(void);
@@ -15,7 +16,9 @@ int main()
printf("foo: %d bar: %d foobar: %d barbar: %d baz: %d\n", foo(), bar(), printf("foo: %d bar: %d foobar: %d barbar: %d baz: %d\n", foo(), bar(),
foobar(), barbar(), baz()); foobar(), barbar(), baz());
printf("tree_foo: %d tree_bar: %d tree_foobar: %d tree_baz: %d\n", printf("tree_prefix_foo: %d tree_prefix_bar: %d tree_bar: %d tree_foobar: "
tree_foo(), tree_bar(), tree_foobar(), tree_baz()); "%d tree_baz: %d\n",
tree_prefix_foo(), tree_prefix_bar(), tree_bar(), tree_foobar(),
tree_baz());
return 0; return 0;
} }

View File

@@ -1,4 +0,0 @@
int tree_foo(void)
{
return 6;
}

View File

@@ -0,0 +1,4 @@
int tree_prefix_bar(void)
{
return 66;
}

View File

@@ -0,0 +1,4 @@
int tree_prefix_foo(void)
{
return 6;
}