| 1 | ### -*-makefile-*- |
| 2 | |
| 3 | .SECONDEXPANSION: #sorry |
| 4 | all:: |
| 5 | |
| 6 | CROSSDIR := $(shell pwd) |
| 7 | |
| 8 | FLAVOURS += linux-cross |
| 9 | linux-cross_ARCHS = linux-armel linux-armhf linux-arm64 |
| 10 | linux-armel_ARCH = arm-linux-gnueabi |
| 11 | linux-armhf_ARCH = arm-linux-gnueabihf |
| 12 | linux-arm64_ARCH = aarch64-linux-gnu |
| 13 | |
| 14 | FLAVOURS += linux-native |
| 15 | linux-native_ARCHS = linux-i386 linux-amd64 |
| 16 | linux-i386_ARCH = i686-linux-gnu |
| 17 | linux-amd64_ARCH = x86_64-linux-gnu |
| 18 | |
| 19 | FLAVOURS += android-cross |
| 20 | android-cross_ARCHS = android-arm android-arm64 android-x86 android-x86_64 |
| 21 | android-arm_ARCH = arm-linux-androideabi |
| 22 | android-arm64_ARCH = aarch64-linux-android |
| 23 | android-x86_ARCH = i686-linux-android |
| 24 | android-x86_64_ARCH = x86_64-linux-android |
| 25 | |
| 26 | CONFIG_VARS += FLAVOURS |
| 27 | CONFIG_VARS += $(foreach f,$(FLAVOURS), $f_ARCHS) |
| 28 | |
| 29 | V = 0 |
| 30 | v_tag = $(call v_tag_$V,$1) |
| 31 | v_tag_0 = @printf " %-8s %s\n" "$1" "$@"; |
| 32 | V_AT = $(V_AT_$V) |
| 33 | V_AT_0 = @ |
| 34 | |
| 35 | define define-setup |
| 36 | SETUPS += etc/$2-setup.sh |
| 37 | $2_FLAVOUR = $1 |
| 38 | endef |
| 39 | $(foreach f,$(FLAVOURS), \ |
| 40 | $(foreach a,$($f_ARCHS), \ |
| 41 | $(eval $(call define-setup,$f,$a)))) |
| 42 | |
| 43 | TARGETS += $(SETUPS) |
| 44 | setup-flavour = $($1_FLAVOUR) |
| 45 | |
| 46 | $(SETUPS): etc/%-setup.sh: $$(call setup-flavour,$$*)-setup.sh.in Makefile |
| 47 | $(V_AT)mkdir -p $(dir $@) |
| 48 | $(call v_tag,SED)sed 's/@arch@/$($*_ARCH)/g' $< >$@.new && \ |
| 49 | mv $@.new $@ |
| 50 | |
| 51 | SCRIPTS = cross crosstool cross-run |
| 52 | BINSCRIPTS = $(addprefix bin/,$(SCRIPTS)) |
| 53 | TARGETS += $(BINSCRIPTS) |
| 54 | $(BINSCRIPTS): bin/%: src/%.in |
| 55 | $(V_AT)mkdir -p $(dir $@) |
| 56 | $(call v_tag,SED)sed 's\a@crossdir@\a$(CROSSDIR)\a' $< >$@.new && \ |
| 57 | chmod +x $@.new && mv $@.new $@ |
| 58 | |
| 59 | fix = $(subst -,_,$1) |
| 60 | quote = '$(subst ','\'',$1)'#' |
| 61 | |
| 62 | TARGETS += etc/config.sh |
| 63 | etc/config.sh: Makefile |
| 64 | $(V_AT)mkdir -p $(dir $@) |
| 65 | $(call v_tag,GEN){ \ |
| 66 | echo '### -*-sh-*- GENERATED by CROSS/Makefile'; \ |
| 67 | $(foreach v,$(CONFIG_VARS), \ |
| 68 | echo $(call fix,$v)=$(call quote,$(call quote,$($v)));) \ |
| 69 | } >$@.new && mv $@.new $@ |
| 70 | |
| 71 | all:: $(TARGETS) |
| 72 | |
| 73 | CLEANFILES += $(TARGETS) |
| 74 | clean::; rm -f $(CLEANFILES) |
| 75 | |
| 76 | run-program = exec 8>&1 && rc=$$( exec 7>&1 && \ |
| 77 | { exec 9>&1 && \ |
| 78 | { ($1 9>&-; echo $$? >&7) | \ |
| 79 | while IFS= read -r line; \ |
| 80 | do printf >&9 "%-21s | %s\n" "$2" "$$line"; done; } 2>&1 | \ |
| 81 | while IFS= read -r line; \ |
| 82 | do printf >&9 "%-21s * %s\n" "$2" "$$line"; done; } | cat >&8 ) && \ |
| 83 | exit $$rc |
| 84 | |
| 85 | run: $(addprefix run/,$(ARCHS)) |
| 86 | $(addprefix run/,$(ARCHS)): run/%: |
| 87 | @cd $(DIR) && \ |
| 88 | $(call run-program,$(CROSSDIR)/bin/cross $* $(ARGS),$*) |
| 89 | .PHONY: run $(addprefix run/,$(ARCHS)) |
| 90 | |
| 91 | run-make: $(addprefix run-make/,$(ARCHS)) |
| 92 | $(addprefix run-make/,$(ARCHS)): run-make/%: |
| 93 | @+$(call run-program,$(CROSSDIR)/bin/cross $* $(MAKE) -C$(DIR) $(ARGS),$*) |
| 94 | .PHONY: run-make $(addprefix run-make/,$(ARCHS)) |
| 95 | |
| 96 | show:; : $(VAR) |