141 lines
4.0 KiB
Makefile
141 lines
4.0 KiB
Makefile
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
|