Makefile: Use single-colon `all' rule.
[xchg-rax-rax] / Makefile
1 ### -*-makefile-*-
2
3 V = 0
4 vcond = $(call vcond_$V,$1,$2)
5 vcond_0 = $1
6 vcond_1 = $2
7 V_AT = $(call vcond,@)
8 vtag = \
9 $(call vcond,@printf " %-8s %s\n" "$1" "$(or $2,$@)";)
10
11 ARCH =
12
13 CFLAGS = -O2 -g -Wall -Werror
14 ASFLAGS = $(CFLAGS)
15 LDFLAGS =
16
17 ARCH += i386
18 CC/i386 = gcc -m32
19
20 ARCH += amd64
21 CC/amd64 = gcc -m64
22
23 ARCH += armhf
24 CC/armhf = arm-linux-gnueabihf-gcc
25
26 ARCH += arm64
27 CC/arm64 = aarch64-linux-gnu-gcc
28
29 define defarch.body
30 AS/$1 = $$(CC/$1)
31 LD/$1 = $$(CC/$1)
32 %-$1.o: %.c
33 $$(call vtag,CC/$1)$$(CC/$1) -c -o $$@ $$(CFLAGS) $$(CFLAGS/$1) $$<
34 %-$1.o: %.S
35 $$(call vtag,AS/$1)$$(AS/$1) -c -o $$@ $$(ASFLAGS) $$(ASFLAGS/$1) $$<
36 all: xchg-$1
37 xchg-$1: xchg-$1.o main-$1.o
38 $$(call vtag,LD/$1)$$(LD/$1) -o $$@ $$^
39 endef
40 defarch = $(eval $(call defarch.body,$1))
41 $(foreach a,$(ARCH), $(call defarch,$a))
42
43 clean::; rm -f $(foreach a,$(ARCH), xchg-$a) *.o