dotfiles/Makefile

405 lines
12 KiB
Makefile

UNAME := $(shell sh -c 'uname 2>/dev/null || echo Unknown')
ifeq ($(OS),Windows_NT)
UNAME := Windows
endif
FILE_SUFFIX := linux
SYMLINK := ln -s
CURRENT_DIR := $(shell pwd)
ifeq ($(DOTFILES_CI), 1)
DOTFILES_DIR := $(CURRENT_DIR)
EXTRA_CI_MESSAGE := (CI)
else
DOTFILES_DIR := $(HOME)/.dotfiles
EXTRA_CI_MESSAGE :=
endif
SCRIPTS_DIR := $(DOTFILES_DIR)/bin
SYMLINKS_DIR := $(DOTFILES_DIR)/symlinks
BACKUP_DIR := $(HOME)/.local/share/dotfiles_backup
SSH_KEYS_HOME := $(HOME)/.ssh
SSH_CONFIG_FILE := $(SSH_KEYS_HOME)/config
PERSONAL_SSH_KEYS_HOME := $(SSH_KEYS_HOME)/Personal
SCRIPTS_CACHE_DIR := $(HOME)/.local/share/script_cache
SCRIPTS_UTILS_DIR := $(HOME)/.local/opt/script_utils
PROJECTS_ROOT := $(HOME)/Projects
DOCUMENTS_ROOT := $(HOME)/Documents
PICTURES_ROOT := $(HOME)/Pictures
SCREENSHOTS_ROOT := $(PICTURES_ROOT)/Screenshots
WALLPAPERS_ROOT := $(PICTURES_ROOT)/Wallpapers
LOCKSCREENS_ROOT := $(PICTURES_ROOT)/Lockscreens
PERSONAL_PROJECTS_ROOT := $(PROJECTS_ROOT)/Personal
PRACTICE_PROJECTS_ROOT := $(PERSONAL_PROJECTS_ROOT)/Mixed\ Technology/Practice
COPY_TOOL := pbcopy
ifeq ($(UNAME), Linux)
FILE_SUFFIX := linux
COPY_TOOL := xclip -selection clipboard
link: link_all_linux
bootstrap: bootstrap_linux
endif
ifeq ($(UNAME), Windows)
FILE_SUFFIX :=
COPY_TOOL :=
bootstrap: bootstrap_windows
endif
ifeq ($(UNAME), Darwin)
FILE_SUFFIX := mac
COPY_TOOL := pbcopy
link: link_all_mac
bootstrap: bootstrap_mac
endif
ifeq ($(UNAME), Unknown)
check_os: fail_with_unknown_host
endif
ifneq ($(DOTFILES_DIR), $(CURRENT_DIR))
check_os: fail_with_bad_dotfiles_location
endif
# Creates a new symlink in home dir and backs up existing file
# Expects file to be located in symlinks directory
# Takes 2 parameters:
# - Symlink file name (as defined in symlinks directory)
# - Name of file in home directory
define link
@echo "Moving $2 from $(HOME) to $(BACKUP_DIR)"
@mv $(HOME)/$2 $(BACKUP_DIR)/ || true
@echo "Creating symlink to $2 in $(HOME)"
@$(SYMLINK) $(SYMLINKS_DIR)/$1 $(HOME)/$2
endef
# Writes new ssh config entry
# Takes 3 parameters:
# - Host (ex. github.com)
# - Host prefix (to prevent conflicts between different keys for same host)
# - Path to private key
define write_git_ssh_config_entry
@echo "" >> $(SSH_CONFIG_FILE)
@echo "Host $2$1" >> $(SSH_CONFIG_FILE)
@echo " AddKeysToAgent yes" >> $(SSH_CONFIG_FILE)
@echo " UseKeychain yes" >> $(SSH_CONFIG_FILE)
@echo " HostName $1" >> $(SSH_CONFIG_FILE)
@echo " User git" >> $(SSH_CONFIG_FILE)
@echo " IdentityFile $3" >> $(SSH_CONFIG_FILE)
endef
# Creates a new ssh key and saves it to config
# Takes 3 parameters:
# - Email
# - Host name (ex. codeberg)
# - Host (ex. codeberg.org)
define create_personal_git_ssh_key
ssh-keygen -f $(PERSONAL_SSH_KEYS_HOME)/id_ed25519_$2 -t ed25519 -b 4096 -C $1
@echo "Personal $2 key created!"
@echo "Copy public key by running:"
@echo ""
@echo "cat $(PERSONAL_SSH_KEYS_HOME)/id_ed25519_$2.pub | $(COPY_TOOL)"
@echo ""
@echo "Open SSH page on $3"
@echo "and paste copied public key"
$(call write_git_ssh_config_entry,$3,,$(PERSONAL_SSH_KEYS_HOME)/id_ed25519_$2)
endef
.PHONY: bootstrap
bootstrap: check_os
@echo "Bootstrapped everything!"
.PHONY: bootstrap_windows
bootstrap_windows: check_os
@windows\bootstrap_windows.bat
@echo "Bootstrapped windows!"
.PHONY: bootstrap_linux
bootstrap_linux: check_os link bootstrap_common
@echo "Bootstrapped linux components!"
.PHONY: bootstrap_mac
bootstrap_mac: check_os link bootstrap_common oh_my_zsh homebrew install_brew_basics setup_mac_screenshots
@echo "Bootstrapped mac components!"
.PHONY: bootstrap_common
bootstrap_common: check_os link_all_common prepare_projects_dir prepare_screenshots_dir prepare_scripts_cache_dir install_vim install_asdf alacritty_terminfo
@echo "Bootstrapped common components!"
.PHONY: link
link: check_os clean_backup prepare_backup_dir
@echo "Linked everything!"
.PHONY: link_all_common
link_all_common: check_os link_bin link_tmux link_screen link_git link_ctags link_vim link_apps_config link_tool_versions link_profile link_bash link_zsh
@echo "Linked common files!"
.PHONY: link_all_mac
link_all_mac: check_os link_all_common
@echo "Linked mac files!"
.PHONY: link_all_linux
link_all_linux: check_os link_all_common link_xconfig link_i3config
@echo "Linked linux files!"
.PHONY: link_tmux
link_tmux: check_os
@echo "Linking tmux files..."
$(call link,tmux.conf,.tmux.conf)
.PHONY: link_screen
link_screen: check_os
@echo "Linking screen files..."
$(call link,screenrc,.screenrc)
.PHONY: link_git
link_git: check_os
@echo "Linking git files..."
$(call link,gitignore,.gitignore)
$(call link,gitconfig,.gitconfig)
$(call link,gitconfig.optimum,.gitconfig.optimum)
.PHONY: link_ctags
link_ctags: check_os
@echo "Linking ctags files..."
$(call link,ctags,.ctags)
.PHONY: link_vim
link_vim: check_os
@echo "Linking vim files..."
$(call link,vim,.vim)
$(call link,ideavimrc,.ideavimrc)
$(call link,vsvimrc,.vsvimrc)
.PHONY: link_apps_config
link_apps_config: check_os
@echo "Linking apps config files..."
$(call link,config,.config)
.PHONY: link_script_utils
link_script_utils: check_os
@echo "Linking script_utils files..."
@mkdir -p $(SCRIPTS_UTILS_DIR)
$(call link,script_utils,.local/opt/script_utils)
.PHONY: link_tool_versions
link_tool_versions: check_os
@echo "Linking tool-versions file for asdf"
$(call link,tool-versions,.tool-versions)
$(call link,config/asdf/.default-gems,.default-gems)
.PHONY: link_profile
link_profile: check_os
@echo "Linking profile... (Don't forget to reboot or relogin due to .profile changes)"
$(call link,profile.$(FILE_SUFFIX),.profile)
.PHONY: link_bash
link_bash: check_os
@echo "Linking bash files..."
$(call link,bashrc,.bashrc)
.PHONY: link_zsh
link_zsh: check_os
@echo "Linking zsh files..."
$(call link,zshrc.$(FILE_SUFFIX),.zshrc)
.PHONY: link_bin
link_bin: check_os
@echo "Linking bin script files..."
$(call link,bin,bin)
.PHONY: link_termux
link_termux: check_os link_apps_config
@echo "Linking termux config files..."
$(call link,config/termux,.termux)
.PHONY: link_xconfig
link_xconfig: check_os
@echo "Linking X config files..."
$(call link,zprofile,.zprofile)
.PHONY: link_i3config
link_i3config: check_os link_xconfig link_apps_config
@echo "Linking i3 config files..."
# TODO Parametrize projects dir creation and automate gitconfig setup
.PHONY: prepare_projects_dir
prepare_projects_dir: check_os
@echo "Creating projects directories"
@mkdir -p $(PERSONAL_PROJECTS_ROOT)
@mkdir -p $(PROJECTS_ROOT)/Optimum
@mkdir -p $(DOCUMENTS_ROOT)/Personal
@mkdir -p $(DOCUMENTS_ROOT)/Optimum
@mkdir -p $(PRACTICE_PROJECTS_ROOT)
.PHONY: prepare_scripts_cache_dir
prepare_scripts_cache_dir: check_os
@echo "Creating scripts cache directory"
@mkdir -p $(SCRIPTS_CACHE_DIR)
.PHONY: clone_personal_vimwiki
clone_personal_vimwiki: check_os
@echo "Cloning personal vimwiki"
@git clone git@ensarsarajcic.com:esensar/vimwiki.wiki.git ~/vimwiki
.PHONY: clone_termux_shortcuts
clone_termux_shortcuts: check_os
@echo "Cloning termux shortcuts"
@git clone git@ensarsarajcic.com:esensar/termux-shortcuts.git ~/.shortcuts
.PHONY: prepare_ssh_dir
prepare_ssh_dir: check_os
@echo "Creating ssh directories"
@mkdir -p $(HOME)/.ssh/Personal
.PHONY: create_personal_ssh_keys
.ONESHELL:
create_personal_ssh_keys: check_os prepare_ssh_dir
@echo "Creating personal ssh keys"
@read -p "Enter your email: " email;
$(call create_personal_git_ssh_key,$$email,personal_git,git.ensarsarajcic.com);
$(call create_personal_git_ssh_key,$$email,codeberg,codeberg.org);
$(call create_personal_git_ssh_key,$$email,sourcehut,git.sr.ht);
$(call create_personal_git_ssh_key,$$email,github,github.com);
.PHONY: prepare_fish_shell
prepare_fish_shell: check_os
@echo "Preparing fish shell..."
@echo "Installing omf framework"
@curl -L -k https://get.oh-my.fish | fish
@echo "Install foreign-env to enable .profile in fish by running:"
@echo ""
@echo "omf install foreign-env"
@echo ""
.PHONY: prepare_screenshots_dir
prepare_screenshots_dir: check_os
@echo "Creating screenshots directories"
@mkdir -p $(SCREENSHOTS_ROOT)
.PHONY: setup_mac_screenshots
setup_mac_screenshots: check_os prepare_screenshots_dir
@echo "Configuring mac screenshots default location ($(SCREENSHOTS_ROOT))"
@defaults write com.apple.screencapture location $(SCREENSHOTS_ROOT)
.PHONY: install_brew_basics
install_brew_basics: homebrew check_os
@echo "Installig basic brew packages..."
@brew bundle --file $(DOTFILES_DIR)/installed_packages/core/Brewfile
.PHONY: install_asdf
install_asdf: check_os
@echo "Installing ASDF VM..."
@git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.0
@echo "Installed ASDF Version 0.10.0"
@echo "To install latest version:"
@echo ""
@echo "cd ~/.asdf"
@echo "git fetch"
@echo "git checkout \"$$\(git describe --abbrev=0 --tags\)\""
@echo ""
@echo "Consider installing configured ASDF tools:"
@echo ""
@echo ""
@echo "Run in home directory:"
@echo "asdf install"
@echo ""
@echo ""
@echo "Consider installing ASDF plugins:"
@echo "=================================="
@echo "DIRENV:"
@echo "----------------------------------"
@echo "asdf plugin-add direnv"
@echo "asdf install direnv latest"
@echo ""
@echo "Check out installed version using: "
@echo "asdf list direnv"
@echo ""
@echo "Configure it as global using: "
@echo "asdf global direnv $$version"
@echo ""
@echo "Configure it with provided function:"
@echo "asdf direnv setup --shell fish --version latest"
@echo ""
@echo "When using in projects, put the following in .envrc: "
@echo "use asdf"
@echo "=================================="
@echo ""
.PHONY: install_exercism
install_exercism: check_os
@echo "Installing exercism..."
@wget -O /tmp/exercism.tar.gz https://github.com/exercism/cli/releases/download/v3.0.13/exercism-3.0.13-linux-x86_64.tar.gz
@tar -xf /tmp/exercism.tar.gz -C /tmp
@mv /tmp/exercism ~/.local/bin/
@read -p "Enter your exercism API KEY (https://exercism.org/settings/api_cli): " apikey;
@echo "Configuring exercism..."
exercism configure --token="$$apikey" --workspace="~/Projects/Personal/Mixed Technology/Practice/exercism"
.PHONY: install_vim
install_vim: check_os link_vim
@echo "Vim package installation is no longer done automatically!"
@echo "Start Vim or NeoVim and run:"
@echo "For NeoVim: :PackerInstall"
@echo "For Vim: :PlugInstall"
.PHONY: check_neovim
check_neovim: check_os
@echo "This expects that packer is already installed"
@echo "Installing packer packages"
@nvim --headless -c 'autocmd User PackerComplete quitall' -c 'PackerInstall'
@echo "Doing a basic neovim startup and quit"
@nvim --headless -c 'set display-=msgsep' -c 'quitall'
@echo "Running plenary tests"
@nvim --headless -c 'set display-=msgsep' -c 'PlenaryBustedDirectory symlinks/config/nvim/lua/tests'
.PHONY: run_tests
run_tests: check_os
@echo "Running all tests from tests/"
@./tests/run_all
.PHONY: oh_my_zsh
oh_my_zsh: check_os
@echo "Installing oh-my-zsh..."
@sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
.PHONY: oh_my_fish
oh_my_fish: check_os
@echo "Installing oh-my-fish..."
@curl https://raw.githubusercontent.com/oh-my-fish/oh-my-fish/master/bin/install | fish
@fish -c "omf install"
.PHONY: wallpapers_and_lockscreens
wallpapers_and_lockscreens: check_os
@echo "Copying default wallpapers and lockscreens..."
@mkdir -p $(WALLPAPERS_ROOT)
@mkdir -p $(LOCKSCREENS_ROOT)
@cp /usr/share/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png $(WALLPAPERS_ROOT)
@cp /usr/share/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png $(LOCKSCREENS_ROOT)
.PHONY: homebrew
homebrew: check_os
@echo "Installing homebrew..."
@/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
.PHONY: alacritty_terminfo
alacritty_terminfo: check_os
@echo "Installing alacritty terminfo..."
@echo tic $(SYMLINKS_DIR)/alacritty/alacritty.terminfo
.PHONY: prepare_backup_dir
prepare_backup_dir: check_os
@echo "Creating $(BACKUP_DIR)"
@mkdir -p $(BACKUP_DIR)
.PHONY: clean_backup
clean_backup: check_os
@echo "Deleting $(BACKUP_DIR)"
@rm -r $(BACKUP_DIR) || true
.PHONY: check_os
check_os:
@echo "Running on $(UNAME)$(EXTRA_CI_MESSAGE)"
.PHONY: fail_with_unknown_host
fail_with_unknown_host:
$(error Unkown host system!)
.PHONY: fail_with_bad_dotfiles_location
fail_with_bad_dotfiles_location:
$(error Bad dotfiles location! Ensure dotfiles directory is found in $(DOTFILES_DIR)!)