mirror of
https://github.com/wailsapp/wails.git
synced 2026-03-14 14:45:49 +01:00
* feat(linux): add libpath package for finding native library paths
Add a new internal/libpath package that locates shared libraries (.so files)
on Linux systems. Supports multiple distributions and package managers.
Features:
- Multi-tier search: pkg-config -> ldconfig -> filesystem scanning
- Parallel search using goroutines for faster lookups
- Cached dynamic path discovery for Flatpak, Snap, and Nix
- Support for Debian/Ubuntu, Fedora/RHEL, Arch, openSUSE, NixOS
- Context-aware cancellation for graceful shutdown
Performance:
- Library found: ~1.4ms (parallel search)
- Library not found: ~46ms (was 84ms sequential)
- Cached path discovery: 14ns (was 15ms uncached)
* feat(libpath): add multi-library parallel search functions
Add functions to search for multiple library candidates in parallel:
- FindFirstLibrary: Search multiple libs in parallel, return first found
- FindFirstLibraryOrdered: Search in order of preference (for version priority)
- FindAllLibraries: Find all available libraries from a list
Useful when the exact library version is unknown, e.g.:
match, _ := FindFirstLibrary("webkit2gtk-4.1", "webkit2gtk-4.0", "webkit2gtk-6.0")
Also adds findLibraryPathCtx for context-aware searching used by the
multi-library functions.
* refactor(libpath): split into separate files and fix race condition
Split libpath_linux.go into smaller, focused files:
- cache_linux.go: Path cache with thread-safe init/invalidate
- flatpak_linux.go: Flatpak runtime path discovery
- snap_linux.go: Snap package path discovery
- nix_linux.go: Nix/NixOS path discovery
- libpath_linux.go: Core search functions
Fixes:
- Fix data race between init() and invalidate() by holding mutex
during cache writes inside sync.Once.Do (CodeRabbit review)
- Fix FindLibraryPathWithOptions not searching dynamic paths
(Flatpak/Snap/Nix) - now uses GetAllLibPaths() (CodeRabbit review)
53 lines
1.4 KiB
Go
53 lines
1.4 KiB
Go
//go:build linux
|
|
|
|
package libpath
|
|
|
|
import (
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
// getFlatpakLibPaths returns cached library paths from installed Flatpak runtimes.
|
|
func getFlatpakLibPaths() []string {
|
|
return cache.getFlatpak()
|
|
}
|
|
|
|
// discoverFlatpakLibPaths scans for Flatpak runtime library directories.
|
|
// Uses `flatpak --installations` and scans for runtime lib directories.
|
|
func discoverFlatpakLibPaths() []string {
|
|
var paths []string
|
|
|
|
// Get system and user installation directories
|
|
installDirs := []string{
|
|
"/var/lib/flatpak", // System default
|
|
os.ExpandEnv("$HOME/.local/share/flatpak"), // User default
|
|
}
|
|
|
|
// Try to get actual installation path from flatpak
|
|
if out, err := exec.Command("flatpak", "--installations").Output(); err == nil {
|
|
for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") {
|
|
if line != "" {
|
|
installDirs = append(installDirs, line)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Scan for runtime lib directories
|
|
for _, installDir := range installDirs {
|
|
runtimeDir := filepath.Join(installDir, "runtime")
|
|
if _, err := os.Stat(runtimeDir); err != nil {
|
|
continue
|
|
}
|
|
|
|
// Look for lib directories in runtimes
|
|
// Structure: runtime/<name>/<arch>/<version>/<hash>/files/lib
|
|
matches, err := filepath.Glob(filepath.Join(runtimeDir, "*", "*", "*", "*", "files", "lib"))
|
|
if err == nil {
|
|
paths = append(paths, matches...)
|
|
}
|
|
}
|
|
|
|
return paths
|
|
}
|