From 80360edc57eb9782bb8a29921d8d73b7f9a8aac6 Mon Sep 17 00:00:00 2001 From: Akihiro Suda Date: Wed, 5 Nov 2025 17:57:47 +0900 Subject: [PATCH] Fix libexec dir detection on Homebrew Fix issue 4295 Signed-off-by: Akihiro Suda --- pkg/plugins/plugins.go | 7 ++-- pkg/registry/registry.go | 12 ++++--- pkg/usrlocalsharelima/usrlocalsharelima.go | 41 ++++++++++++++-------- 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/pkg/plugins/plugins.go b/pkg/plugins/plugins.go index 2f8823b3a9e..010f457371b 100644 --- a/pkg/plugins/plugins.go +++ b/pkg/plugins/plugins.go @@ -59,10 +59,9 @@ var getPluginDirectories = sync.OnceValue(func() []string { dirs = append(dirs, pathDirs...) } - if libexecDir, err := usrlocalsharelima.LibexecLima(); err == nil { - if _, err := os.Stat(libexecDir); err == nil { - dirs = append(dirs, libexecDir) - } + libexecDirs, err := usrlocalsharelima.LibexecLima() + if err == nil { + dirs = append(dirs, libexecDirs...) } return dirs diff --git a/pkg/registry/registry.go b/pkg/registry/registry.go index cf76df30220..9658d8eaa09 100644 --- a/pkg/registry/registry.go +++ b/pkg/registry/registry.go @@ -124,15 +124,17 @@ func discoverDrivers() error { } } - stdDriverDir, err := usrlocalsharelima.LibexecLima() + stdDriverDirs, err := usrlocalsharelima.LibexecLima() if err != nil { return err } - logrus.Debugf("Discovering external drivers in %s", stdDriverDir) - if _, err := os.Stat(stdDriverDir); err == nil { - if err := discoverDriversInDir(stdDriverDir); err != nil { - logrus.Warnf("Error discovering external drivers in %q: %v", stdDriverDir, err) + logrus.Debugf("Discovering external drivers in %v", stdDriverDirs) + for _, dir := range stdDriverDirs { + if _, err := os.Stat(dir); err == nil { + if err := discoverDriversInDir(dir); err != nil { + logrus.Warnf("Error discovering external drivers in %q: %v", dir, err) + } } } return nil diff --git a/pkg/usrlocalsharelima/usrlocalsharelima.go b/pkg/usrlocalsharelima/usrlocalsharelima.go index d6daaa31ab0..a2d27c7ec18 100644 --- a/pkg/usrlocalsharelima/usrlocalsharelima.go +++ b/pkg/usrlocalsharelima/usrlocalsharelima.go @@ -175,20 +175,31 @@ func chooseGABinary(candidates []string) (string, error) { } } -// Prefix returns the directory, which is two levels above the lima share directory. -func Prefix() (string, error) { - dir, err := Dir() - if err != nil { - return "", err - } - return filepath.Dir(filepath.Dir(dir)), nil -} - -// LibexecLima returns the /libexec/lima directory. -func LibexecLima() (string, error) { - prefix, err := Prefix() - if err != nil { - return "", err +// LibexecLima returns the /libexec/lima directories. +// For Homebrew compatibility, it also checks /lib/lima. +func LibexecLima() ([]string, error) { + var candidates []string + selfDirs := SelfDirs() + for _, selfDir := range selfDirs { + // selfDir: /usr/local/bin + // prefix: /usr/local + // candidate: /usr/local/libexec/lima + prefix := filepath.Dir(selfDir) + candidate := filepath.Join(prefix, "libexec", "lima") + if ents, err := os.ReadDir(candidate); err == nil && len(ents) > 0 { + candidates = append(candidates, candidate) + } + // selfDir: /opt/homebrew/bin + // prefix: /opt/homebrew + // candidate: /opt/homebrew/lib/lima + // + // Note that there is no /opt/homebrew/libexec directory, + // as Homebrew preserves libexec for private use. + // https://github.com/lima-vm/lima/issues/4295#issuecomment-3490680651 + candidate = filepath.Join(prefix, "lib", "lima") + if ents, err := os.ReadDir(candidate); err == nil && len(ents) > 0 { + candidates = append(candidates, candidate) + } } - return filepath.Join(prefix, "libexec", "lima"), nil + return candidates, nil }