# step 3: copy the needed features to $(BUILDDIR) # (only regarding the needed subprofiles) ifndef BUILDDIR help/plus all: banner @$(call grepper,'^+') help/features: banner @$(call grepper,'^use/') banner: @echo "** BUILDDIR not defined; available features:" grepper = $(and $(1),$(grepper_body)) define grepper_body @for dir in */; do \ out="`grep -h $(1) $$dir/config.mk \ | cut -f1 -d: \ | tr ' ' '\n\n' \ | grep $(1) \ | tr '\n' ' ' \ | sort -u`"; \ [ -z "$$out" ] || echo "$$dir: $$out"; \ done endef %: $(error BUILDDIR not defined) else include $(BUILDDIR)/distcfg.mk # first rsync what's static, and make backups (*~) -- # these might signal of file clashes (or plain dirt); # second, care for toplevel and tagged script dirs; # then handle two more ways of implementing a feature # # NB: some subprofiles will be specified as "src/dst" # -- then both src/ and dst/ can hold the addons; # still both pieces go into a single destination ### sorry for somewhat complicated and overly long lines TARGETS := prep $(FEATURES) finalize .PHONY: $(TARGETS) all: | $(TARGETS) prep: @echo "** starting feature configuration" @if [ -n "$(GLOBAL_DEBUG)" ]; then \ echo "** target subprofiles: $(SUBPROFILES)"; \ echo "** requested features: $(FEATURES)"; \ fi # feat $(FEATURES): @feat=$@; \ if [ -n "$(GLOBAL_DEBUG)" ]; then \ echo "** adding $$feat feature"; \ fi; \ pushd "$$feat" >/dev/null && \ for sub in / $(SUBPROFILES); do \ dirtags=; \ if [ "$$sub" = / ]; then \ srcdirs="."; \ dst="."; \ else \ src="$${sub%/*}"; \ dst="$${sub#*/}"; \ srcdirs=; \ if [ -d "$$src" ]; then \ srcdirs="$$src"; \ dirtags="&& $$src"; \ fi; \ if [ -d "$$dst" -a "$$dst" != "$$src" ]; then \ srcdirs="$$srcdirs $$dst"; \ dirtags="&& ($$src || $$dst)"; \ fi; \ for srcdir in $$srcdirs; do \ rsync -qab --exclude tagged \ "$$srcdir/" "$(BUILDDIR)/$$dst/"; \ done; \ fi; \ if [ -n "$(GLOBAL_DEBUG)" ]; then \ echo "** src=[$$src] dst=[$$dst] srcdirs=[$$srcdirs]"; \ fi; \ for srcdir in $$srcdirs; do \ [ -d "$$srcdir" ] || continue; \ pushd "$$srcdir" >&/dev/null; \ for part in lib {image-,}scripts.d; do \ destdir="$(BUILDDIR)/$$dst/$$part"; \ [ -d "$$destdir" ] || continue; \ if [ "$$sub" = / -a -d "$$part" ]; then \ rsync -qab "$$part/" "$$destdir/"; \ fi; \ [ -d "tagged/$$part" ] || continue; \ [ "$$srcdir" != "." ] || continue; \ pushd "tagged/$$part" >/dev/null; \ echo "$$feat $$dirtags" \ | tags2lists . \ | xargs -r cp -vpLt "$$destdir" --; \ popd >/dev/null; \ done; \ popd >&/dev/null; \ done; \ if type -t git >&/dev/null && \ pushd "$(BUILDDIR)/$$dst/" >/dev/null; then \ test -n "`git status -s`" && \ git add . && \ if [ -n "$$dst" ]; then \ the="$$sub subprofile"; \ else \ the="toplevel"; \ fi && \ git commit -qam "$$feat feature: $$the part added"; \ popd >/dev/null; \ fi; \ done; \ if [ -x "generate.sh" ]; then sh generate.sh; fi; \ if [ -s "generate.mk" ]; then $(MAKE) -f generate.mk; fi; \ if type -t git >&/dev/null && \ pushd "$(BUILDDIR)/" >/dev/null; then \ if [ -n "`git status -s`" ]; then \ git add . && \ git commit -qam "$$feat feature generation complete"; \ fi; \ popd >/dev/null; \ fi; \ popd >/dev/null finalize: @find "$(BUILDDIR)/" -name '*~' \ | sed "s,$(BUILDDIR)/,** warning: file clash: ," >&2 endif