120 lines
3.1 KiB
Nim
120 lines
3.1 KiB
Nim
# SPDX-License-Identifier: LSL-1.0
|
|
# Copyright (c) 2026 Markus Maiwald
|
|
# Stewardship: Self Sovereign Society Foundation
|
|
#
|
|
# This file is part of the Nexus Sovereign Core.
|
|
# See legal/LICENSE_SOVEREIGN.md for license terms.
|
|
|
|
## platform.nim
|
|
## Platform detection and BSD compatibility
|
|
|
|
import std/[os, strutils, osproc]
|
|
|
|
type
|
|
Platform* = enum
|
|
Linux, FreeBSD, NetBSD, OpenBSD, DragonflyBSD, Darwin, Unknown
|
|
|
|
proc detectPlatform*(): Platform =
|
|
## Detect the current platform
|
|
when defined(linux):
|
|
return Linux
|
|
elif defined(freebsd):
|
|
return FreeBSD
|
|
elif defined(netbsd):
|
|
return NetBSD
|
|
elif defined(openbsd):
|
|
return OpenBSD
|
|
elif defined(dragonfly):
|
|
return DragonflyBSD
|
|
elif defined(macosx):
|
|
return Darwin
|
|
else:
|
|
return Unknown
|
|
|
|
proc isBSD*(): bool =
|
|
## Check if running on a BSD system
|
|
let platform = detectPlatform()
|
|
platform in [FreeBSD, NetBSD, OpenBSD, DragonflyBSD]
|
|
|
|
proc platformName*(): string =
|
|
## Get platform name as string
|
|
case detectPlatform()
|
|
of Linux: "Linux"
|
|
of FreeBSD: "FreeBSD"
|
|
of NetBSD: "NetBSD"
|
|
of OpenBSD: "OpenBSD"
|
|
of DragonflyBSD: "DragonflyBSD"
|
|
of Darwin: "macOS"
|
|
of Unknown: "Unknown"
|
|
|
|
proc getDefaultPaths*(): tuple[programs: string, links: string, cache: string, db: string] =
|
|
## Get platform-appropriate default paths
|
|
if isBSD():
|
|
# BSD typically uses /usr/local
|
|
result.programs = "/usr/local/Programs"
|
|
result.links = "/usr/local/System/Links"
|
|
result.cache = "/var/cache/nip"
|
|
result.db = "/var/db/nip/packages.json"
|
|
else:
|
|
# Linux and others
|
|
result.programs = "/Programs"
|
|
result.links = "/System/Links"
|
|
result.cache = "/var/nip/cache"
|
|
result.db = "/var/nip/db/packages.json"
|
|
|
|
proc getDefaultAdapter*(): string =
|
|
## Get the default/preferred adapter for this platform
|
|
case detectPlatform()
|
|
of FreeBSD, NetBSD, OpenBSD, DragonflyBSD:
|
|
return "pkgsrc" # PKGSRC is native on BSD
|
|
of Linux:
|
|
# Try to detect Linux distro
|
|
if fileExists("/etc/arch-release"):
|
|
return "pacman"
|
|
else:
|
|
return "nix" # Nix works everywhere
|
|
of Darwin:
|
|
return "nix" # Nix is popular on macOS
|
|
of Unknown:
|
|
return "nix"
|
|
|
|
proc getPkgConfigPath*(): string =
|
|
## Get platform-appropriate pkg-config path
|
|
if isBSD():
|
|
return "/usr/local/libdata/pkgconfig"
|
|
else:
|
|
return "/usr/lib/pkgconfig"
|
|
|
|
proc getShellConfigPath*(shell: string): string =
|
|
## Get shell configuration file path
|
|
let home = getHomeDir()
|
|
case shell.toLower()
|
|
of "bash":
|
|
if isBSD():
|
|
return home / ".bash_profile"
|
|
else:
|
|
return home / ".bashrc"
|
|
of "zsh":
|
|
return home / ".zshrc"
|
|
of "fish":
|
|
return home / ".config/fish/config.fish"
|
|
of "sh":
|
|
return home / ".profile"
|
|
else:
|
|
return home / ".profile"
|
|
|
|
proc showPlatformInfo*() =
|
|
## Display platform information
|
|
echo "Platform Information:"
|
|
echo " OS: ", platformName()
|
|
echo " BSD: ", if isBSD(): "Yes" else: "No"
|
|
echo " Default Adapter: ", getDefaultAdapter()
|
|
echo ""
|
|
|
|
let paths = getDefaultPaths()
|
|
echo "Default Paths:"
|
|
echo " Programs: ", paths.programs
|
|
echo " Links: ", paths.links
|
|
echo " Cache: ", paths.cache
|
|
echo " Database: ", paths.db
|