vtag = \
$(call vcond,@printf " %-8s %s\n" "$1" "$(or $2,$@)";)
-CC = gcc -m64
-CFLAGS = -O2 -g -Wall -Werror
-
-AS = gcc -m64
-ASFLAGS = -O2 -g
+ARCH =
-LD = gcc -m64
+CFLAGS = -O2 -g -Wall -Werror
+ASFLAGS = $(CFLAGS)
LDFLAGS =
-%.o: %.c
- $(call vtag,CC)$(CC) -c -o $@ $(CFLAGS) $<
-
-%.o: %.S
- $(call vtag,AS)$(AS) -c -o $@ $(ASFLAGS) $<
-
-all:: xchg
-xchg: xchg.o main.o
- $(call vtag,LD)$(LD) -o $@ $^
-
-clean::; rm -f xchg *.o
+ARCH += i386
+CC/i386 = gcc -m32
+
+ARCH += amd64
+CC/amd64 = gcc -m64
+
+ARCH += armhf
+CC/armhf = arm-linux-gnueabihf-gcc
+
+ARCH += arm64
+CC/arm64 = aarch64-linux-gnu-gcc
+
+define defarch.body
+AS/$1 = $$(CC/$1)
+LD/$1 = $$(CC/$1)
+%-$1.o: %.c
+ $$(call vtag,CC/$1)$$(CC/$1) -c -o $$@ $$(CFLAGS) $$(CFLAGS/$1) $$<
+%-$1.o: %.S
+ $$(call vtag,AS/$1)$$(AS/$1) -c -o $$@ $$(ASFLAGS) $$(ASFLAGS/$1) $$<
+all:: xchg-$1
+xchg-$1: xchg-$1.o main-$1.o
+ $$(call vtag,LD/$1)$$(LD/$1) -o $$@ $$^
+endef
+defarch = $(eval $(call defarch.body,$1))
+$(foreach a,$(ARCH), $(call defarch,$a))
+
+clean::; rm -f $(foreach a,$(ARCH), xchg-$a) *.o