Browse Source

non-recursive makefiles

Originally committed as revision 12760 to svn://svn.ffmpeg.org/ffmpeg/trunk
Måns Rullgård 17 years ago
parent
commit
71c61f62a3
10 changed files with 198 additions and 231 deletions
  1. 33 95
      Makefile
  2. 41 86
      common.mak
  3. 16 15
      configure
  4. 21 22
      libavcodec/Makefile
  5. 2 2
      libavdevice/Makefile
  6. 2 2
      libavfilter/Makefile
  7. 2 2
      libavformat/Makefile
  8. 4 5
      libavutil/Makefile
  9. 2 2
      libpostproc/Makefile
  10. 75 0
      subdir.mak

+ 33 - 95
Makefile

@@ -6,8 +6,6 @@ include config.mak
 
 
 SRC_DIR = $(SRC_PATH_BARE)
 SRC_DIR = $(SRC_PATH_BARE)
 
 
-vpath %.c    $(SRC_PATH_BARE)
-vpath %.h    $(SRC_PATH_BARE)
 vpath %.texi $(SRC_PATH_BARE)
 vpath %.texi $(SRC_PATH_BARE)
 
 
 PROGS-$(CONFIG_FFMPEG)   += ffmpeg
 PROGS-$(CONFIG_FFMPEG)   += ffmpeg
@@ -30,6 +28,14 @@ FFLIBS-$(CONFIG_SWSCALE)  += swscale
 
 
 FFLIBS := avdevice avformat avcodec avutil
 FFLIBS := avdevice avformat avcodec avutil
 
 
+include common.mak
+
+FF_LDFLAGS   := $(FFLDFLAGS)
+FF_EXTRALIBS := $(FFEXTRALIBS)
+
+S := $(BUILD_SHARED:yes=S)
+DEP_LIBS := $(foreach L,$(FFLIBS),lib$(L)/$($(S)LIBPREF)$(L)$($(S)LIBSUF))
+
 ALL_TARGETS-$(CONFIG_VHOOK) += videohook
 ALL_TARGETS-$(CONFIG_VHOOK) += videohook
 ALL_TARGETS-$(BUILD_DOC)    += documentation
 ALL_TARGETS-$(BUILD_DOC)    += documentation
 
 
@@ -40,7 +46,7 @@ INSTALL_TARGETS-$(BUILD_DOC)    += install-man
 endif
 endif
 INSTALL_PROGS_TARGETS-$(BUILD_SHARED) = install-libs
 INSTALL_PROGS_TARGETS-$(BUILD_SHARED) = install-libs
 
 
-main: lib $(PROGS) $(ALL_TARGETS-yes)
+all: $(DEP_LIBS) $(PROGS) $(ALL_TARGETS-yes)
 
 
 $(PROGS): %$(EXESUF): %_g$(EXESUF)
 $(PROGS): %$(EXESUF): %_g$(EXESUF)
 	cp -p $< $@
 	cp -p $< $@
@@ -48,13 +54,20 @@ $(PROGS): %$(EXESUF): %_g$(EXESUF)
 
 
 .depend: version.h $(PROGS_SRCS)
 .depend: version.h $(PROGS_SRCS)
 
 
-# bandaid to disable triggering shared library installation routines
-DISABLE=yes
+SUBDIR_VARS := OBJS ASM_OBJS CPP_OBJS FFLIBS CLEANFILES
 
 
-include common.mak
+define RESET
+$(1) :=
+$(1)-yes :=
+endef
 
 
-S := $(BUILD_SHARED:yes=S)
-DEP_LIBS := $(foreach L,$(FFLIBS),lib$(L)/$($(S)LIBPREF)$(L)$($(S)LIBSUF))
+define DOSUBDIR
+$(foreach V,$(SUBDIR_VARS),$(eval $(call RESET,$(V))))
+SUBDIR := $(1)/
+include $(1)/Makefile
+endef
+
+$(foreach D,$(FFLIBS),$(eval $(call DOSUBDIR,lib$(D))))
 
 
 VHOOKCFLAGS += $(filter-out -mdynamic-no-pic,$(CFLAGS))
 VHOOKCFLAGS += $(filter-out -mdynamic-no-pic,$(CFLAGS))
 
 
@@ -78,23 +91,11 @@ VHOOKCFLAGS += $(VHOOKCFLAGS-yes)
 
 
 vhook/%.o: CFLAGS:=$(VHOOKCFLAGS)
 vhook/%.o: CFLAGS:=$(VHOOKCFLAGS)
 
 
-MAKE-yes = $(MAKE)
-MAKE-    = : $(MAKE)
-
-lib:
-	$(MAKE)                    -C libavutil   all
-	$(MAKE)                    -C libavcodec  all
-	$(MAKE)                    -C libavformat all
-	$(MAKE)                    -C libavdevice all
-	$(MAKE-$(CONFIG_POSTPROC)) -C libpostproc all
-	$(MAKE-$(CONFIG_SWSCALE))  -C libswscale  all
-	$(MAKE-$(CONFIG_AVFILTER)) -C libavfilter all
-
-ffplay_g$(EXESUF): EXTRALIBS += $(SDL_LIBS)
-ffserver_g$(EXESUF): LDFLAGS += $(FFSERVERLDFLAGS)
+ffplay_g$(EXESUF): FF_EXTRALIBS += $(SDL_LIBS)
+ffserver_g$(EXESUF): FF_LDFLAGS += $(FFSERVERLDFLAGS)
 
 
-%_g$(EXESUF): %.o cmdutils.o .libs
-	$(CC) $(LDFLAGS) -o $@ $< cmdutils.o $(EXTRALIBS)
+%_g$(EXESUF): %.o cmdutils.o $(DEP_LIBS)
+	$(CC) $(FF_LDFLAGS) -o $@ $< cmdutils.o $(FF_EXTRALIBS)
 
 
 SVN_ENTRIES = $(SRC_PATH_BARE)/.svn/entries
 SVN_ENTRIES = $(SRC_PATH_BARE)/.svn/entries
 ifeq ($(wildcard $(SVN_ENTRIES)),$(SVN_ENTRIES))
 ifeq ($(wildcard $(SVN_ENTRIES)),$(SVN_ENTRIES))
@@ -104,18 +105,18 @@ endif
 version.h:
 version.h:
 	$(SRC_PATH)/version.sh $(SRC_PATH)
 	$(SRC_PATH)/version.sh $(SRC_PATH)
 
 
-output_example$(EXESUF): output_example.o .libs
-	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(EXTRALIBS)
+output_example$(EXESUF): output_example.o $(DEP_LIBS)
+	$(CC) $(CFLAGS) $(FF_LDFLAGS) -o $@ $< $(FF_EXTRALIBS)
 
 
 tools/%$(EXESUF): tools/%.c
 tools/%$(EXESUF): tools/%.c
-	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(EXTRALIBS)
+	$(CC) $(CFLAGS) $(FF_LDFLAGS) -o $@ $< $(FF_EXTRALIBS)
 
 
 ffplay.o .depend: CFLAGS += $(SDL_CFLAGS)
 ffplay.o .depend: CFLAGS += $(SDL_CFLAGS)
 
 
 ffmpeg.o ffplay.o ffserver.o: version.h
 ffmpeg.o ffplay.o ffserver.o: version.h
 
 
 # vhooks compile fine without libav*, but need them nonetheless.
 # vhooks compile fine without libav*, but need them nonetheless.
-videohook: .libs $(HOOKS)
+videohook: $(DEP_LIBS) $(HOOKS)
 
 
 vhook/%$(SLIBSUF): vhook/%.o
 vhook/%$(SLIBSUF): vhook/%.o
 	$(CC) $(LDFLAGS) -o $@ $(VHOOKSHFLAGS) $< $(VHOOKLIBS) $(LIBS_$(@F))
 	$(CC) $(LDFLAGS) -o $@ $(VHOOKSHFLAGS) $< $(VHOOKLIBS) $(LIBS_$(@F))
@@ -148,24 +149,6 @@ install-vhook: videohook
 	install -d "$(SHLIBDIR)/vhook"
 	install -d "$(SHLIBDIR)/vhook"
 	install -m 755 $(HOOKS) "$(SHLIBDIR)/vhook"
 	install -m 755 $(HOOKS) "$(SHLIBDIR)/vhook"
 
 
-install-libs:
-	$(MAKE)                    -C libavutil   install-libs
-	$(MAKE)                    -C libavcodec  install-libs
-	$(MAKE)                    -C libavformat install-libs
-	$(MAKE)                    -C libavdevice install-libs
-	$(MAKE-$(CONFIG_POSTPROC)) -C libpostproc install-libs
-	$(MAKE-$(CONFIG_SWSCALE))  -C libswscale  install-libs
-	$(MAKE-$(CONFIG_AVFILTER)) -C libavfilter install-libs
-
-install-headers::
-	$(MAKE)                    -C libavutil   install-headers
-	$(MAKE)                    -C libavcodec  install-headers
-	$(MAKE)                    -C libavformat install-headers
-	$(MAKE)                    -C libavdevice install-headers
-	$(MAKE-$(CONFIG_POSTPROC)) -C libpostproc install-headers
-	$(MAKE)                    -C libswscale  install-headers
-	$(MAKE-$(CONFIG_AVFILTER)) -C libavfilter install-headers
-
 uninstall: uninstall-progs uninstall-man uninstall-vhook
 uninstall: uninstall-progs uninstall-man uninstall-vhook
 
 
 uninstall-progs:
 uninstall-progs:
@@ -178,51 +161,13 @@ uninstall-vhook:
 	rm -f $(addprefix "$(SHLIBDIR)/",$(ALLHOOKS_SRCS:.c=$(SLIBSUF)))
 	rm -f $(addprefix "$(SHLIBDIR)/",$(ALLHOOKS_SRCS:.c=$(SLIBSUF)))
 	-rmdir "$(SHLIBDIR)/vhook/"
 	-rmdir "$(SHLIBDIR)/vhook/"
 
 
-uninstall-libs::
-	$(MAKE) -C libavutil   uninstall-libs
-	$(MAKE) -C libavcodec  uninstall-libs
-	$(MAKE) -C libavformat uninstall-libs
-	$(MAKE) -C libavdevice uninstall-libs
-	$(MAKE) -C libpostproc uninstall-libs
-	$(MAKE) -C libswscale  uninstall-libs
-	$(MAKE) -C libavfilter uninstall-libs
-
-uninstall-headers::
-	$(MAKE) -C libavutil   uninstall-headers
-	$(MAKE) -C libavcodec  uninstall-headers
-	$(MAKE) -C libavformat uninstall-headers
-	$(MAKE) -C libavdevice uninstall-headers
-	$(MAKE) -C libpostproc uninstall-headers
-	$(MAKE) -C libswscale  uninstall-headers
-	$(MAKE) -C libavfilter uninstall-headers
-	-rmdir "$(INCDIR)"
-
 depend dep: .vhookdep
 depend dep: .vhookdep
-	$(MAKE)                    -C libavutil   depend
-	$(MAKE)                    -C libavcodec  depend
-	$(MAKE)                    -C libavformat depend
-	$(MAKE)                    -C libavdevice depend
-	$(MAKE-$(CONFIG_POSTPROC)) -C libpostproc depend
-	$(MAKE-$(CONFIG_SWSCALE))  -C libswscale  depend
-	$(MAKE-$(CONFIG_AVFILTER)) -C libavfilter depend
 
 
 .vhookdep: $(ALLHOOKS_SRCS) version.h
 .vhookdep: $(ALLHOOKS_SRCS) version.h
 	$(VHOOK_DEPEND_CMD) > $@
 	$(VHOOK_DEPEND_CMD) > $@
 
 
-$(DEP_LIBS): lib
-
-.libs: $(DEP_LIBS)
-	touch $@
-
 clean::
 clean::
-	$(MAKE) -C libavutil   clean
-	$(MAKE) -C libavcodec  clean
-	$(MAKE) -C libavformat clean
-	$(MAKE) -C libavdevice clean
-	$(MAKE) -C libpostproc clean
-	$(MAKE) -C libswscale  clean
-	$(MAKE) -C libavfilter clean
-	rm -f .libs gmon.out TAGS $(ALLPROGS) $(ALLPROGS_G) \
+	rm -f gmon.out TAGS $(ALLPROGS) $(ALLPROGS_G) \
 	   output_example$(EXESUF)
 	   output_example$(EXESUF)
 	rm -f doc/*.html doc/*.pod doc/*.1
 	rm -f doc/*.html doc/*.pod doc/*.1
 	rm -rf tests/vsynth1 tests/vsynth2 tests/data tests/asynth1.sw tests/*~
 	rm -rf tests/vsynth1 tests/vsynth2 tests/data tests/asynth1.sw tests/*~
@@ -231,13 +176,6 @@ clean::
 	rm -f vhook/*.o vhook/*~ vhook/*.so vhook/*.dylib vhook/*.dll
 	rm -f vhook/*.o vhook/*~ vhook/*.so vhook/*.dylib vhook/*.dll
 
 
 distclean::
 distclean::
-	$(MAKE) -C libavutil   distclean
-	$(MAKE) -C libavcodec  distclean
-	$(MAKE) -C libavformat distclean
-	$(MAKE) -C libavdevice distclean
-	$(MAKE) -C libpostproc distclean
-	$(MAKE) -C libswscale  distclean
-	$(MAKE) -C libavfilter distclean
 	rm -f .vhookdep version.h config.* *.pc
 	rm -f .vhookdep version.h config.* *.pc
 
 
 # regression tests
 # regression tests
@@ -404,10 +342,10 @@ tests/asynth1.sw: tests/audiogen$(EXESUF)
 	$(BUILD_ROOT)/$< $@
 	$(BUILD_ROOT)/$< $@
 
 
 %$(EXESUF): %.c
 %$(EXESUF): %.c
-	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $<
+	$(CC) $(FF_LDFLAGS) $(CFLAGS) -o $@ $<
 
 
-tests/seek_test$(EXESUF): tests/seek_test.c .libs
-	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $< $(EXTRALIBS)
+tests/seek_test$(EXESUF): tests/seek_test.c $(DEP_LIBS)
+	$(CC) $(FF_LDFLAGS) $(CFLAGS) -o $@ $< $(FF_EXTRALIBS)
 
 
 
 
 .PHONY: lib videohook documentation TAGS
 .PHONY: lib videohook documentation TAGS

+ 41 - 86
common.mak

@@ -2,47 +2,18 @@
 # common bits used by all libraries
 # common bits used by all libraries
 #
 #
 
 
-SRC_DIR = $(SRC_PATH_BARE)/lib$(NAME)
-
-LIBVERSION = $(lib$(NAME)_VERSION)
-LIBMAJOR   = $(lib$(NAME)_VERSION_MAJOR)
+all: # make "all" default target
 
 
+ifeq ($(SUBDIR),)
 vpath %.c $(SRC_DIR)
 vpath %.c $(SRC_DIR)
 vpath %.h $(SRC_DIR)
 vpath %.h $(SRC_DIR)
 vpath %.S $(SRC_DIR)
 vpath %.S $(SRC_DIR)
 
 
 ALLFFLIBS = avcodec avdevice avfilter avformat avutil postproc swscale
 ALLFFLIBS = avcodec avdevice avfilter avformat avutil postproc swscale
 
 
-CFLAGS   += $(CFLAGS-yes)
-OBJS     += $(OBJS-yes)
-ASM_OBJS += $(ASM_OBJS-yes)
-CPP_OBJS += $(CPP_OBJS-yes)
-FFLIBS   += $(FFLIBS-yes)
-
-CFLAGS += -DHAVE_AV_CONFIG_H -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE \
-          -D_ISOC9X_SOURCE -I$(BUILD_ROOT) -I$(SRC_PATH) \
-          $(addprefix -I$(SRC_PATH)/lib,$(ALLFFLIBS)) $(OPTFLAGS)
-
-EXTRALIBS := $(addprefix -l,$(addsuffix $(BUILDSUF),$(FFLIBS))) $(EXTRALIBS)
-LDFLAGS   := $(addprefix -L$(BUILD_ROOT)/lib,$(FFLIBS)) $(LDFLAGS)
-
-SRCS := $(OBJS:.o=.c) $(ASM_OBJS:.o=.S) $(CPP_OBJS:.o=.cpp)
-OBJS := $(OBJS) $(ASM_OBJS) $(CPP_OBJS)
-
-all: $(LIBNAME) $(SLIBNAME)
-
-$(LIBNAME)$(DISABLE): $(OBJS)
-	rm -f $@
-	$(AR) rc $@ $^ $(EXTRAOBJS)
-	$(RANLIB) $@
-
-$(SLIBNAME)$(DISABLE): $(SLIBNAME_WITH_MAJOR)
-	$(LN_S) $^ $@
-
-$(SLIBNAME_WITH_MAJOR): $(OBJS)
-	$(SLIB_CREATE_DEF_CMD)
-	$(CC) $(SHFLAGS) $(LDFLAGS) -o $@ $^ $(EXTRALIBS) $(EXTRAOBJS)
-	$(SLIB_EXTRA_CMD)
+CFLAGS = -DHAVE_AV_CONFIG_H -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE \
+         -D_ISOC9X_SOURCE -I$(BUILD_ROOT) -I$(SRC_PATH) \
+         $(addprefix -I$(SRC_PATH)/lib,$(ALLFFLIBS)) $(OPTFLAGS)
 
 
 %.o: %.c
 %.o: %.c
 	$(CC) $(CFLAGS) $(LIBOBJFLAGS) -c -o $@ $<
 	$(CC) $(CFLAGS) $(LIBOBJFLAGS) -c -o $@ $<
@@ -50,75 +21,59 @@ $(SLIBNAME_WITH_MAJOR): $(OBJS)
 %.o: %.S
 %.o: %.S
 	$(CC) $(CFLAGS) $(LIBOBJFLAGS) -c -o $@ $<
 	$(CC) $(CFLAGS) $(LIBOBJFLAGS) -c -o $@ $<
 
 
-%: %.o $(LIBNAME)
-	$(CC) $(LDFLAGS) -o $@ $^ $(EXTRALIBS)
-
 %.ho: %.h
 %.ho: %.h
 	$(CC) $(CFLAGS) $(LIBOBJFLAGS) -Wno-unused -c -o $@ -x c $<
 	$(CC) $(CFLAGS) $(LIBOBJFLAGS) -Wno-unused -c -o $@ -x c $<
 
 
-ALLHEADERS = $(subst $(SRC_DIR)/,,$(wildcard $(SRC_DIR)/*.h))
-checkheaders: $(filter-out %_template.ho,$(ALLHEADERS:.h=.ho))
-
-depend dep: .depend
+install: install-libs install-headers
 
 
-.depend: $(SRCS)
-	$(DEPEND_CMD) > .depend
+uninstall: uninstall-libs uninstall-headers
 
 
-clean::
-	rm -f *.o *~ *.a *.lib *.so *.so.* *.dylib *.dll \
-	      *.def *.dll.a *.exp *.ho *.map $(TESTS)
+.PHONY: all depend dep clean distclean install* uninstall* tests
+endif
 
 
-distclean:: clean
-	rm -f .depend
+CFLAGS   += $(CFLAGS-yes)
+OBJS     += $(OBJS-yes)
+ASM_OBJS += $(ASM_OBJS-yes)
+CPP_OBJS += $(CPP_OBJS-yes)
+FFLIBS   := $(FFLIBS-yes) $(FFLIBS)
 
 
-INSTALL_LIB_TARGETS-$(BUILD_SHARED) += install-lib-shared
-INSTALL_LIB_TARGETS-$(BUILD_STATIC) += install-lib-static
+FFEXTRALIBS := $(addprefix -l,$(addsuffix $(BUILDSUF),$(FFLIBS))) $(EXTRALIBS)
+FFLDFLAGS   := $(addprefix -L$(BUILD_ROOT)/lib,$(FFLIBS)) $(LDFLAGS)
 
 
-install: install-libs install-headers
+SRCS := $(OBJS:.o=.c) $(ASM_OBJS:.o=.S) $(CPP_OBJS:.o=.cpp)
+OBJS := $(OBJS) $(ASM_OBJS) $(CPP_OBJS)
 
 
-install-libs$(DISABLE): $(INSTALL_LIB_TARGETS-yes)
+SRCS  := $(addprefix $(SUBDIR),$(SRCS))
+OBJS  := $(addprefix $(SUBDIR),$(OBJS))
+TESTS := $(addprefix $(SUBDIR),$(TESTS))
 
 
-install-lib-shared: $(SLIBNAME)
-	install -d "$(SHLIBDIR)"
-	install -m 755 $(SLIBNAME) "$(SHLIBDIR)/$(SLIBNAME_WITH_VERSION)"
-	$(STRIP) "$(SHLIBDIR)/$(SLIBNAME_WITH_VERSION)"
-	cd "$(SHLIBDIR)" && \
-		$(LN_S) $(SLIBNAME_WITH_VERSION) $(SLIBNAME_WITH_MAJOR)
-	cd "$(SHLIBDIR)" && \
-		$(LN_S) $(SLIBNAME_WITH_VERSION) $(SLIBNAME)
-	$(SLIB_INSTALL_EXTRA_CMD)
+ALLHEADERS := $(subst $(SRC_DIR)/,$(SUBDIR),$(wildcard $(SRC_DIR)/*.h))
+checkheaders: $(filter-out %_template.ho,$(ALLHEADERS:.h=.ho))
 
 
-install-lib-static: $(LIBNAME)
-	install -d "$(LIBDIR)"
-	install -m 644 $(LIBNAME) "$(LIBDIR)"
-	$(LIB_INSTALL_EXTRA_CMD)
+depend dep: $(SUBDIR).depend
 
 
-INCINSTDIR = $(INCDIR)/lib$(NAME)
+CLEANFILES += *.o *~ *.a *.lib *.so *.so.* *.dylib *.dll \
+              *.def *.dll.a *.exp *.ho *.map
 
 
-install-headers$(DISABLE)::
-	install -d "$(INCINSTDIR)"
-	install -d "$(LIBDIR)/pkgconfig"
-	install -m 644 $(addprefix "$(SRC_DIR)"/,$(HEADERS)) "$(INCINSTDIR)"
-	install -m 644 $(BUILD_ROOT)/lib$(NAME).pc "$(LIBDIR)/pkgconfig"
+define RULES
+$(SUBDIR)%: $(SUBDIR)%.o $(LIBNAME)
+	$(CC) $(FFLDFLAGS) -o $$@ $$^ $(FFEXTRALIBS)
 
 
-uninstall: uninstall-libs uninstall-headers
+$(SUBDIR)%-test$(EXESUF): $(SUBDIR)%.c $(LIBNAME)
+	$(CC) $(CFLAGS) $(FFLDFLAGS) -DTEST -o $$@ $$^ $(FFEXTRALIBS)
 
 
-uninstall-libs::
-	-rm -f "$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR)" \
-	       "$(SHLIBDIR)/$(SLIBNAME)"            \
-	       "$(SHLIBDIR)/$(SLIBNAME_WITH_VERSION)"
-	-$(SLIB_UNINSTALL_EXTRA_CMD)
-	-rm -f "$(LIBDIR)/$(LIBNAME)"
+$(SUBDIR).depend: $(SRCS)
+	$(DEPEND_CMD) > $$@
 
 
-uninstall-headers::
-	rm -f $(addprefix "$(INCINSTDIR)/",$(HEADERS))
-	rm -f "$(LIBDIR)/pkgconfig/lib$(NAME).pc"
+clean::
+	rm -f $(TESTS) $(addprefix $(SUBDIR),$(CLEANFILES))
 
 
-tests: $(TESTS)
+distclean:: clean
+	rm -f $(SUBDIR).depend
+endef
 
 
-%-test$(EXESUF): %.c $(LIBNAME)
-	$(CC) $(CFLAGS) $(LDFLAGS) -DTEST -o $@ $^ $(EXTRALIBS)
+$(eval $(RULES))
 
 
-.PHONY: all depend dep clean distclean install* uninstall* tests
+tests: $(TESTS)
 
 
--include .depend
+-include $(SUBDIR).depend

+ 16 - 15
configure

@@ -940,7 +940,7 @@ SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
 LIB_INSTALL_EXTRA_CMD='$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
 LIB_INSTALL_EXTRA_CMD='$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
 
 
 # gcc stupidly only outputs the basename of targets with -MM
 # gcc stupidly only outputs the basename of targets with -MM
-DEPEND_CMD='$(CC) -MM $(CFLAGS) $(filter-out %.h,$^) | sed "s,[0-9a-z._-]*: \($(SRC_DIR)/\)*\([a-z0-9]*/\)[^/]* ,\\2&,"'
+DEPEND_CMD='$(CC) -MM $(CFLAGS) $(filter-out %.h,$$^) | sed "s,[0-9a-z._-]*: \($(SRC_DIR)/\)*\([a-z0-9]*/\)[^/]* ,\\2&,;s,^.*:,\$$$$(SUBDIR)&,"'
 VHOOK_DEPEND_CMD='$(CC) -MM $(VHOOKCFLAGS) $(filter-out %.h,$^) | sed "s,^\([a-z]\),vhook/\\1,"'
 VHOOK_DEPEND_CMD='$(CC) -MM $(VHOOKCFLAGS) $(filter-out %.h,$^) | sed "s,^\([a-z]\),vhook/\\1,"'
 
 
 # find source path
 # find source path
@@ -1105,7 +1105,7 @@ case $target_os in
     darwin)
     darwin)
         disable need_memalign
         disable need_memalign
         SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR) -Wl,-read_only_relocs,suppress'
         SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR) -Wl,-read_only_relocs,suppress'
-        VHOOKSHFLAGS='-dynamiclib -Wl,-single_module -flat_namespace -undefined suppress -Wl,-install_name,$(SHLIBDIR)/vhook/$@'
+        VHOOKSHFLAGS='-dynamiclib -Wl,-single_module -flat_namespace -undefined suppress -Wl,-install_name,$(SHLIBDIR)/vhook/$$@'
         strip="strip -x"
         strip="strip -x"
         FFLDFLAGS="-Wl,-dynamic,-search_paths_first"
         FFLDFLAGS="-Wl,-dynamic,-search_paths_first"
         SLIBSUF=".dylib"
         SLIBSUF=".dylib"
@@ -1128,10 +1128,10 @@ case $target_os in
         EXESUF=".exe"
         EXESUF=".exe"
         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
-        SLIB_EXTRA_CMD='-lib /machine:i386 /def:$(@:$(SLIBSUF)=.def)'
-        SLIB_INSTALL_EXTRA_CMD='-install -m 644 $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.lib) "$(SHLIBDIR)/$(SLIBNAME:$(SLIBSUF)=.lib)"'
+        SLIB_EXTRA_CMD='-lib /machine:i386 /def:$$(@:$(SLIBSUF)=.def)'
+        SLIB_INSTALL_EXTRA_CMD='-install -m 644 $(SUBDIR)$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.lib) "$(SHLIBDIR)/$(SLIBNAME:$(SLIBSUF)=.lib)"'
         SLIB_UNINSTALL_EXTRA_CMD='rm -f "$(SHLIBDIR)/$(SLIBNAME:$(SLIBSUF)=.lib)"'
         SLIB_UNINSTALL_EXTRA_CMD='rm -f "$(SHLIBDIR)/$(SLIBNAME:$(SLIBSUF)=.lib)"'
-        SHFLAGS='-shared -Wl,--output-def,$(@:$(SLIBSUF)=.def) -Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-image-base'
+        SHFLAGS='-shared -Wl,--output-def,$$(@:$(SLIBSUF)=.def) -Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-image-base'
         ;;
         ;;
     cygwin*)
     cygwin*)
         target_os=cygwin
         target_os=cygwin
@@ -1168,22 +1168,22 @@ case $target_os in
         ln_s="cp -f"
         ln_s="cp -f"
         EXESUF=".exe"
         EXESUF=".exe"
         FFLDFLAGS="-Zomf -Zbin-files -Zargs-wild -Zmap"
         FFLDFLAGS="-Zomf -Zbin-files -Zargs-wild -Zmap"
-        SHFLAGS='$(NAME).def -Zdll -Zomf'
+        SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
         FFSERVERLDFLAGS=""
         FFSERVERLDFLAGS=""
         LIBSUF="_s.a"
         LIBSUF="_s.a"
         SLIBPREF=""
         SLIBPREF=""
         SLIBSUF=".dll"
         SLIBSUF=".dll"
         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
-        SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(NAME).def; \
-          echo PROTMODE >> $(NAME).def; \
-          echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(NAME).def; \
-          echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(NAME).def; \
-          echo EXPORTS >> $(NAME).def; \
-          emxexp -o $(OBJS) >> $(NAME).def'
-        SLIB_EXTRA_CMD='emximp -o $(LIBPREF)$(NAME)_dll.a $(NAME).def; \
-          emximp -o $(LIBPREF)$(NAME)_dll.lib $(NAME).def;'
-        SLIB_INSTALL_EXTRA_CMD='install -m 644 $(LIBPREF)$(NAME)_dll.a $(LIBPREF)$(NAME)_dll.lib "$(LIBDIR)"'
+        SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \
+          echo PROTMODE >> $(SUBDIR)$(NAME).def; \
+          echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(NAME).def; \
+          echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(NAME).def; \
+          echo EXPORTS >> $(SUBDIR)$(NAME).def; \
+          emxexp -o $(OBJS) >> $(SUBDIR)$(NAME).def'
+        SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \
+          emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;'
+        SLIB_INSTALL_EXTRA_CMD='install -m 644 $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib "$(LIBDIR)"'
         SLIB_UNINSTALL_EXTRA_CMD='rm -f "$(LIBDIR)"/$(LIBPREF)$(NAME)_dll.a "$(LIBDIR)"/$(LIBPREF)$(NAME)_dll.lib'
         SLIB_UNINSTALL_EXTRA_CMD='rm -f "$(LIBDIR)"/$(LIBPREF)$(NAME)_dll.a "$(LIBDIR)"/$(LIBPREF)$(NAME)_dll.lib'
         disable vhook
         disable vhook
         ;;
         ;;
@@ -2096,6 +2096,7 @@ if enabled source_path_used; then
     FILES="\
     FILES="\
         Makefile             \
         Makefile             \
         common.mak           \
         common.mak           \
+        subdir.mak           \
         doc/texi2pod.pl      \
         doc/texi2pod.pl      \
         libavcodec/Makefile  \
         libavcodec/Makefile  \
         libavdevice/Makefile \
         libavdevice/Makefile \

+ 21 - 22
libavcodec/Makefile

@@ -2,7 +2,7 @@
 # libavcodec Makefile
 # libavcodec Makefile
 # (c) 2000-2005 Fabrice Bellard
 # (c) 2000-2005 Fabrice Bellard
 #
 #
-include ../config.mak
+include $(SUBDIR)../config.mak
 
 
 NAME = avcodec
 NAME = avcodec
 FFLIBS = avutil
 FFLIBS = avutil
@@ -449,7 +449,7 @@ ALTIVEC-OBJS-$(CONFIG_VC1_DECODER)     += ppc/vc1dsp_altivec.o
 ALTIVEC-OBJS-$(CONFIG_WMV3_DECODER)    += ppc/vc1dsp_altivec.o
 ALTIVEC-OBJS-$(CONFIG_WMV3_DECODER)    += ppc/vc1dsp_altivec.o
 
 
 # -maltivec is needed in order to build AltiVec code.
 # -maltivec is needed in order to build AltiVec code.
-$(ALTIVEC-OBJS-yes): CFLAGS += -maltivec -mabi=altivec
+$(addprefix $(SUBDIR),$(ALTIVEC-OBJS-yes)): CFLAGS += -maltivec -mabi=altivec
 
 
 # check_altivec must be built without -maltivec
 # check_altivec must be built without -maltivec
 OBJS-$(HAVE_ALTIVEC)                   += $(ALTIVEC-OBJS-yes)       \
 OBJS-$(HAVE_ALTIVEC)                   += $(ALTIVEC-OBJS-yes)       \
@@ -469,23 +469,22 @@ ifeq ($(ARCH_X86),yes)
 TESTS += cpuid-test$(EXESUF) motion-test$(EXESUF)
 TESTS += cpuid-test$(EXESUF) motion-test$(EXESUF)
 endif
 endif
 
 
-include ../common.mak
-
-clean::
-	rm -f \
-	   alpha/*.o alpha/*~ \
-	   armv4l/*.o armv4l/*~ \
-	   bfin/*.o bfin/*~ \
-	   i386/*.o i386/*~ \
-	   mlib/*.o mlib/*~ \
-	   ppc/*.o ppc/*~ \
-	   ps2/*.o ps2/*~ \
-	   sh4/*.o sh4/*~ \
-	   sparc/*.o sparc/*~ \
-	   apiexample$(EXESUF)
-
-cpuid-test$(EXESUF): i386/cputest.c
-apiexample$(EXESUF): apiexample.o $(LIBNAME)
-dct-test$(EXESUF): dct-test.o fdctref.o $(LIBNAME)
-fft-test$(EXESUF): fft-test.o $(LIBNAME)
-motion-test$(EXESUF): motion-test.o $(LIBNAME)
+CLEANFILES = \
+    alpha/*.o alpha/*~ \
+    armv4l/*.o armv4l/*~ \
+    bfin/*.o bfin/*~ \
+    i386/*.o i386/*~ \
+    mlib/*.o mlib/*~ \
+    ppc/*.o ppc/*~ \
+    ps2/*.o ps2/*~ \
+    sh4/*.o sh4/*~ \
+    sparc/*.o sparc/*~ \
+    apiexample$(EXESUF)
+
+include $(SUBDIR)../subdir.mak
+
+$(SUBDIR)cpuid-test$(EXESUF): $(SUBDIR)i386/cputest.c
+$(SUBDIR)apiexample$(EXESUF): $(SUBDIR)apiexample.o $(SUBDIR)$(LIBNAME)
+$(SUBDIR)dct-test$(EXESUF): $(SUBDIR)dct-test.o fdctref.o $(SUBDIR)$(LIBNAME)
+$(SUBDIR)fft-test$(EXESUF): $(SUBDIR)fft-test.o $(SUBDIR)$(LIBNAME)
+$(SUBDIR)motion-test$(EXESUF): $(SUBDIR)motion-test.o $(SUBDIR)$(LIBNAME)

+ 2 - 2
libavdevice/Makefile

@@ -1,4 +1,4 @@
-include ../config.mak
+include $(SUBDIR)../config.mak
 
 
 NAME = avdevice
 NAME = avdevice
 FFLIBS = avformat avcodec avutil
 FFLIBS = avformat avcodec avutil
@@ -23,4 +23,4 @@ OBJS-$(CONFIG_LIBDC1394_DEMUXER)         += libdc1394.o
 CPP_OBJS-$(CONFIG_AUDIO_BEOS_DEMUXER)     += beosaudio.o
 CPP_OBJS-$(CONFIG_AUDIO_BEOS_DEMUXER)     += beosaudio.o
 CPP_OBJS-$(CONFIG_AUDIO_BEOS_MUXER)       += beosaudio.o
 CPP_OBJS-$(CONFIG_AUDIO_BEOS_MUXER)       += beosaudio.o
 
 
-include ../common.mak
+include $(SUBDIR)../subdir.mak

+ 2 - 2
libavfilter/Makefile

@@ -1,4 +1,4 @@
-include ../config.mak
+include $(SUBDIR)../config.mak
 
 
 NAME = avfilter
 NAME = avfilter
 FFLIBS = avcodec avutil
 FFLIBS = avcodec avutil
@@ -14,4 +14,4 @@ OBJS = allfilters.o \
 
 
 HEADERS = avfilter.h
 HEADERS = avfilter.h
 
 
-include ../common.mak
+include $(SUBDIR)../subdir.mak

+ 2 - 2
libavformat/Makefile

@@ -2,7 +2,7 @@
 # libavformat Makefile
 # libavformat Makefile
 # (c) 2000-2003 Fabrice Bellard
 # (c) 2000-2003 Fabrice Bellard
 #
 #
-include ../config.mak
+include $(SUBDIR)../config.mak
 
 
 NAME = avformat
 NAME = avformat
 FFLIBS = avcodec avutil
 FFLIBS = avcodec avutil
@@ -198,4 +198,4 @@ OBJS-$(CONFIG_RTP_PROTOCOL)              += rtpproto.o
 OBJS-$(CONFIG_TCP_PROTOCOL)              += tcp.o
 OBJS-$(CONFIG_TCP_PROTOCOL)              += tcp.o
 OBJS-$(CONFIG_UDP_PROTOCOL)              += udp.o
 OBJS-$(CONFIG_UDP_PROTOCOL)              += udp.o
 
 
-include ../common.mak
+include $(SUBDIR)../subdir.mak

+ 4 - 5
libavutil/Makefile

@@ -1,4 +1,4 @@
-include ../config.mak
+include $(SUBDIR)../config.mak
 
 
 NAME = avutil
 NAME = avutil
 
 
@@ -41,9 +41,8 @@ HEADERS = adler32.h \
 
 
 TESTS = $(addsuffix -test$(EXESUF), adler32 aes crc des lls md5 sha1 softfloat tree)
 TESTS = $(addsuffix -test$(EXESUF), adler32 aes crc des lls md5 sha1 softfloat tree)
 
 
-include ../common.mak
+include $(SUBDIR)../subdir.mak
 
 
-lzo-test$(EXESUF): EXTRALIBS += -llzo2
+$(SUBDIR)lzo-test$(EXESUF): EXTRALIBS += -llzo2
 
 
-clean::
-	rm -f lzo-test$(EXESUF)
+CLEANFILES = lzo-test$(EXESUF)

+ 2 - 2
libpostproc/Makefile

@@ -1,4 +1,4 @@
-include ../config.mak
+include $(SUBDIR)../config.mak
 
 
 NAME = postproc
 NAME = postproc
 FFLIBS = avutil
 FFLIBS = avutil
@@ -7,4 +7,4 @@ HEADERS = postprocess.h
 
 
 OBJS = postprocess.o
 OBJS = postprocess.o
 
 
-include ../common.mak
+include $(SUBDIR)../subdir.mak

+ 75 - 0
subdir.mak

@@ -0,0 +1,75 @@
+SRC_DIR := $(SRC_PATH_BARE)/lib$(NAME)
+
+include $(SUBDIR)../common.mak
+
+LIBVERSION := $(lib$(NAME)_VERSION)
+LIBMAJOR   := $(lib$(NAME)_VERSION_MAJOR)
+
+ifeq ($(BUILD_STATIC),yes)
+all: $(SUBDIR)$(LIBNAME)
+
+install-libs: install-lib$(NAME)-static
+
+$(SUBDIR)$(LIBNAME): $(OBJS)
+	rm -f $@
+	$(AR) rc $@ $^ $(EXTRAOBJS)
+	$(RANLIB) $@
+endif
+
+INCINSTDIR := $(INCDIR)/lib$(NAME)
+
+define RULES
+ifeq ($(BUILD_SHARED),yes)
+all: $(SUBDIR)$(SLIBNAME)
+
+install-libs: install-lib$(NAME)-shared
+
+$(SUBDIR)$(SLIBNAME): $(SUBDIR)$(SLIBNAME_WITH_MAJOR)
+	cd ./$(SUBDIR) && $(LN_S) $(SLIBNAME_WITH_MAJOR) $(SLIBNAME)
+
+$(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(OBJS)
+	$(SLIB_CREATE_DEF_CMD)
+	$(CC) $(SHFLAGS) $(FFLDFLAGS) -o $$@ $$^ $(FFEXTRALIBS) $(EXTRAOBJS)
+	$(SLIB_EXTRA_CMD)
+
+ifneq ($(SUBDIR),)
+$(SUBDIR)$(SLIBNAME_WITH_MAJOR): \
+    $(foreach L,$(FFLIBS),lib$(L)/$(SLIBPREF)$(L)$(SLIBSUF))
+endif
+endif
+
+install-lib$(NAME)-shared: $(SUBDIR)$(SLIBNAME)
+	install -d "$(SHLIBDIR)"
+	install -m 755 $(SUBDIR)$(SLIBNAME) "$(SHLIBDIR)/$(SLIBNAME_WITH_VERSION)"
+	$(STRIP) "$(SHLIBDIR)/$(SLIBNAME_WITH_VERSION)"
+	cd "$(SHLIBDIR)" && \
+		$(LN_S) $(SLIBNAME_WITH_VERSION) $(SLIBNAME_WITH_MAJOR)
+	cd "$(SHLIBDIR)" && \
+		$(LN_S) $(SLIBNAME_WITH_VERSION) $(SLIBNAME)
+	$(SLIB_INSTALL_EXTRA_CMD)
+
+install-lib$(NAME)-static: $(SUBDIR)$(LIBNAME)
+	install -d "$(LIBDIR)"
+	install -m 644 $(SUBDIR)$(LIBNAME) "$(LIBDIR)"
+	$(LIB_INSTALL_EXTRA_CMD)
+
+install-headers::
+	install -d "$(INCINSTDIR)"
+	install -d "$(LIBDIR)/pkgconfig"
+	install -m 644 $(addprefix "$(SRC_DIR)"/,$(HEADERS)) "$(INCINSTDIR)"
+	install -m 644 $(BUILD_ROOT)/lib$(NAME).pc "$(LIBDIR)/pkgconfig"
+
+uninstall-libs::
+	-rm -f "$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR)" \
+	       "$(SHLIBDIR)/$(SLIBNAME)"            \
+	       "$(SHLIBDIR)/$(SLIBNAME_WITH_VERSION)"
+	-$(SLIB_UNINSTALL_EXTRA_CMD)
+	-rm -f "$(LIBDIR)/$(LIBNAME)"
+
+uninstall-headers::
+	rm -f $(addprefix "$(INCINSTDIR)/",$(HEADERS))
+	rm -f "$(LIBDIR)/pkgconfig/lib$(NAME).pc"
+	-rmdir "$(INCDIR)"
+endef
+
+$(eval $(RULES))