nip/src/nimpak/platform.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