Skip to content

Instantly share code, notes, and snippets.

@dutc
Last active July 10, 2017 23:53
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dutc/17a26c53e73fa8cf6b43100d4b037f82 to your computer and use it in GitHub Desktop.
Save dutc/17a26c53e73fa8cf6b43100d4b037f82 to your computer and use it in GitHub Desktop.
/src Makefile-generating-Makefile
include meta.mk
include concrete.mk
CODE_TARGETS = postgresql-9.5.3 \
nginx-1.11.1 \
node-v6.2.1
$(foreach x,$(CODE_TARGETS),$(eval $(call META_TARGET,build/$x,.build-artefacts/$x,code/$x)))
BASE_PYTHON = 3.6.1
BUILD_FEATURES = dev
INSTALL_FEATURES = dev training
PACKAGES = httpie dnslib curio kitty pygit2 pycparser
DEV_PACKAGES =
$(foreach f,$(BUILD_FEATURES),$(eval $(call META_TARGET,build/Python-$(BASE_PYTHON)-$f,.build-artefacts/Python-$(BASE_PYTHON)-$f,code/Python-$(BASE_PYTHON))))
$(foreach f,$(INSTALL_FEATURES),$(eval $(call META_TARGET,install/python/$(BASE_PYTHON)-$f,.install-artefacts/python/$(BASE_PYTHON)-$f,install/python/$(BASE_PYTHON))))
$(foreach p,$(PACKAGES),$(eval $(call META_TARGET,install/python/$(BASE_PYTHON)+$p,.install-artefacts/python/$(BASE_PYTHON)+$p,install/python/$(BASE_PYTHON))))
$(foreach p,$(DEV_PACKAGES),$(eval $(call META_TARGET,install/python/$(BASE_PYTHON)-dev+$p,.install-artefacts/python/$(BASE_PYTHON)-dev+$p,install/python/$(BASE_PYTHON)-dev)))
# convenience rules
build@build/*: $(filter build@build/%,$(BUILD_TARGETS))
build@install/*: $(filter build@install/%,$(BUILD_TARGETS))
build@install/python/*: $(filter build@install/python/%,$(BUILD_TARGETS))
clean@build/*: $(filter clean@build/%,$(CLEAN_TARGETS))
clean@install/*: $(filter clean@install/%,$(CLEAN_TARGETS))
clean@install/python/*: $(filter clean@install/python/%,$(CLEAN_TARGETS))
SHELL = /bin/zsh
CONCRETE_MAKEFILE = concrete.mk
define META_TARGET
meta@$(1):
@echo '$(1): build@$(1)'
meta@list@$(1):
@echo '$(1)'
meta@build@$(1):
@echo 'build@$(1): $(2) $(3)'
@if [[ -n "$(4)" ]]; then echo 'build@$(1): $(4)'; fi
meta@dedup@$(1):
@echo 'dedup@$(1): $(2) $(3)'
meta@clean@$(1):
@echo 'clean@$(1):'
@echo 'clean@$(3): clean@$(1)'
meta@vars@$(1):
@echo 'TARGETS += $(1)'
@echo 'BUILD_TARGETS += build@$(1)'
@echo 'DEDUP_TARGETS += dedup@$(1)'
@echo 'CLEAN_TARGETS += clean@$(1)'
meta-all: meta@$(1)
meta-list: meta@list@$(1)
meta-build: meta@build@$(1)
meta-dedup: meta@dedup@$(1)
meta-clean: meta@clean@$(1)
meta-vars: meta@vars@$(1)
endef
.DEFAULT_GOAL = list
meta-extras:
.PHONY: concrete
concrete:
make -s meta-extras > concrete.mk
make -s meta-all >> concrete.mk
.PHONY: list
list: meta-list
.PHONY: meta-all
meta-all: meta-build meta-dedup meta-clean meta-vars
@echo 'all: $$(TARGETS)'
@echo 'clean: $$(CLEAN_TARGETS)'
@echo
@echo '$$(BUILD_TARGETS):'
@echo '\t-@src-mount $$(@:build@%=%) $$(wordlist 1,2,$$^) > /dev/null && echo "src-mount $$(@:build@%=%) $$(wordlist 1,2,$$^) > /dev/null" || true'
@echo
@echo '$$(DEDUP_TARGETS):'
@echo '\tdedup $$(@:dedup@%=%) $$^ --run'
@echo
@echo '$$(CLEAN_TARGETS):'
@echo '\t-@fusermount -uz $$(@:clean@%=%) 2> /dev/null && echo "fusermount -uz $$(@:clean@%=%) > /dev/null" || true'
@echo '\t-@rmdir $$(@:clean@%=%) 2> /dev/null && echo "rmdir $$(@:clean@%=%)" || true'
@echo
@echo '# default rule'
@echo '%::;@:'
#!/bin/zsh
active=$1
artefacts=$2
code=$3
mount_opts=${4:-}
if [[ -n $mount_opts ]]; then
mount_opts="-o $mount_opts"
fi
check_dir="$(readlink -f "$active")"
if [[ -e "$check_dir" && "$(mount | grep "$check_dir")" ]]; then
echo "$0: $active is already mounted"
exit 1
fi
mkdir -p "$(readlink -f -- "$active")" "$(readlink -f -- "$artefacts")"
unionfs -o cow $mount_opts "$artefacts=RW:$code=RO" $active
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment