assets.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package gpu
  2. import (
  3. "fmt"
  4. "log/slog"
  5. "os"
  6. "path/filepath"
  7. "runtime"
  8. "strings"
  9. "sync"
  10. )
  11. var (
  12. lock sync.Mutex
  13. payloadsDir = ""
  14. )
  15. func PayloadsDir() (string, error) {
  16. lock.Lock()
  17. defer lock.Unlock()
  18. if payloadsDir == "" {
  19. tmpDir, err := os.MkdirTemp("", "ollama")
  20. if err != nil {
  21. return "", fmt.Errorf("failed to generate tmp dir: %w", err)
  22. }
  23. payloadsDir = tmpDir
  24. }
  25. return payloadsDir, nil
  26. }
  27. func Cleanup() {
  28. lock.Lock()
  29. defer lock.Unlock()
  30. if payloadsDir != "" {
  31. slog.Debug("cleaning up payloads dir " + payloadsDir)
  32. err := os.RemoveAll(payloadsDir)
  33. if err != nil {
  34. slog.Warn(fmt.Sprintf("failed to cleanup tmp dir: %s", err))
  35. }
  36. }
  37. }
  38. func UpdatePath(dir string) {
  39. if runtime.GOOS == "windows" {
  40. tmpDir := filepath.Dir(dir)
  41. pathComponents := strings.Split(os.Getenv("PATH"), ";")
  42. i := 0
  43. for _, comp := range pathComponents {
  44. if strings.EqualFold(comp, dir) {
  45. return
  46. }
  47. // Remove any other prior paths to our temp dir
  48. if !strings.HasPrefix(strings.ToLower(comp), strings.ToLower(tmpDir)) {
  49. pathComponents[i] = comp
  50. i++
  51. }
  52. }
  53. newPath := strings.Join(append([]string{dir}, pathComponents...), ";")
  54. slog.Info(fmt.Sprintf("Updating PATH to %s", newPath))
  55. os.Setenv("PATH", newPath)
  56. }
  57. // linux and darwin rely on rpath
  58. }