.SECONDEXPANSION: #sorry
all::
-FLAVOURS += linux
-linux_ARCHS = armel armhf arm64
-linux/armel_ARCH = arm-linux-gnueabi
-linux/armhf_ARCH = arm-linux-gnueabihf
-linux/arm64_ARCH = aarch64-linux-gnu
-
-FLAVOURS += android
-android_ARCHS = arm arm64 x86 x86_64
-android/arm_ARCH = arm-linux-androideabi
-android/arm64_ARCH = aarch64-linux-android
-android/x86_ARCH = i686-linux-android
-android/x86_64_ARCH = x86_64-linux-android
+CROSSDIR := $(shell pwd)
+
+FLAVOURS += linux-cross
+linux-cross_ARCHS = linux-armel linux-armhf linux-arm64
+linux-armel_ARCH = arm-linux-gnueabi
+linux-armhf_ARCH = arm-linux-gnueabihf
+linux-arm64_ARCH = aarch64-linux-gnu
+
+FLAVOURS += linux-native
+linux-native_ARCHS = linux-i386 linux-amd64
+linux-i386_ARCH = i686-linux-gnu
+linux-amd64_ARCH = x86_64-linux-gnu
+
+FLAVOURS += android-cross
+android-cross_ARCHS = android-arm android-arm64 android-x86 android-x86_64
+android-arm_ARCH = arm-linux-androideabi
+android-arm64_ARCH = aarch64-linux-android
+android-x86_ARCH = i686-linux-android
+android-x86_64_ARCH = x86_64-linux-android
+
+CONFIG_VARS += FLAVOURS
+CONFIG_VARS += $(foreach f,$(FLAVOURS), $f_ARCHS)
V = 0
v_tag = $(call v_tag_$V,$1)
v_tag_0 = @printf " %-8s %s\n" "$1" "$@";
+V_AT = $(V_AT_$V)
+V_AT_0 = @
+
+define define-setup
+SETUPS += etc/$2-setup.sh
+$2_FLAVOUR = $1
+endef
+$(foreach f,$(FLAVOURS), \
+ $(foreach a,$($f_ARCHS), \
+ $(eval $(call define-setup,$f,$a))))
-SETUPS = \
- $(foreach f,$(FLAVOURS),\
- $(foreach a,$($f_ARCHS),etc/$f-$a-setup.sh))
TARGETS += $(SETUPS)
-setup-flavour = $(word 1,$(subst -, ,$1))
-setup-arch = $(word 2,$(subst -, ,$1))
+setup-flavour = $($1_FLAVOUR)
+
+$(SETUPS): etc/%-setup.sh: $$(call setup-flavour,$$*)-setup.sh.in Makefile
+ $(V_AT)mkdir -p $(dir $@)
+ $(call v_tag,SED)sed 's/@arch@/$($*_ARCH)/g' $< >$@.new && \
+ mv $@.new $@
-$(SETUPS): etc/%-setup.sh: $$(call setup-flavour,$$*)-cross-setup.sh.in Makefile
- $(call v_tag,GEN)sed 's/@arch@/$($(call setup-flavour,$*)/$(call setup-arch,$*)_ARCH)/g' $< >$@.new && mv $@.new $@
+SCRIPTS = cross crosstool cross-run
+BINSCRIPTS = $(addprefix bin/,$(SCRIPTS))
+TARGETS += $(BINSCRIPTS)
+$(BINSCRIPTS): bin/%: src/%.in
+ $(V_AT)mkdir -p $(dir $@)
+ $(call v_tag,SED)sed 's\a@crossdir@\a$(CROSSDIR)\a' $< >$@.new && \
+ chmod +x $@.new && mv $@.new $@
+
+fix = $(subst -,_,$1)
+quote = '$(subst ','\'',$1)'#'
+
+TARGETS += etc/config.sh
+etc/config.sh: Makefile
+ $(V_AT)mkdir -p $(dir $@)
+ $(call v_tag,GEN){ \
+ echo '### -*-sh-*- GENERATED by CROSS/Makefile'; \
+ $(foreach v,$(CONFIG_VARS), \
+ echo $(call fix,$v)=$(call quote,$(call quote,$($v)));) \
+ } >$@.new && mv $@.new $@
all:: $(TARGETS)
CLEANFILES += $(TARGETS)
clean::; rm -f $(CLEANFILES)
+
+run-program = exec 8>&1 && rc=$$( exec 7>&1 && \
+ { exec 9>&1 && \
+ { ($1 9>&-; echo $$? >&7) | \
+ while IFS= read -r line; \
+ do printf >&9 "%-21s | %s\n" "$2" "$$line"; done; } 2>&1 | \
+ while IFS= read -r line; \
+ do printf >&9 "%-21s * %s\n" "$2" "$$line"; done; } | cat >&8 ) && \
+ exit $$rc
+
+run: $(addprefix run/,$(ARCHS))
+$(addprefix run/,$(ARCHS)): run/%:
+ @cd $(DIR) && \
+ $(call run-program,$(CROSSDIR)/bin/cross $* $(ARGS),$*)
+.PHONY: run $(addprefix run/,$(ARCHS))
+
+run-make: $(addprefix run-make/,$(ARCHS))
+$(addprefix run-make/,$(ARCHS)): run-make/%:
+ @+$(call run-program,$(CROSSDIR)/bin/cross $* $(MAKE) -C$(DIR) $(ARGS),$*)
+.PHONY: run-make $(addprefix run-make/,$(ARCHS))
+
+show:; : $(VAR)