chiark / gitweb /
src/crosstool.in: Don't establish `$crosstool' if we don't need it.
[mdw-cross] / Makefile
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                  = mdw-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 mdw-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/mdw-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/mdw-cross $* $(MAKE) -C$(DIR) $(ARGS),$*)
94 .PHONY: run-make $(addprefix run-make/,$(ARCHS))
95
96 show:; : $(VAR)