mirror of
https://github.com/Kitware/CMake.git
synced 2026-04-22 06:09:14 -05:00
set_property: Deduplicate source file directory scopes
A user could specify the same directory scope to set_property() multiple times, which in conjunction with APPEND would append the property multiple times. Make sure to deduplicate scopes across both DIRECTORY and TARGET_DIRECTORY options, so that a property is only appended once in such a scenario. Fixes: #20941
This commit is contained in:
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <unordered_set>
|
||||||
|
|
||||||
#include "cmExecutionStatus.h"
|
#include "cmExecutionStatus.h"
|
||||||
#include "cmGlobalGenerator.h"
|
#include "cmGlobalGenerator.h"
|
||||||
@@ -82,6 +83,8 @@ bool HandleSourceFileDirectoryScopes(
|
|||||||
std::vector<std::string>& source_file_target_directories,
|
std::vector<std::string>& source_file_target_directories,
|
||||||
std::vector<cmMakefile*>& directory_makefiles)
|
std::vector<cmMakefile*>& directory_makefiles)
|
||||||
{
|
{
|
||||||
|
std::unordered_set<cmMakefile*> directory_makefiles_set;
|
||||||
|
|
||||||
cmMakefile* current_dir_mf = &status.GetMakefile();
|
cmMakefile* current_dir_mf = &status.GetMakefile();
|
||||||
if (!source_file_directories.empty()) {
|
if (!source_file_directories.empty()) {
|
||||||
for (const std::string& dir_path : source_file_directories) {
|
for (const std::string& dir_path : source_file_directories) {
|
||||||
@@ -94,7 +97,11 @@ bool HandleSourceFileDirectoryScopes(
|
|||||||
status.SetError(cmStrCat("given non-existent DIRECTORY ", dir_path));
|
status.SetError(cmStrCat("given non-existent DIRECTORY ", dir_path));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
directory_makefiles.push_back(dir_mf);
|
if (directory_makefiles_set.find(dir_mf) ==
|
||||||
|
directory_makefiles_set.end()) {
|
||||||
|
directory_makefiles.push_back(dir_mf);
|
||||||
|
directory_makefiles_set.insert(dir_mf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,7 +117,12 @@ bool HandleSourceFileDirectoryScopes(
|
|||||||
cmMakefile* target_dir_mf =
|
cmMakefile* target_dir_mf =
|
||||||
status.GetMakefile().GetGlobalGenerator()->FindMakefile(
|
status.GetMakefile().GetGlobalGenerator()->FindMakefile(
|
||||||
*target_source_dir);
|
*target_source_dir);
|
||||||
directory_makefiles.push_back(target_dir_mf);
|
|
||||||
|
if (directory_makefiles_set.find(target_dir_mf) ==
|
||||||
|
directory_makefiles_set.end()) {
|
||||||
|
directory_makefiles.push_back(target_dir_mf);
|
||||||
|
directory_makefiles_set.insert(target_dir_mf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -261,6 +261,25 @@ function(check_get_property_value expected)
|
|||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
# Check that source file directory scopes are deduplicated.
|
||||||
|
set_property(SOURCE "${CMAKE_CURRENT_BINARY_DIR}/src32.cpp"
|
||||||
|
DIRECTORY SubDir2 SubDir2 SubDir2
|
||||||
|
TARGET_DIRECTORY set_prop_lib_3 set_prop_lib_3 set_prop_lib_3
|
||||||
|
APPEND
|
||||||
|
PROPERTY NON_DUPLICATED_CUSTOM_PROP 1
|
||||||
|
)
|
||||||
|
|
||||||
|
get_property(actual
|
||||||
|
SOURCE "${CMAKE_CURRENT_BINARY_DIR}/src32.cpp"
|
||||||
|
DIRECTORY SubDir2
|
||||||
|
PROPERTY NON_DUPLICATED_CUSTOM_PROP)
|
||||||
|
check_get_property_value("1")
|
||||||
|
|
||||||
|
get_source_file_property(actual "${CMAKE_CURRENT_BINARY_DIR}/src32.cpp"
|
||||||
|
TARGET_DIRECTORY set_prop_lib_3
|
||||||
|
NON_DUPLICATED_CUSTOM_PROP)
|
||||||
|
check_get_property_value("1")
|
||||||
|
|
||||||
# Get property + target directory
|
# Get property + target directory
|
||||||
get_property(actual
|
get_property(actual
|
||||||
SOURCE "${src_prefix}/src1.cpp"
|
SOURCE "${src_prefix}/src1.cpp"
|
||||||
|
|||||||
Reference in New Issue
Block a user