added dependency installer - not tested for all OS - on debian it works as intended
This commit is contained in:
515
KleinDwm/dwm-deps-installer.sh
Executable file
515
KleinDwm/dwm-deps-installer.sh
Executable file
@@ -0,0 +1,515 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Please be aware that I only run debian. Idk if this script will work for all
|
||||
# Name: dwm-deps-installer.sh
|
||||
# Purpose: Attempt to install dependencies for dwm (with multiple patches)
|
||||
# across a wide range of Operating Systems and distributions.
|
||||
# Author: ChatGPT (with user’s requirements)
|
||||
# ---------------------------------------------------------------------
|
||||
|
||||
set -Eeuo pipefail
|
||||
|
||||
#----------------------------------------------
|
||||
# Helper Functions
|
||||
#----------------------------------------------
|
||||
|
||||
# Colored echo helpers (optional, remove if you don’t want colors):
|
||||
RED="$(tput setaf 1 || true)"
|
||||
GREEN="$(tput setaf 2 || true)"
|
||||
YELLOW="$(tput setaf 3 || true)"
|
||||
BLUE="$(tput setaf 4 || true)"
|
||||
BOLD="$(tput bold || true)"
|
||||
RESET="$(tput sgr0 || true)"
|
||||
|
||||
info() { echo -e "${BLUE}[INFO]${RESET} $*"; }
|
||||
warn() { echo -e "${YELLOW}[WARN]${RESET} $*"; }
|
||||
error() { echo -e "${RED}[ERROR]${RESET} $*" >&2; }
|
||||
success() { echo -e "${GREEN}[OK]${RESET} $*"; }
|
||||
|
||||
# Ensure the user is either root or can use sudo (for distros that require it).
|
||||
check_root_or_sudo() {
|
||||
if (( $EUID == 0 )); then
|
||||
info "Running as root."
|
||||
else
|
||||
# Check if sudo is present
|
||||
if ! command -v sudo &>/dev/null; then
|
||||
error "You need 'sudo' installed or to run this script as root!"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
#----------------------------------------------
|
||||
# Detect Operating System
|
||||
#----------------------------------------------
|
||||
# Strategy:
|
||||
# 1. Check `uname -s` for high-level OS detection (e.g., "Linux", "Darwin", "FreeBSD", "OpenBSD", "NetBSD", "SunOS", "CYGWIN_NT-10.0", "MSYS_NT-10.0", etc.).
|
||||
# 2. If Linux, parse /etc/os-release for distribution ID.
|
||||
# 3. If *BSD, parse `uname -s` or other known markers.
|
||||
# 4. If Windows (Cygwin, MSYS, etc.), note that direct DWM usage is limited unless WSL is used.
|
||||
# 5. If macOS (Darwin), note that you can't replace the system WM. We'll still do a brew-based install for X-related libs.
|
||||
# 6. If illumos/Solaris (SunOS), attempt typical "pkg" or "pkgutil" usage, but this can vary widely.
|
||||
|
||||
detect_os() {
|
||||
local unameOut
|
||||
unameOut="$(uname -s 2>/dev/null || true)"
|
||||
|
||||
case "${unameOut}" in
|
||||
Linux*) echo "Linux";;
|
||||
Darwin*) echo "macOS";;
|
||||
FreeBSD*) echo "FreeBSD";;
|
||||
OpenBSD*) echo "OpenBSD";;
|
||||
NetBSD*) echo "NetBSD";;
|
||||
DragonFly*) echo "DragonFlyBSD";;
|
||||
SunOS*) echo "SunOS";; # Could be illumos or Solaris
|
||||
CYGWIN*|MINGW*|MSYS*) echo "Windows";;
|
||||
*)
|
||||
# unknown
|
||||
echo "UnknownOS"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
#----------------------------------------------
|
||||
# Install function for Linux distributions
|
||||
#----------------------------------------------
|
||||
install_deps_linux() {
|
||||
# We'll attempt to parse /etc/os-release to get the distribution ID
|
||||
local distro="Unknown"
|
||||
if [[ -f /etc/os-release ]]; then
|
||||
# shellcheck source=/dev/null
|
||||
. /etc/os-release
|
||||
distro="${ID:-Unknown}"
|
||||
# Some distros (like Pop!_OS) might have ID=ubuntu but ID_LIKE=debian
|
||||
# We might also check $ID_LIKE to refine guesses
|
||||
fi
|
||||
|
||||
info "Detected distro ID: $distro"
|
||||
# Lowercase just in case
|
||||
distro="${distro,,}"
|
||||
|
||||
# Basic note: We need dev packages for:
|
||||
# - X11 (libx11, dev headers)
|
||||
# - Xft (libxft, dev)
|
||||
# - Xinerama (libxinerama, dev)
|
||||
# - Yajl (libyajl, dev) for certain patches
|
||||
# - xinit
|
||||
# - xorg/xserver
|
||||
|
||||
case "$distro" in
|
||||
# ---------------------------------------------------------------
|
||||
# Debian / Ubuntu / Mint / etc. (apt-based)
|
||||
# ---------------------------------------------------------------
|
||||
debian|ubuntu|linuxmint|pop|neon|elementary|zorin|kali|parrot|\
|
||||
raspbian|devuan|galliumos|lite|sparkylinux|peppermint|bunsenlabs|\
|
||||
bodhi|pureos|siduction)
|
||||
info "Using apt-get/apt to install dependencies..."
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y \
|
||||
libx11-dev libxft-dev libxinerama-dev libyajl-dev \
|
||||
xorg xinit
|
||||
;;
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Arch / Manjaro / Endeavour / Artix / etc. (pacman-based)
|
||||
# ---------------------------------------------------------------
|
||||
arch|manjaro|endeavouros|arco|artix|garuda)
|
||||
info "Using pacman to install dependencies..."
|
||||
sudo pacman -Syu --noconfirm --needed \
|
||||
xorg-server xorg-xinit libx11 libxft libxinerama yajl
|
||||
;;
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Fedora (dnf)
|
||||
# ---------------------------------------------------------------
|
||||
fedora)
|
||||
info "Using dnf to install dependencies..."
|
||||
sudo dnf install -y \
|
||||
libX11-devel libXft-devel libXinerama-devel yajl-devel \
|
||||
xorg-x11-server-Xorg xorg-x11-xinit
|
||||
;;
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# RHEL / CentOS / Rocky / Alma (dnf/yum)
|
||||
# ---------------------------------------------------------------
|
||||
rhel|centos|rocky|alma)
|
||||
info "Using dnf (or yum) to install dependencies..."
|
||||
sudo dnf install -y \
|
||||
libX11-devel libXft-devel libXinerama-devel yajl-devel \
|
||||
xorg-x11-server-Xorg xorg-x11-xinit
|
||||
;;
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# openSUSE / SUSE (zypper)
|
||||
# ---------------------------------------------------------------
|
||||
opensuse*|suse|sle*)
|
||||
info "Using zypper to install dependencies..."
|
||||
sudo zypper refresh
|
||||
sudo zypper install -y \
|
||||
libX11-devel libXft-devel libXinerama-devel libyajl-devel \
|
||||
xorg-x11-server xinit
|
||||
;;
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Mageia / OpenMandriva (urpmi or dnf in some versions)
|
||||
# ---------------------------------------------------------------
|
||||
mageia|openmandriva)
|
||||
# Mageia uses urpmi
|
||||
if command -v urpmi &>/dev/null; then
|
||||
info "Using urpmi to install dependencies..."
|
||||
sudo urpmi.update -a
|
||||
sudo urpmi --auto \
|
||||
lib64x11-devel lib64xft-devel lib64xinerama-devel lib64yajl-devel \
|
||||
xinit x11-server-xorg
|
||||
else
|
||||
# Some derivatives might use dnf
|
||||
warn "urpmi not found. Trying dnf..."
|
||||
sudo dnf install -y \
|
||||
libX11-devel libXft-devel libXinerama-devel yajl-devel \
|
||||
xorg-x11-server-Xorg xorg-x11-xinit
|
||||
fi
|
||||
;;
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# PCLinuxOS (apt-rpm? Synaptic? Hard to detect. Possibly uses urpmi.)
|
||||
# ---------------------------------------------------------------
|
||||
pclinuxos)
|
||||
warn "PCLinuxOS uses apt-rpm or Synaptic. Attempting apt-get..."
|
||||
sudo apt-get update || true
|
||||
sudo apt-get install -y \
|
||||
libx11-dev libxft-dev libxinerama-dev libyajl-dev \
|
||||
xorg xinit || {
|
||||
error "Failed apt-get on PCLinuxOS. Please install manually."
|
||||
exit 1
|
||||
}
|
||||
;;
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Slackware (slackpkg)
|
||||
# Slackware typically includes dev headers by default, but let's try:
|
||||
# slackpkg update
|
||||
# slackpkg install xorg x11 x11-devel etc.
|
||||
# Slackware doesn’t always break them into separate -dev packages.
|
||||
# If you have the Slackware DVD, you may need to install the "X"
|
||||
# series and "D" (development) series fully.
|
||||
# We'll attempt partial coverage:
|
||||
# ---------------------------------------------------------------
|
||||
slackware)
|
||||
warn "Slackware detection. Attempting 'slackpkg' usage..."
|
||||
# We’ll do a best-effort. Might require manual steps:
|
||||
sudo slackpkg update || true
|
||||
# There might not be exact package naming for dev libs.
|
||||
warn "Please ensure X, x11 dev, xinerama dev, xft dev, and yajl dev are installed from Slackware's 'X' and 'D' series. Attempting partial installation..."
|
||||
# Slackpkg might not have granularity for these. We'll try:
|
||||
sudo slackpkg install x11 xorg || true
|
||||
# Yajl might be in SlackBuilds or might already be included.
|
||||
success "Slackware can be tricky. Check your installed packages or SlackBuild for Yajl if needed."
|
||||
;;
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Gentoo / Funtoo / Sabayon / Calculate (emerge or equo for Sabayon)
|
||||
# ---------------------------------------------------------------
|
||||
gentoo|funtoo)
|
||||
info "Using emerge for Gentoo/Funtoo..."
|
||||
sudo emerge --sync
|
||||
# On Gentoo, you might set USE flags. We'll do a minimal approach:
|
||||
# The relevant packages might be x11-libs/libX11, x11-libs/libXft,
|
||||
# x11-libs/libXinerama, dev-libs/yajl, x11-base/xorg-server, x11-apps/xinit
|
||||
sudo emerge -n \
|
||||
x11-libs/libX11 x11-libs/libXft x11-libs/libXinerama dev-libs/yajl \
|
||||
x11-base/xorg-server x11-apps/xinit
|
||||
;;
|
||||
|
||||
sabayon)
|
||||
info "Sabayon (now part of MocaccinoOS?), using 'equo' or 'emerge'..."
|
||||
if command -v equo &>/dev/null; then
|
||||
sudo equo update
|
||||
sudo equo install \
|
||||
x11-libs/libX11 x11-libs/libXft x11-libs/libXinerama dev-libs/yajl \
|
||||
xorg-server xinit
|
||||
else
|
||||
warn "No 'equo'. Trying emerge..."
|
||||
sudo emerge -n \
|
||||
x11-libs/libX11 x11-libs/libXft x11-libs/libXinerama dev-libs/yajl \
|
||||
x11-base/xorg-server x11-apps/xinit
|
||||
fi
|
||||
;;
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Void (xbps)
|
||||
# ---------------------------------------------------------------
|
||||
void)
|
||||
info "Using xbps-install for Void..."
|
||||
sudo xbps-install -S
|
||||
sudo xbps-install -y \
|
||||
libX11-devel libXft-devel libXinerama-devel yajl-devel \
|
||||
xorg xorg-server xinit
|
||||
;;
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Alpine (apk)
|
||||
# ---------------------------------------------------------------
|
||||
alpine)
|
||||
info "Using apk for Alpine..."
|
||||
sudo apk update
|
||||
sudo apk add \
|
||||
libx11-dev libxft-dev libxinerama-dev yajl-dev \
|
||||
xorg-server xinit
|
||||
;;
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# NixOS
|
||||
# On NixOS, you generally manage environment/system packages in
|
||||
# configuration.nix or use `nix-env -iA`.
|
||||
# ---------------------------------------------------------------
|
||||
nixos)
|
||||
warn "NixOS detected. Attempting 'nix-env -iA nixpkgs.packageName'..."
|
||||
warn "You may want to manage this in /etc/nixos/configuration.nix."
|
||||
nix-env -iA nixpkgs.libX11 nixpkgs.libXft nixpkgs.libXinerama nixpkgs.yajl nixpkgs.xorg.xorgserver nixpkgs.xorg.xinit
|
||||
;;
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Clear Linux (swupd)
|
||||
# ---------------------------------------------------------------
|
||||
clear-linux*|clearlinux)
|
||||
info "Clear Linux detected. Using swupd..."
|
||||
sudo swupd update
|
||||
sudo swupd bundle-add \
|
||||
x11-tools os-core-dev C-basic libsdl devpkg-yajl # best guess
|
||||
warn "Ensure xorg-server and xinit equivalents are installed in Clear Linux (bundles)."
|
||||
;;
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Solus (eopkg)
|
||||
# ---------------------------------------------------------------
|
||||
solus)
|
||||
info "Solus detected. Using eopkg..."
|
||||
sudo eopkg update-repo
|
||||
sudo eopkg install -y \
|
||||
libx11-devel libxft-devel libxinerama-devel yajl-devel \
|
||||
xorg-server xorg-xinit
|
||||
;;
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# If we get here, we don't have a recognized distro or ID is missing
|
||||
# We'll attempt a generic approach or just print instructions.
|
||||
# ---------------------------------------------------------------
|
||||
*)
|
||||
error "Unrecognized or unsupported Linux distro: '$distro'"
|
||||
echo
|
||||
echo "Please manually install the following packages for your distro's package manager:"
|
||||
echo " * X11 development libraries (libX11, dev headers)"
|
||||
echo " * Xft (libXft) with dev headers"
|
||||
echo " * Xinerama (libXinerama) with dev headers"
|
||||
echo " * Yajl (libyajl) with dev headers"
|
||||
echo " * xorg-server / xinit"
|
||||
echo "Then you can compile dwm."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
success "Dependency installation complete for distro: $distro"
|
||||
}
|
||||
|
||||
#----------------------------------------------
|
||||
# Install function for BSD
|
||||
#----------------------------------------------
|
||||
install_deps_bsd() {
|
||||
local bsdName="$1"
|
||||
info "Detected $bsdName..."
|
||||
|
||||
case "$bsdName" in
|
||||
FreeBSD)
|
||||
# FreeBSD typically uses pkg
|
||||
sudo pkg update
|
||||
sudo pkg install -y \
|
||||
libX11 libXft libXinerama yajl xorg xorg-server xinit
|
||||
;;
|
||||
OpenBSD)
|
||||
# OpenBSD uses pkg_add. Checking package names can be tricky,
|
||||
# they might be named slightly differently, e.g., "xbase" might
|
||||
# be part of the OS sets. We'll do a best effort here:
|
||||
# Usually X is part of base for OpenBSD. We'll just do the libs:
|
||||
# Some packages might be named e.g. `xenocara-libX11`, etc. This is approximate.
|
||||
sudo pkg_add xbase xfont xserv # might already be installed
|
||||
sudo pkg_add xorg # might include many components
|
||||
# For dev libraries:
|
||||
sudo pkg_add x11 x11-fmw xft # approximate
|
||||
# Yajl is often just "yajl"
|
||||
sudo pkg_add yajl
|
||||
;;
|
||||
NetBSD)
|
||||
# NetBSD might use pkgin or pkg_add from pkgsrc
|
||||
if command -v pkgin &>/dev/null; then
|
||||
sudo pkgin update
|
||||
sudo pkgin -y install libX11 libXft libXinerama yajl xorg
|
||||
else
|
||||
# fallback to pkg_add
|
||||
warn "pkgin not found, trying pkg_add for NetBSD..."
|
||||
# Typically you set PKG_PATH, etc. This is a best guess
|
||||
sudo pkg_add libX11 libXft libXinerama yajl xorg
|
||||
fi
|
||||
;;
|
||||
DragonFlyBSD)
|
||||
# DragonFly also uses pkg (like FreeBSD).
|
||||
# Some packages might differ in naming:
|
||||
sudo pkg update
|
||||
sudo pkg install -y \
|
||||
xorg libX11 libXft libXinerama yajl
|
||||
;;
|
||||
*)
|
||||
warn "Generic BSD fallback: Please install X11 dev, Xft dev, Xinerama dev, Yajl dev, xinit, xserver from your BSD's packages/ports."
|
||||
;;
|
||||
esac
|
||||
|
||||
success "Finished (attempted) dependency installation on $bsdName."
|
||||
}
|
||||
|
||||
#----------------------------------------------
|
||||
# Install function for macOS
|
||||
#----------------------------------------------
|
||||
install_deps_macos() {
|
||||
info "Detected macOS (Darwin)."
|
||||
|
||||
# You cannot truly replace the macOS window manager with dwm.
|
||||
# You *can* compile it and run it under an X server (e.g. XQuartz).
|
||||
# So we’ll attempt to install the relevant libraries via Homebrew.
|
||||
|
||||
if ! command -v brew &>/dev/null; then
|
||||
error "Homebrew is not installed. Please install Homebrew from https://brew.sh."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Install XQuartz from cask (optional), plus libs
|
||||
brew update
|
||||
brew install pkg-config xorg libx11 libxft libxinerama yajl
|
||||
|
||||
# For an X server, often you can do:
|
||||
brew install --cask xquartz
|
||||
|
||||
success "macOS libs installed via Homebrew. Remember: you can’t fully replace the macOS WM with dwm!"
|
||||
}
|
||||
|
||||
#----------------------------------------------
|
||||
# Install function for SunOS / Solaris / illumos
|
||||
#----------------------------------------------
|
||||
install_deps_sunos() {
|
||||
info "Detected SunOS (Solaris/illumos)."
|
||||
# This can vary widely. Some illumos-based distros use "pkg" (OpenIndiana),
|
||||
# some use "pkgin" (SmartOS), some use "pkgutil" (OpenCSW on Solaris),
|
||||
# or "apt-like" commands in certain forks.
|
||||
|
||||
# We'll guess for OpenIndiana (pkg):
|
||||
# "pfexec" is typically used in place of sudo for Solaris derivatives.
|
||||
# This is extremely approximate:
|
||||
|
||||
if command -v pfexec &>/dev/null; then
|
||||
# Attempt OpenIndiana approach:
|
||||
pfexec pkg refresh
|
||||
pfexec pkg install x11/header x11/library/libx11 x11/library/libxft \
|
||||
x11/library/libxinerama library/yajl \
|
||||
x11/server/xorg x11/session/xinit
|
||||
else
|
||||
# fallback approach
|
||||
warn "No pfexec found. Trying 'sudo pkg' or 'sudo pkgutil'."
|
||||
if command -v pkg &>/dev/null; then
|
||||
sudo pkg refresh || true
|
||||
sudo pkg install x11/header x11/library/libx11 x11/library/libxft \
|
||||
x11/library/libxinerama library/yajl \
|
||||
x11/server/xorg x11/session/xinit || {
|
||||
error "Solaris/illumos install attempt failed. Install these packages manually."
|
||||
}
|
||||
elif command -v pkgutil &>/dev/null; then
|
||||
# Possibly using OpenCSW on Solaris
|
||||
sudo pkgutil -U
|
||||
sudo pkgutil -i \
|
||||
libx11_dev libxft_dev libxinerama_dev yajl_dev xorg xinit || {
|
||||
error "Could not install via pkgutil. Please do it manually."
|
||||
}
|
||||
else
|
||||
error "No recognized pkg tool on Solaris/illumos. Please install manually."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
success "Finished attempted install on SunOS/illumos. This might require manual verification."
|
||||
}
|
||||
|
||||
#----------------------------------------------
|
||||
# Windows approach
|
||||
#----------------------------------------------
|
||||
install_deps_windows() {
|
||||
info "Detected Windows environment (Cygwin/Mingw/MSYS)."
|
||||
# You cannot replace the Windows manager with dwm. You can compile and run it
|
||||
# in an X server environment (like VcXsrv or Xming or MobaXterm).
|
||||
#
|
||||
# Option 1: WSL (Windows Subsystem for Linux):
|
||||
# If running in WSL, you’re effectively on a Linux environment, so you'd want
|
||||
# to detect that as "Linux" (some older WSL might say "Microsoft" in /etc/os-release).
|
||||
# In that case, the user can do the standard Linux approach above.
|
||||
#
|
||||
# Option 2: MSYS2 / Cygwin with X packages:
|
||||
# For MSYS2: pacman -S xorg-server xorg-xinit xorgproto libX11-devel ...
|
||||
# For Cygwin: setup-x86_64.exe or "apt-cyg" might be used
|
||||
#
|
||||
# We'll attempt a best guess for MSYS2 (since it also uses pacman).
|
||||
# If it fails, we instruct manual steps.
|
||||
|
||||
if command -v pacman &>/dev/null; then
|
||||
# Probably MSYS2
|
||||
info "MSYS2 environment detected. Using pacman for MSYS2..."
|
||||
pacman -Syu --noconfirm --needed \
|
||||
mingw-w64-x86_64-xorgproto mingw-w64-x86_64-libx11 \
|
||||
mingw-w64-x86_64-libxft mingw-w64-x86_64-libxinerama \
|
||||
mingw-w64-x86_64-yajl
|
||||
success "MSYS2 pacman approach done. You still need to run an X server separately."
|
||||
else
|
||||
warn "No MSYS2 pacman found. Possibly Cygwin or something else. Please install X11 dev libs, X server, X init, Yajl manually using Cygwin setup or chocolatey, etc."
|
||||
warn "You CANNOT replace the Windows shell with dwm, only run it under an X server."
|
||||
fi
|
||||
}
|
||||
|
||||
#----------------------------------------------
|
||||
# Main script logic
|
||||
#----------------------------------------------
|
||||
|
||||
main() {
|
||||
check_root_or_sudo
|
||||
|
||||
local OS
|
||||
OS="$(detect_os)"
|
||||
|
||||
info "Operating System detected as: $OS"
|
||||
|
||||
case "$OS" in
|
||||
Linux)
|
||||
install_deps_linux
|
||||
;;
|
||||
FreeBSD|OpenBSD|NetBSD|DragonFlyBSD)
|
||||
install_deps_bsd "$OS"
|
||||
;;
|
||||
macOS)
|
||||
install_deps_macos
|
||||
;;
|
||||
SunOS)
|
||||
install_deps_sunos
|
||||
;;
|
||||
Windows)
|
||||
install_deps_windows
|
||||
;;
|
||||
*)
|
||||
error "Unsupported or unknown OS: $OS"
|
||||
echo "If you’re on an unsupported Linux distro, you can manually install these packages:"
|
||||
echo " libx11-dev, libxft-dev, libxinerama-dev, libyajl-dev, xserver, xinit"
|
||||
echo "If you’re on another BSD or obscure system, install the equivalents from your package manager."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
success "Script completed successfully!"
|
||||
echo "You should now have the libraries required to build dwm with your patches (where possible)."
|
||||
echo
|
||||
}
|
||||
|
||||
main "$@"
|
||||
|
||||
Reference in New Issue
Block a user