-SRC_DIR = $(SRC_PATH_BARE)
-
-vpath %.texi $(SRC_PATH_BARE)
-
-PROGS-$(CONFIG_FFMPEG) += ffmpeg
-PROGS-$(CONFIG_FFPLAY) += ffplay
-PROGS-$(CONFIG_FFPROBE) += ffprobe
-PROGS-$(CONFIG_FFSERVER) += ffserver
-
-PROGS := $(addsuffix $(EXESUF), $(PROGS-yes))
-PROGS_G = $(addsuffix _g$(EXESUF), $(PROGS-yes))
-OBJS = $(addsuffix .o, $(PROGS-yes)) cmdutils.o
-MANPAGES = $(addprefix doc/, $(addsuffix .1, $(PROGS-yes)))
-HTMLPAGES = $(addprefix doc/, $(addsuffix -doc.html, $(PROGS-yes)))
-TOOLS = $(addprefix tools/, $(addsuffix $(EXESUF), cws2fws pktdumper probetest qt-faststart trasher))
-HOSTPROGS = $(addprefix tests/, audiogen videogen rotozoom tiny_psnr base64)
-
-BASENAMES = ffmpeg ffplay ffprobe ffserver
-ALLPROGS = $(addsuffix $(EXESUF), $(BASENAMES))
-ALLPROGS_G = $(addsuffix _g$(EXESUF), $(BASENAMES))
-ALLMANPAGES = $(addsuffix .1, $(BASENAMES))
-ALLHTMLPAGES= $(addsuffix -doc.html, $(BASENAMES))
-
-FFLIBS-$(CONFIG_AVDEVICE) += avdevice
-FFLIBS-$(CONFIG_AVFILTER) += avfilter
-FFLIBS-$(CONFIG_AVFORMAT) += avformat
-FFLIBS-$(CONFIG_AVCODEC) += avcodec
-FFLIBS-$(CONFIG_POSTPROC) += postproc
-FFLIBS-$(CONFIG_SWSCALE) += swscale
-FFLIBS-$(CONFIG_AVCORE) += avcore
+vpath %.c $(SRC_PATH)
+vpath %.m $(SRC_PATH)
+vpath %.h $(SRC_PATH)
+vpath %.S $(SRC_PATH)
+vpath %.asm $(SRC_PATH)
+vpath %.v $(SRC_PATH)
+vpath %.texi $(SRC_PATH)
+
+ifndef V
+Q = @
+ECHO = printf "$(1)\t%s\n" $(2)
+BRIEF = CC HOSTCC HOSTLD AS YASM AR LD
+SILENT = DEPCC DEPHOSTCC DEPAS DEPYASM RANLIB RM STRIP
+MSG = $@
+M = @$(call ECHO,$(TAG),$@);
+$(foreach VAR,$(BRIEF), \
+ $(eval override $(VAR) = @$$(call ECHO,$(VAR),$$(MSG)); $($(VAR))))
+$(foreach VAR,$(SILENT),$(eval override $(VAR) = @$($(VAR))))
+$(eval INSTALL = @$(call ECHO,INSTALL,$$(^:$(SRC_PATH)/%=%)); $(INSTALL))
+endif
+
+ALLFFLIBS = avcodec avdevice avfilter avformat avresample avutil swscale
+
+IFLAGS := -I. -I$(SRC_PATH)
+CPPFLAGS := $(IFLAGS) $(CPPFLAGS)
+CFLAGS += $(ECFLAGS)
+CCFLAGS = $(CPPFLAGS) $(CFLAGS)
+OBJCFLAGS += $(EOBJCFLAGS)
+OBJCCFLAGS = $(CPPFLAGS) $(CFLAGS) $(OBJCFLAGS)
+ASFLAGS := $(CPPFLAGS) $(ASFLAGS)
+YASMFLAGS += $(IFLAGS:%=%/) -Pconfig.asm
+HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS)
+LDFLAGS := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS)
+
+define COMPILE
+ $(call $(1)DEP,$(1))
+ $($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $<
+endef
+
+COMPILE_C = $(call COMPILE,CC)
+COMPILE_S = $(call COMPILE,AS)
+COMPILE_M = $(call COMPILE,OBJCC)
+COMPILE_HOSTC = $(call COMPILE,HOSTCC)
+
+%.o: %.c
+ $(COMPILE_C)
+
+%.o: %.S
+ $(COMPILE_S)
+
+%.o: %.m
+ $(COMPILE_M)
+
+%_host.o: %.c
+ $(COMPILE_HOSTC)
+
+%.o: %.asm
+ $(DEPYASM) $(YASMFLAGS) -I $(<D)/ -M -o $@ $< > $(@:.o=.d)
+ $(YASM) $(YASMFLAGS) -I $(<D)/ -o $@ $<
+ -$(STRIP) $(STRIPFLAGS) $@
+
+%.i: %.c
+ $(CC) $(CCFLAGS) $(CC_E) $<
+
+%.h.c:
+ $(Q)echo '#include "$*.h"' >$@
+
+%.c %.h %.ver: TAG = GEN
+
+AVPROGS-$(CONFIG_AVCONV) += avconv
+AVPROGS-$(CONFIG_AVPLAY) += avplay
+AVPROGS-$(CONFIG_AVPROBE) += avprobe
+
+AVPROGS := $(AVPROGS-yes:%=%$(EXESUF))
+PROGS += $(AVPROGS)
+
+AVBASENAMES = avconv avplay avprobe
+ALLAVPROGS = $(AVBASENAMES:%=%$(EXESUF))
+
+$(foreach prog,$(AVBASENAMES),$(eval OBJS-$(prog) += cmdutils.o))
+
+OBJS-avconv += avconv_opt.o avconv_filter.o
+OBJS-avconv-$(CONFIG_LIBMFX) += avconv_qsv.o
+OBJS-avconv-$(CONFIG_VAAPI) += avconv_vaapi.o
+OBJS-avconv-$(CONFIG_VDA) += avconv_vda.o
+OBJS-avconv-$(HAVE_DXVA2_LIB) += avconv_dxva2.o
+OBJS-avconv-$(HAVE_VDPAU_X11) += avconv_vdpau.o
+
+TESTTOOLS = audiogen videogen rotozoom tiny_psnr base64
+HOSTPROGS := $(TESTTOOLS:%=tests/%) doc/print_options
+TOOLS = qt-faststart trasher
+TOOLS-$(CONFIG_ZLIB) += cws2fws
+
+# $(FFLIBS-yes) needs to be in linking order
+FFLIBS-$(CONFIG_AVDEVICE) += avdevice
+FFLIBS-$(CONFIG_AVFILTER) += avfilter
+FFLIBS-$(CONFIG_AVFORMAT) += avformat
+FFLIBS-$(CONFIG_AVCODEC) += avcodec
+FFLIBS-$(CONFIG_AVRESAMPLE) += avresample
+FFLIBS-$(CONFIG_SWSCALE) += swscale