prezto/Makefile

114 lines
4.8 KiB
Makefile
Executable file

#!/usr/bin/make shebang
# _ ____ _
# _ __ _ __ ___ ___| |_ ___ | _ \ ___ ___| | _____ _ __
# | '_ \| '__/ _ \_ / __/ _ \ _____| | | |/ _ \ / __| |/ / _ \ '__|
# | |_) | | | __// /| || (_) |_____| |_| | (_) | (__| < __/ |
# | .__/|_| \___/___|\__\___/ |____/ \___/ \___|_|\_\___|_|
# |_|
# h@h-lo.me 20191025 004745 -0700 PDT 1571989665 d(-_- )b...
# This makefile automates image building and container management
# for easy development of prezto and prezto-plugins without messing
# up your current configuration. Prezto is installed fresh on an
# alpine container, where you may add your edits
#
#######################################################################
# REPO and IMG define the TAG for our image. this is how it gets named
# when pushed to dockerhum. REPO should be your dockerhub username
# IMG would be nice if its related to the project.
REPO = hlecuanda
IMG = prezto-dev
TAG = $(REPO)/$(IMG)
# ALLCODE recirds all code files so we can have the docker image
# depend on all of them. if any file changes, the image gets rebuilt
ALLCODE != find . -type f | grep -vEe '^\./\.+|*.md'
RUNCOMS != ls runcoms
# The context is the current directory. this is important if you have
# a buildserver, v.gr on gitlab or google cloud. its still needed for
# local builds. so don't touch this, unless you know what you're doing
CONTEXT = .
# All reciipes on this makefile are zsh scripts, not bash or sh
# scripts, so we don't have to be context-switching
SHELL = zsh
# This removes the default build rules for gmake's built in suffixes
# when debugging the Makefile, output is a lot more readable, plus
# if you're not making C programs, it just makes sense to avoid
# mistery bugs
.SUFFIXES =
# We don't want to fail recipies on error for the targets if .IGNORE
.IGNORE: clean realclean ;
# These targets don't create files and are defined for convenience.
# note that other targets do create real files which are used to
# determine the state of the build
.PHONY: default run clean realclean ;
# an empty recipe, to avoid expensive operations if we "make" by
# mistake. it can be made to depend on another target and it will
# become the target of a "make" call with no arguments, vg.r:
# default: image; results in "make" and "make image" doing the same
default: ;
# a user callable target, depends on .container/image whiech records
# the timestamp of the last successfuly built image
image: .container/image ;
# we declare .container/image to depend on $(ALLCODE) which contains
# all files in the distribution. thus, if ANY file changes, it makes
# our image obsolete and will be re-made on next make command
.container/image: $(ALLCODE)
docker build -t $(TAG) $(CONTEXT)
[[ ! -d .container ]] && mkdir .container || :
touch $@
# NOTE: The following targets ( .homercs clone and .clone ) are
# run inside the container while building a container image. They are
# called from the Dockerfile when you "make image". .homercs creates
# the dotfiles on our home directory and depends on .clone, so .clone
# should be made before .homercs. We're spelling these out explicitly
# for clarity instead of using Makefile enchantments that would make
# this a 2 line recipe
.homercs: .clone
ln -s .zprezto/runcoms/zshenv /home/prezto/.zshenv
ln -s .zprezto/runcoms/zprofile /home/prezto/.zprofile
ln -s .zprezto/runcoms/zshrc /home/prezto/.zshrc
ln -s .zprezto/runcoms/zpreztorc /home/prezto/.zpreztorc
ln -s .zprezto/runcoms/zlogin /home/prezto/.zlogin
ln -s .zprezto/runcoms/zlogout /home/prezto/.zlogout
touch $@
# clones the prezto repository we have copied from the build context
# into the container, into a .zprezto directory, as the installation
# instructions recommend.
.clone:
git clone --recursive src .zprezto
touch $@
# This runs an interactive (-it) ephemeral (--rm) container named
# $(IMG) created from the image stored at $(TAG) it is made to depend
# on container/image so that it checks whether image is up to # date.
# Given that image depends on $(ALLCODE), calling "make run" will use
# the latest image, unless any code file hasa changed in which case,
# the image is rebuilt and then run.
run: .container/image
docker run -it --rm -h $(IMG) --name $(IMG) $(TAG)
# Removes the current container and image, so we can build a new one
# from scratch. If you want a real clean slate, then "make realclean"
clean:
docker container rm $(TAG)
docker image rm $(TAG)
rm -fv .container/*
# Deep cleaning, will remove dangling (intermediate build) images
# and containers for which a final image or container cannot be found
# (i.e has been deleted by clean or removed after usage for ephemeral
# containers. Run every once in a while.
realclean:
$(MAKE) clean
docker rmi $(TAG)
docker container prune
docker image prune
# vim: set ft=make sw=2 tw=7 fdm=manual noet :