HOME_TARGET ?= $(HOME) SYSTEM_DIRS := etc usr var opt boot PACKAGES := $(patsubst %/,%,$(wildcard */)) .PHONY: check-stow pull-updates unlink link check-stow: @command -v stow >/dev/null 2>&1 && { \ echo "✅ stow already installed"; \ exit 0; \ }; \ OS="$$(uname -s)"; \ @echo "📦 stow not found. Detected OS: $$OS"; \ case "$$OS" in \ Linux) \ if [ -f /etc/arch-release ]; then \ echo "-> Installing via pacman"; \ sudo pacman -S --needed stow; \ elif [ -f /etc/debian_version ]; then \ echo "-> Installing via apt"; \ sudo apt update && sudo apt install -y stow; \ else \ echo "❌ Unsupported Linux distro"; \ exit 1; \ fi \ ;; \ Darwin) \ @echo "-> Installing via Homebrew"; \ @command -v brew >/dev/null 2>&1 || { \ echo "❌ Homebrew not installed"; \ exit 1; \ }; \ @brew install stow \ ;; \ *) \ @echo "❌ Unsupported OS: $$OS"; \ exit 1; \ ;; \ esac pull-updates: @echo "Pulling all recent updates" @git pull origin main @git submodule update --recursive --remote unlink: @echo "Unlinking dotfiles to machine" @for pkg in $(PACKAGES); do \ echo ">>> Unstowing package: $$pkg"; \ for subdir in "$$pkg"/* "$$pkg"/.[!.]*; do \ [ -d "$$subdir" ] || continue; \ sub="$${subdir##*/}"; \ is_sys=0; \ for sys in $(SYSTEM_DIRS); do \ [ "$$sub" = "$$sys" ] && is_sys=1 && break; \ done; \ if [ "$$is_sys" -eq 1 ]; then \ echo " [SYSTEM] Unstowing $$pkg/$$sub from $$sub"; \ sudo stow -D -d "$$pkg" -t "/$$sub" "$$sub"; \ else \ echo " [USER] Unstowing $$pkg/$$sub from $(HOME_TARGET)/$$sub"; \ stow -D -d "$$pkg" -t "$(HOME_TARGET)/$$sub" "$$sub"; \ fi; \ done; \ done link: check-stow @echo "Linking dotfiles to machine" @for pkg in $(PACKAGES); do \ echo ">>> Processing package: $$pkg"; \ for subdir in "$$pkg"/* "$$pkg"/.[!.]*; do \ [ -d "$$subdir" ] || continue; \ sub="$${subdir##*/}"; \ is_sys=0; \ for sys in $(SYSTEM_DIRS); do \ [ "$$sub" == "$$sys" ] && is_sys=1 && break; \ done; \ if [ "$$is_sys" -eq 1 ]; then \ echo " [System] Stowing $$pkg/$$sub to $$sub"; \ sudo stow -d "$$pkg" -t "/$$sub" "$$sub"; \ else \ echo " [USER] Stowing $$pkg/$$sub to $(HOME_TARGET)/$$sub"; \ stow -d "$$pkg" -t "$(HOME_TARGET)/$$sub" "$$sub"; \ fi; \ done; \ done # # Define variables # HOME_TARGET ?= $(HOME) # # Space-separated list of directories that should go to the system root # SYSTEM_DIRS := etc usr var opt boot # # # Find all top-level directories in your dotfiles repo (e.g., 'systemd', 'nvim') # PACKAGES := $(patsubst %/,%,$(wildcard */)) # # .PHONY: all stow unstow # # all: stow # # stow: # @for pkg in $(PACKAGES); do \ # echo ">>> Processing package: $$pkg"; \ # for subdir in "$$pkg"/* "$$pkg"/.[!.]*; do \ # [ -d "$$subdir" ] || continue; \ # sub="$${subdir##*/}"; \ # is_sys=0; \ # for sys in $(SYSTEM_DIRS); do \ # [ "$$sub" = "$$sys" ] && is_sys=1 && break; \ # done; \ # if [ "$$is_sys" -eq 1 ]; then \ # echo " [System] Stowing $$pkg/$$sub to /$$sub"; \ # sudo mkdir -p "/$$sub"; \ # sudo stow -d "$$pkg" -t "/$$sub" "$$sub"; \ # else \ # echo " [User] Stowing $$pkg/$$sub to $(HOME_TARGET)/$$sub"; \ # mkdir -p "$(HOME_TARGET)/$$sub"; \ # stow -d "$$pkg" -t "$(HOME_TARGET)/$$sub" "$$sub"; \ # fi; \ # done; \ # done # # unstow: # @for pkg in $(PACKAGES); do \ # echo ">>> Unstowing package: $$pkg"; \ # for subdir in "$$pkg"/* "$$pkg"/.[!.]*; do \ # [ -d "$$subdir" ] || continue; \ # sub="$${subdir##*/}"; \ # is_sys=0; \ # for sys in $(SYSTEM_DIRS); do \ # [ "$$sub" = "$$sys" ] && is_sys=1 && break; \ # done; \ # if [ "$$is_sys" -eq 1 ]; then \ # echo " [System] Unstowing $$pkg/$$sub from /$$sub"; \ # sudo stow -D -d "$$pkg" -t "/$$sub" "$$sub"; \ # else \ # echo " [User] Unstowing $$pkg/$$sub from $(HOME_TARGET)/$$sub"; \ # stow -D -d "$$pkg" -t "$(HOME_TARGET)/$$sub" "$$sub"; \ # fi; \ # done; \ # done