Last active
July 10, 2017 23:53
-
-
Save dutc/17a26c53e73fa8cf6b43100d4b037f82 to your computer and use it in GitHub Desktop.
/src Makefile-generating-Makefile
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 '%::;@:' |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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