59 lines
1.5 KiB
Go
59 lines
1.5 KiB
Go
//go:build windows
|
|
|
|
package utils
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
// EnsureGStreamerOnPath best-effort prepends common GStreamer bin locations to PATH for the
|
|
// current process. It does not modify system-wide PATH. This helps avoid missing-DLL issues
|
|
// when users install GStreamer but its bin directory is not on PATH.
|
|
func EnsureGStreamerOnPath() {
|
|
candidates := []string{}
|
|
|
|
// If the user set GSTREAMER_1_0_ROOT_X86_64, prefer its bin
|
|
if root := os.Getenv("GSTREAMER_1_0_ROOT_X86_64"); root != "" {
|
|
candidates = append(candidates, filepath.Join(root, "bin"))
|
|
}
|
|
|
|
// Common installer locations (64-bit)
|
|
candidates = append(candidates,
|
|
`C:\\gstreamer\\1.0\\msvc_x86_64\\bin`,
|
|
`C:\\Program Files\\GStreamer\\1.0\\msvc_x86_64\\bin`,
|
|
)
|
|
|
|
pathVal := os.Getenv("PATH")
|
|
parts := []string{}
|
|
seen := map[string]bool{}
|
|
|
|
// Prepend any found candidates that exist
|
|
for _, cand := range candidates {
|
|
if cand == "" {
|
|
continue
|
|
}
|
|
if _, err := os.Stat(cand); err == nil {
|
|
// Only add if not already present (case-insensitive on Windows)
|
|
lower := strings.ToLower(cand)
|
|
if !seen[lower] {
|
|
parts = append(parts, cand)
|
|
seen[lower] = true
|
|
}
|
|
}
|
|
}
|
|
|
|
// Append existing PATH entries, preserving order and deduping case-insensitively
|
|
for _, p := range filepath.SplitList(pathVal) {
|
|
lower := strings.ToLower(p)
|
|
if seen[lower] {
|
|
continue
|
|
}
|
|
parts = append(parts, p)
|
|
seen[lower] = true
|
|
}
|
|
|
|
_ = os.Setenv("PATH", strings.Join(parts, string(os.PathListSeparator)))
|
|
}
|