166 lines
5.3 KiB
Plaintext
Raw Normal View History

# Platform detection utilities
#
# Provides functions to detect current OS, architecture, and map to cargo target triples
# Detect current operating system
export def detect-os [] {
let sys = (sys host)
match $sys.name {
"Linux" => { "linux" }
"Darwin" => { "macos" }
"Windows" => { "windows" }
_ => {
let msg = "Unsupported OS: " + ($sys.name | into string)
error make {msg: $msg}
}
}
}
# Detect current architecture
export def detect-arch [] {
let arch_output = (^uname -m | str trim)
match $arch_output {
"x86_64" => { "x86_64" }
"aarch64" => { "aarch64" }
"arm64" => { "aarch64" }
"i686" => { "i686" }
"i386" => { "i386" }
_ => {
let msg = "Unsupported architecture: " + ($arch_output | into string)
error make {msg: $msg}
}
}
}
# Get the appropriate libc variant for Linux
export def detect-libc [] {
try {
let ldd_output = (^ldd --version | head -1)
if ($ldd_output | str contains "musl") {
"musl"
} else {
"glibc"
}
} catch {
"glibc"
}
}
# Map OS, arch, libc to cargo target triple
export def map-to-target [--os: string = "", --arch: string = "", --libc: string = ""] {
let os = if ($os == "") { detect-os } else { $os }
let arch = if ($arch == "") { detect-arch } else { $arch }
let libc = if (($libc == "") and ($os == "linux")) { detect-libc } else { $libc }
match [$os, $arch, $libc] {
["linux", "x86_64", "glibc"] => { "x86_64-unknown-linux-gnu" }
["linux", "x86_64", "musl"] => { "x86_64-unknown-linux-musl" }
["linux", "aarch64", "glibc"] => { "aarch64-unknown-linux-gnu" }
["linux", "aarch64", "musl"] => { "aarch64-unknown-linux-musl" }
["macos", "x86_64", _] => { "x86_64-apple-darwin" }
["macos", "aarch64", _] => { "aarch64-apple-darwin" }
["windows", "x86_64", _] => { "x86_64-pc-windows-msvc" }
_ => {
let msg = "Unsupported combination: os=" + $os + ", arch=" + $arch + ", libc=" + $libc
error make {msg: $msg}
}
}
}
# Get current platform as target triple
export def current-target [] {
map-to-target
}
# Get all enabled targets from provisioning config
export def available-targets [config_file: path] {
let config = (open --raw $config_file | from toml)
# Return all target keys from config
["x86_64-unknown-linux-gnu" "aarch64-unknown-linux-gnu" "x86_64-apple-darwin" "aarch64-apple-darwin" "x86_64-pc-windows-msvc"]
}
# Get default installation prefix for a platform
export def default-prefix [target: string] {
match $target {
"x86_64-unknown-linux-gnu" => { "/usr/local" }
"x86_64-unknown-linux-musl" => { "/usr/local" }
"aarch64-unknown-linux-gnu" => { "/usr/local" }
"aarch64-unknown-linux-musl" => { "/usr/local" }
"x86_64-apple-darwin" => { "/usr/local" }
"aarch64-apple-darwin" => { "/usr/local" }
"x86_64-pc-windows-msvc" => { "C:\\Program Files\\syntaxis" }
_ => { "/usr/local" }
}
}
# Check if target is available in config
export def is-target-enabled [target: string, config_file: path] {
let config = (open --raw $config_file | from toml)
let target_config = ($config.targets | get -o $target)
if (($target_config == null)) {
false
} else {
$target_config.enabled
}
}
# Get supported formats for a target
export def target-formats [target: string, config_file: path] {
let config = (open --raw $config_file | from toml)
let target_config = ($config.targets | get -o $target)
if (($target_config == null)) {
["tar.gz"]
} else {
$target_config.formats
}
}
# Get friendly target description
export def target-description [target: string, config_file: path] {
let config = (open --raw $config_file | from toml)
let target_config = ($config.targets | get -o $target)
if (($target_config == null)) {
$target
} else {
$target_config.description
}
}
# List all supported targets with descriptions
export def list-targets [config_file: path] {
let config = (open --raw $config_file | from toml)
# Return hardcoded target list with descriptions
[
{
target: "x86_64-unknown-linux-gnu"
enabled: ($config.targets.x86_64-unknown-linux-gnu.enabled // true)
description: "Linux x86_64 (glibc)"
formats: "tar.gz"
}
{
target: "aarch64-unknown-linux-gnu"
enabled: ($config.targets.aarch64-unknown-linux-gnu.enabled // true)
description: "Linux ARM64 (glibc)"
formats: "tar.gz"
}
{
target: "x86_64-apple-darwin"
enabled: ($config.targets.x86_64-apple-darwin.enabled // true)
description: "macOS x86_64"
formats: "tar.gz,zip"
}
{
target: "aarch64-apple-darwin"
enabled: ($config.targets.aarch64-apple-darwin.enabled // true)
description: "macOS ARM64"
formats: "tar.gz,zip"
}
{
target: "x86_64-pc-windows-msvc"
enabled: ($config.targets.x86_64-pc-windows-msvc.enabled // true)
description: "Windows x86_64"
formats: "zip"
}
]
}