Makefile
author Oleksandr Gavenko <gavenkoa@gmail.com>
Fri, 08 Jan 2021 13:12:40 +0200
changeset 961 d7b4c9d10b92
parent 960 b4b2d30f6c97
child 962 88a1ce08b362
permissions -rw-r--r--
Collect and copy all files belonging to root of $HOME in one step. This speedups install in Cygwin: 7s => 5s.


################################################################
# Standard GNU Makefile settings.

SHELL = /bin/bash
.SHELLFLAGS = -xeuc
export PATH := /bin:/usr/bin:${PATH}

# Disable built in pattern rules.
MAKEFLAGS += -r
# Disable built in variables.
MAKEFLAGS += -R
# Disable built in suffix rules.
.SUFFIXES:
# Delete target file if command fails.
.DELETE_ON_ERROR:
# Default target.
.DEFAULT_GOAL = help

################################################################
# Config.

CFG_FILE := Makefile.cfg
include $(CFG_FILE)

# Override defaults.
CFG_LOCAL_FILE := Makefile.cfg.override
-include $(CFG_LOCAL_FILE)

################################################################
# Platform definition.

ifeq '' '$(HOME)'
  $(error HOME env var not set!)
endif

uname-s := $(shell uname -s)

host_os = linux
ifneq '' '$(filter CYGWIN%,$(uname-s))'
  host_os = cygwin
endif
ifeq 'SunOS' '$(uname-s)'
  host_os = solaris
endif

################################################################
# Build tool definition/switches.

INSTALL_DATA := install -m 640 -D
ifeq '$(host_os)' 'solaris'
  INSTALL_DATA := ginstall -m 640 -D
endif

RST2HTML = rst2html
ifeq '$(host_os)' 'cygwin'
  RST2HTML = rst2html.py
endif

################################################################
# Project dirs/files.

OVERRIDDEN_ITEMS := \
    .fvwm .xxkbrc .xmodmaprc .stalonetrayrc \
    .inputrc .Xdefaults .xinitrc .xserverrc \
    .screenrc .tmux.conf \
    .dircolors .colordiffrc \
    .env .bashrc .bash_completion .bash_completion.d .zshrc .vimrc .ssh \
    .pylintrc .pystartup .tclshrc .npmrc .guile \
    .gradle/init.d/springColorLogging.gradle \
    .sqshrc .psqlrc \
    .signature .muttrc .tidy \
    .dictrc \
    .hgrc .hgignore .hgstyle .bazaar .gitconfig .gitignore .cvsrc .quiltrc .quiltrc-dpkg \
    .gnupg \
    .ackrc .grc \
    .mplayer \
    .glhackrc
MANUALINSTALL_ITEMS = .mc
IFNONEXIST_ITEMS = .wgetrc .subversion

RST_FILES = $(wildcard *.rst)
HTML_FILES = $(RST_FILES:.rst=.html)

TARBALL_MINI := skel-mini.tar.gz

################################################################
# Build targets.

.PHONY: all
all:

.PHONY: dist-mini
dist-mini: $(TARBALL_MINI)

define TARBALL_MINI_DEPS
.bashrc .env .bash_completion \
.inputrc .dircolors \
.gitconfig .gitignore .hgrc .hgignore .hgstyle
endef

$(TARBALL_MINI): $(TARBALL_MINI_DEPS)
	tar zcf $(TARBALL_MINI) $(TARBALL_MINI_DEPS)

################################################################
# Install/uninstall targets.

.PHONY: install
.ONESHELL:
install:
	declare -a files
	for item in $(OVERRIDDEN_ITEMS); do
		if [[ -f $$item ]]; then
			if [[ $$item == */* ]]; then
				$(INSTALL_DATA) $$item $(HOME)/$$item
			else
				files+=($$item)
			fi
		elif [[ -d $$item ]]; then
			for file in `find $$item`; do
				if [[ -d $$file ]]; then
					mkdir -p $(HOME)/$$file
					continue
				fi
				$(INSTALL_DATA) $$file $(HOME)/$$file
			done
		fi
	done
	$(INSTALL_DATA) -t $(HOME) "$${files[@]}"
	chmod 700 ~/.gnupg/
	chmod a+x ~/.fvwm/FvwmKbdd.pl ~/.fvwm/xinit
	command -v fvwm || exit 0
	for f in /etc/xdg/menus/*.menu; do
		[[ -f "$$f" ]] || continue
		fname=$${f%.menu}
		fname=$${fname##*/}
		python .fvwm/xdg2fvwm.py Menu-$$fname $$f >~/.fvwm/$$fname.hook
		echo "Read $$[HOME]/.fvwm/$$fname.hook" >>~/.fvwm/config
		echo "AddToMenu MenuMyRoot $$fname Popup Menu-$$fname" >>~/.fvwm/config
	done
	mkdir -p ~/.screenshot
	for item in $(IFNONEXIST_ITEMS); do
		if [[ -f $$item ]] && ! [[ -f $(HOME)/$$item ]]; then
			$(INSTALL_DATA) $$item $(HOME)/$$item
		fi
		if [[ -d $$item ]]; then
			for file in `find $$item`; do
				if [[ -d $$file ]]; then
					mkdir -p $(HOME)/$$file
					continue
				fi
				if [[ ! -f $(HOME)/$$file ]]; then
					$(INSTALL_DATA) $$file $(HOME)/$$file
				fi
			done
		fi
	done
	chmod a+x ~/.xinitrc ~/.xserverrc
	rm -f ~/.xsession
	ln -s ~/.xinitrc ~/.xsession
	rm -f ~/.bash_profile
	cp ~/.bashrc ~/.bash_profile
	mkdir -p $(HOME)/.config/mc $(HOME)/.local/share/mc/
	umask 0117
	$(INSTALL_DATA) .local/share/mc/bashrc $(HOME)/.local/share/mc/
	cat .config/mc/mc.ext /etc/mc/mc.ext > $(HOME)/.config/mc/mc.ext
ifneq '' '$(filter $(host_os),cygwin linux)'
	if command -v file 1>/dev/null; then
		$(INSTALL_DATA) .magic $(HOME)
		cd $(HOME)
		file --compile -m .magic
	fi
endif
	mkdir -p $(HOME)/.local/share/applications/
	$(INSTALL_DATA) .local/share/applications/mimeapps.list $(HOME)/.local/share/applications/
	sed -e 's=@CFG_FONT_SIZE@=$(CFG_FONT_SIZE)=' <.minttyrc >$(HOME)/.minttyrc

.PHONY: uninstall
.ONESHELL:
uninstall:
	for item in $(OVERRIDDEN_ITEMS); do
		if [ -f $$item ]; then
			[ -f $(HOME)/$$file ] && rm -f $(HOME)/$$item
		fi
		if [ -d $$item ]; then
			for file in `find $$item -depth`; do
				if [ -d $$file ]; then
					rmdir $(HOME)/$$file || :
					continue
				fi
				[ -f $(HOME)/$$file ] && rm $(HOME)/$$file
			done
		fi
	done
	rm -f $(HOME)/.mc/bashrc $(HOME)/.mc/ini $(HOME)/.mc/bindings
	rmdir $(HOME)/.mc || :

################################################################
# Docs targets.

.PHONY: html
html: $(HTML_FILES)

# --stylesheet=rst.css
$(HTML_FILES): %.html: %.rst
	$(RST2HTML) $*.rst $@

################################################################
# Clean targets.

.PHONY: clean
clean:
	rm -f $(HTML_FILES) $(TARBALL)

.PHONY: distclean
distclean: clean

################################################################
# Helper target.

.PHONY: help
help:
	@echo
	@echo Supported targets:
	@sed -n -e '/^[[:alnum:]_-]*:/{s=^\(.*\):.*=  \1=;p;}' $(MAKEFILE_LIST)