### -*-makefile-*- all: clean:: .SECONDEXPANSION: # sorry bindir = ../bin V = 0 V_AT = $(V_AT_$V) V_AT_0 = @ v-tag = $(call v-tag_$V,$1) v-tag_0 = @printf " %-12s %s\n" "$1" "$@"; CC = gcc CFLAGS = -O2 -g -pedantic -Wall -Werror LD = gcc LDFLAGS = ARCH += i686 CFLAGS_i386 = -m32 ARCH += x86_64 CFLAGS_amd64 = -m64 PROGS += dvd-sector-copy dvd-sector-copy_SRCS = dvd-sector-copy.c dvd-sector-copy_LIBS = -ldvdread -lm SCRIPTS += dvdrip SCRIPTS += dvdrip-upload define setup-arch obj.$1/%.o: %.c $$(V_AT)mkdir -p $$(dir $$@) $$(call v-tag,CC [$1])$$(CC) -c $$(CFLAGS) $$(CFLAGS_$1) -o$$@ -MD -MF obj.$1/$$*.dep $$< clean::; rm -rf obj.$1 endef $(foreach a,$(ARCH), $(eval $(call setup-arch,$a))) objects = $(addsuffix $(or $2,.o),$(basename $(filter %.c %.s %.S,$1))) ALL_PROGS += $(foreach a,$(ARCH), \ $(foreach p,$(PROGS), $(bindir)/$p.$a)) TARGETS += $(ALL_PROGS) program-name = $(basename $1) program-arch = $(patsubst .%,%,$(suffix $1)) program-sources = $($(call program-name,$1)_SRCS) \ $($(call program-name,$1)_SRCS_$(call program-arch,$1)) program-objects = $(addprefix obj.$(call program-arch,$1)/, \ $(call objects,$(call program-sources,$1),$2)) $(ALL_PROGS): $(bindir)/%: $$(call program-objects,$$*) $$($$(call program-name,$$*)_DEPS) $(call v-tag,LD [$(call program-arch,$*)])$(LD) \ $(LDFLAGS) $(LDFLAGS_$(call program-arch,$*)) -o$@ \ $(call program-objects,$*) \ $($(call program-name,$*)_LIBS) \ $($(call program-name,$*)_LIBS_$(call program-arch,$*)) ALL_SCRIPTS = $(addprefix $(bindir)/, $(SCRIPTS)) TARGETS += $(ALL_SCRIPTS) $(ALL_SCRIPTS): $(bindir)/%: % $(call v-tag,SCRIPT)install $* $@ p:; : $p all: $(TARGETS) clean::; rm -f $(TARGETS) -include $(foreach p,$(notdir $(ALL_PROGS)), $(call program-objects,$p,.dep))