using LLama.Abstractions;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace LLama.Native
{
#if NET6_0_OR_GREATER
///
/// A native library compiled on Mac, or fallbacks from all other libraries in the selection.
///
public class NativeLibraryWithMacOrFallback : INativeLibrary
{
private NativeLibraryName _libraryName;
private bool _skipCheck;
///
public NativeLibraryMetadata? Metadata
{
get
{
return new NativeLibraryMetadata(_libraryName, false, AvxLevel.None);
}
}
///
///
///
///
///
public NativeLibraryWithMacOrFallback(NativeLibraryName libraryName, bool skipCheck)
{
_libraryName = libraryName;
_skipCheck = skipCheck;
}
///
public IEnumerable Prepare(SystemInfo systemInfo, NativeLogConfig.LLamaLogCallback? logCallback)
{
var path = GetPath(systemInfo, AvxLevel.None, logCallback);
return path is null ?[] : [path];
}
private string? GetPath(SystemInfo systemInfo, AvxLevel avxLevel, NativeLogConfig.LLamaLogCallback? logCallback)
{
NativeLibraryUtils.GetPlatformPathParts(systemInfo.OSPlatform, out var os, out var fileExtension, out var libPrefix);
string relativePath;
if (systemInfo.OSPlatform == OSPlatform.OSX)
{
relativePath = $"runtimes/{os}/native/{libPrefix}{_libraryName.GetLibraryName()}{fileExtension}";
}
else
{
var avxStr = NativeLibraryConfig.AvxLevelToString(AvxLevel.None);
if (!string.IsNullOrEmpty(avxStr))
avxStr += "/";
relativePath = $"runtimes/{os}/native/{avxStr}{libPrefix}{_libraryName.GetLibraryName()}{fileExtension}";
}
return relativePath;
}
}
#endif
}