|
|
|
#!/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 :
|