mirror of
https://github.com/Kitware/CMake.git
synced 2026-02-25 10:18:34 -06:00
Merge topic 'correct_ispc_path_computation' into release-3.19
9af93fef11ISPC: Handle OBJECT sources in different directories72ae15ebcbISPC: Ninja properly compute ISPC_HEADER_DIRECTORY location Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !5581
This commit is contained in:
@@ -5107,9 +5107,14 @@ void cmGeneratorTarget::GetTargetObjectNames(
|
||||
objects.push_back(map_it->second);
|
||||
}
|
||||
|
||||
// We need to compute the relative path from the root of
|
||||
// of the object directory to handle subdirectory paths
|
||||
std::string rootObjectDir = this->GetObjectDirectory(config);
|
||||
rootObjectDir = cmSystemTools::CollapseFullPath(rootObjectDir);
|
||||
auto ispcObjects = this->GetGeneratedISPCObjects(config);
|
||||
for (std::string const& output : ispcObjects) {
|
||||
objects.push_back(cmSystemTools::GetFilenameName(output));
|
||||
auto relativePathFromObjectDir = output.substr(rootObjectDir.size());
|
||||
objects.push_back(relativePathFromObjectDir);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2434,9 +2434,10 @@ void cmLocalGenerator::AddISPCDependencies(cmGeneratorTarget* target)
|
||||
this->Makefile->GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig);
|
||||
for (std::string const& config : configsList) {
|
||||
|
||||
std::string perConfigDir = target->GetObjectDirectory(config);
|
||||
std::string rootObjectDir = target->GetObjectDirectory(config);
|
||||
std::string headerDir = rootObjectDir;
|
||||
if (cmProp prop = target->GetProperty("ISPC_HEADER_DIRECTORY")) {
|
||||
perConfigDir = cmSystemTools::CollapseFullPath(
|
||||
headerDir = cmSystemTools::CollapseFullPath(
|
||||
cmStrCat(this->GetBinaryDirectory(), '/', *prop));
|
||||
}
|
||||
|
||||
@@ -2453,11 +2454,11 @@ void cmLocalGenerator::AddISPCDependencies(cmGeneratorTarget* target)
|
||||
std::string ispcSource =
|
||||
cmSystemTools::GetFilenameWithoutLastExtension(objectName);
|
||||
|
||||
auto headerPath = cmStrCat(perConfigDir, '/', ispcSource, ".h");
|
||||
auto headerPath = cmStrCat(headerDir, '/', ispcSource, ".h");
|
||||
target->AddISPCGeneratedHeader(headerPath, config);
|
||||
if (extra_objects) {
|
||||
std::vector<std::string> objs = detail::ComputeISPCExtraObjects(
|
||||
objectName, perConfigDir, ispcSuffixes);
|
||||
objectName, rootObjectDir, ispcSuffixes);
|
||||
target->AddISPCGeneratedObject(std::move(objs), config);
|
||||
}
|
||||
}
|
||||
@@ -4076,15 +4077,23 @@ std::vector<std::string> ComputeISPCExtraObjects(
|
||||
std::string const& objectName, std::string const& buildDirectory,
|
||||
std::vector<std::string> const& ispcSuffixes)
|
||||
{
|
||||
auto normalizedDir = cmSystemTools::CollapseFullPath(buildDirectory);
|
||||
std::vector<std::string> computedObjects;
|
||||
computedObjects.reserve(ispcSuffixes.size());
|
||||
|
||||
auto extension = cmSystemTools::GetFilenameLastExtension(objectName);
|
||||
auto objNameNoExt =
|
||||
cmSystemTools::GetFilenameWithoutLastExtension(objectName);
|
||||
|
||||
// We can't use cmSystemTools::GetFilenameWithoutLastExtension as it
|
||||
// drops any directories in objectName
|
||||
auto objNameNoExt = objectName;
|
||||
std::string::size_type dot_pos = objectName.rfind('.');
|
||||
if (dot_pos != std::string::npos) {
|
||||
objNameNoExt.resize(dot_pos);
|
||||
}
|
||||
|
||||
for (const auto& ispcTarget : ispcSuffixes) {
|
||||
computedObjects.emplace_back(
|
||||
cmStrCat(buildDirectory, "/", objNameNoExt, "_", ispcTarget, extension));
|
||||
cmStrCat(normalizedDir, "/", objNameNoExt, "_", ispcTarget, extension));
|
||||
}
|
||||
|
||||
return computedObjects;
|
||||
|
||||
@@ -1375,15 +1375,16 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
|
||||
std::string ispcSource =
|
||||
cmSystemTools::GetFilenameWithoutLastExtension(objectName);
|
||||
|
||||
std::string ispcDirectory = objectFileDir;
|
||||
std::string ispcHeaderDirectory =
|
||||
this->GeneratorTarget->GetObjectDirectory(config);
|
||||
if (cmProp prop =
|
||||
this->GeneratorTarget->GetProperty("ISPC_HEADER_DIRECTORY")) {
|
||||
ispcDirectory = *prop;
|
||||
ispcHeaderDirectory =
|
||||
cmStrCat(this->LocalGenerator->GetBinaryDirectory(), '/', *prop);
|
||||
}
|
||||
ispcDirectory =
|
||||
cmStrCat(this->LocalGenerator->GetBinaryDirectory(), '/', ispcDirectory);
|
||||
|
||||
std::string ispcHeader = cmStrCat(ispcDirectory, '/', ispcSource, ".h");
|
||||
std::string ispcHeader =
|
||||
cmStrCat(ispcHeaderDirectory, '/', ispcSource, ".h");
|
||||
ispcHeader = this->ConvertToNinjaPath(ispcHeader);
|
||||
|
||||
// Make sure ninja knows what command generates the header
|
||||
@@ -1395,8 +1396,10 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
|
||||
auto ispcSuffixes =
|
||||
detail::ComputeISPCObjectSuffixes(this->GeneratorTarget);
|
||||
if (ispcSuffixes.size() > 1) {
|
||||
std::string rootObjectDir =
|
||||
this->GeneratorTarget->GetObjectDirectory(config);
|
||||
auto ispcSideEfffectObjects = detail::ComputeISPCExtraObjects(
|
||||
objectName, ispcDirectory, ispcSuffixes);
|
||||
objectName, rootObjectDir, ispcSuffixes);
|
||||
|
||||
for (auto sideEffect : ispcSideEfffectObjects) {
|
||||
sideEffect = this->ConvertToNinjaPath(sideEffect);
|
||||
|
||||
@@ -8,7 +8,7 @@ if(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||
endif()
|
||||
|
||||
|
||||
add_library(ispc_objects OBJECT simple.ispc extra.ispc)
|
||||
add_library(ispc_objects OBJECT simple.ispc subdir/extra.ispc)
|
||||
|
||||
set_target_properties(ispc_objects PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
||||
set_target_properties(ispc_objects PROPERTIES ISPC_INSTRUCTION_SETS "sse2-i32x4;sse4-i8x16")
|
||||
|
||||
Reference in New Issue
Block a user