| 1 | ### -*-makefile-*- |
| 2 | |
| 3 | all: |
| 4 | clean:: |
| 5 | |
| 6 | .SECONDEXPANSION: # sorry |
| 7 | |
| 8 | bindir = ../bin |
| 9 | |
| 10 | V = 0 |
| 11 | V_AT = $(V_AT_$V) |
| 12 | V_AT_0 = @ |
| 13 | v-tag = $(call v-tag_$V,$1) |
| 14 | v-tag_0 = @printf " %-12s %s\n" "$1" "$@"; |
| 15 | |
| 16 | CC = gcc |
| 17 | CFLAGS = -O2 -g -pedantic -Wall -Werror |
| 18 | |
| 19 | LD = gcc |
| 20 | LDFLAGS = |
| 21 | |
| 22 | ARCH += i686 |
| 23 | CFLAGS_i386 = -m32 |
| 24 | |
| 25 | ARCH += x86_64 |
| 26 | CFLAGS_amd64 = -m64 |
| 27 | |
| 28 | PROGS += dvd-sector-copy |
| 29 | dvd-sector-copy_SRCS = dvd-sector-copy.c |
| 30 | dvd-sector-copy_LIBS = -ldvdread -lm |
| 31 | |
| 32 | SCRIPTS += dvdrip |
| 33 | SCRIPTS += dvdrip-upload |
| 34 | |
| 35 | define setup-arch |
| 36 | obj.$1/%.o: %.c |
| 37 | $$(V_AT)mkdir -p $$(dir $$@) |
| 38 | $$(call v-tag,CC [$1])$$(CC) -c $$(CFLAGS) $$(CFLAGS_$1) -o$$@ -MD -MF obj.$1/$$*.dep $$< |
| 39 | clean::; rm -rf obj.$1 |
| 40 | endef |
| 41 | $(foreach a,$(ARCH), $(eval $(call setup-arch,$a))) |
| 42 | |
| 43 | objects = $(addsuffix $(or $2,.o),$(basename $(filter %.c %.s %.S,$1))) |
| 44 | |
| 45 | ALL_PROGS += $(foreach a,$(ARCH), \ |
| 46 | $(foreach p,$(PROGS), $(bindir)/$p.$a)) |
| 47 | TARGETS += $(ALL_PROGS) |
| 48 | program-name = $(basename $1) |
| 49 | program-arch = $(patsubst .%,%,$(suffix $1)) |
| 50 | program-sources = $($(call program-name,$1)_SRCS) \ |
| 51 | $($(call program-name,$1)_SRCS_$(call program-arch,$1)) |
| 52 | program-objects = $(addprefix obj.$(call program-arch,$1)/, \ |
| 53 | $(call objects,$(call program-sources,$1),$2)) |
| 54 | $(ALL_PROGS): $(bindir)/%: $$(call program-objects,$$*) $$($$(call program-name,$$*)_DEPS) |
| 55 | $(call v-tag,LD [$(call program-arch,$*)])$(LD) \ |
| 56 | $(LDFLAGS) $(LDFLAGS_$(call program-arch,$*)) -o$@ \ |
| 57 | $(call program-objects,$*) \ |
| 58 | $($(call program-name,$*)_LIBS) \ |
| 59 | $($(call program-name,$*)_LIBS_$(call program-arch,$*)) |
| 60 | |
| 61 | ALL_SCRIPTS = $(addprefix $(bindir)/, $(SCRIPTS)) |
| 62 | TARGETS += $(ALL_SCRIPTS) |
| 63 | $(ALL_SCRIPTS): $(bindir)/%: % |
| 64 | $(call v-tag,SCRIPT)install $* $@ |
| 65 | |
| 66 | p:; : $p |
| 67 | |
| 68 | all: $(TARGETS) |
| 69 | clean::; rm -f $(TARGETS) |
| 70 | |
| 71 | -include $(foreach p,$(notdir $(ALL_PROGS)), $(call program-objects,$p,.dep)) |