summaryrefslogtreecommitdiffstats
path: root/source/compiler-core/slang-artifact-info.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2022-08-09 10:31:22 -0400
committerGitHub <noreply@github.com>2022-08-09 10:31:22 -0400
commitc0733be56dc24ef0eb67b26fe0c49d3419e75773 (patch)
treee094e31981c69e887ff9df84df07defe9eb77bf5 /source/compiler-core/slang-artifact-info.cpp
parent2db8c15c04f2aade49636e42f0adee636afb3b73 (diff)
Support for Items on IArtifact (#2347)
* #include an absolute path didn't work - because paths were taken to always be relative. * WIP with hierarchical enums. * Some small fixes and improvements around artifact desc related types. * Improvements around hierarchical enum. * Fixes to get Artifact types refactor to be able to execute tests. * Attempt to better categorize PTX. * Work around for potentially unused function warning. * Typo fix. * Simplify Artifact header. * Small improvements around Artifact kind/payload/style. * Added IDestroyable/ICastable * Add IArtifactList. * First impl of IArtifactUtil. * Use the ICastable interface for IArtifactRepresentation. * Added IArtifactRepresentation & IArtifactAssociated. * Add SLANG_OVERRIDE to avoid gcc/clang warning. * Fix calling convention issue on win32. * Fix missing SLANG_OVERRIDE. * First attempt at file abstraction around Artifact. * Added creation of lock file. * Move functionality for determining file paths to the IArtifactUtil. Add casting to ICastable. * Added some casting/finding mechanisms. * Simplify IArtifact interface, and use Items for file reps. * Fix problem with libraries on DXIL.
Diffstat (limited to 'source/compiler-core/slang-artifact-info.cpp')
-rw-r--r--source/compiler-core/slang-artifact-info.cpp75
1 files changed, 61 insertions, 14 deletions
diff --git a/source/compiler-core/slang-artifact-info.cpp b/source/compiler-core/slang-artifact-info.cpp
index f76bf45f0..1d309e3c7 100644
--- a/source/compiler-core/slang-artifact-info.cpp
+++ b/source/compiler-core/slang-artifact-info.cpp
@@ -342,33 +342,80 @@ UnownedStringSlice ArtifactInfoUtil::getDefaultExtension(const ArtifactDesc& des
return name;
}
-/* static */String ArtifactInfoUtil::getBaseName(IArtifact* artifact)
+/* static */String ArtifactInfoUtil::getBaseName(const ArtifactDesc& desc, IFileArtifactRepresentation* fileRep)
{
- const auto pathType = artifact->getPathType();
+ UnownedStringSlice path(fileRep->getPath());
+ return getBaseNameFromPath(desc, path);
+}
- // If we have a path, get the base name from that
- if (pathType != ArtifactPathType::None)
+/* static */String ArtifactInfoUtil::getBaseName(IArtifact* artifact)
+{
+ if (auto fileRep = findItem<IFileArtifactRepresentation>(artifact))
{
- UnownedStringSlice path(artifact->getPath());
- const auto desc = artifact->getDesc();
-
- return getBaseNameFromPath(desc, path);
+ return getBaseName(artifact->getDesc(), fileRep);
}
-
// Else use the name
return artifact->getName();
}
+/* static */String ArtifactInfoUtil::getParentPath(IFileArtifactRepresentation* fileRep)
+{
+ UnownedStringSlice path(fileRep->getPath());
+ return Path::getParentDirectory(path);
+}
+
/* static */String ArtifactInfoUtil::getParentPath(IArtifact* artifact)
{
- const auto pathType = artifact->getPathType();
- const auto path = artifact->getPath();
-
- if (pathType != ArtifactPathType::None && *path != 0)
+ if (auto fileRep = findItem<IFileArtifactRepresentation>(artifact))
{
- return Path::getParentDirectory(path);
+ return getParentPath(fileRep);
}
return String();
}
+/* static */SlangResult ArtifactInfoUtil::calcPathForDesc(const ArtifactDesc& desc, const UnownedStringSlice& basePath, StringBuilder& outPath)
+{
+ outPath.Clear();
+
+ UnownedStringSlice baseName;
+
+ // Append the directory
+ Index pos = Path::findLastSeparatorIndex(basePath);
+ if (pos >= 0)
+ {
+ outPath.append(basePath.head(pos));
+ outPath.append(Path::kPathDelimiter);
+
+ baseName = basePath.tail(pos + 1);
+ }
+
+ if (baseName.getLength() == 0)
+ {
+ baseName = toSlice("unknown");
+ }
+
+ if (ArtifactInfoUtil::isCpuBinary(desc) &&
+ (desc.kind == ArtifactKind::SharedLibrary ||
+ desc.kind == ArtifactKind::Library))
+ {
+ const bool isSharedLibraryPrefixPlatform = SLANG_LINUX_FAMILY || SLANG_APPLE_FAMILY;
+ if (isSharedLibraryPrefixPlatform)
+ {
+ outPath << "lib";
+ outPath << baseName;
+ }
+ }
+
+ // If there is an extension append it
+ const UnownedStringSlice ext = ArtifactInfoUtil::getDefaultExtension(desc);
+
+ if (ext.getLength())
+ {
+ outPath.appendChar('.');
+ outPath.append(ext);
+ }
+
+ return SLANG_OK;
+}
+
} // namespace Slang