| 1 | # |
| 2 | # common bits used by all libraries |
| 3 | # |
| 4 | |
| 5 | # first so "all" becomes default target |
| 6 | all: all-yes |
| 7 | |
| 8 | ifndef SUBDIR |
| 9 | |
| 10 | ifndef V |
| 11 | Q = @ |
| 12 | ECHO = printf "$(1)\t%s\n" $(2) |
| 13 | BRIEF = CC CXX HOSTCC HOSTLD AS YASM AR LD STRIP CP WINDRES |
| 14 | SILENT = DEPCC DEPHOSTCC DEPAS DEPYASM RANLIB RM |
| 15 | |
| 16 | MSG = $@ |
| 17 | M = @$(call ECHO,$(TAG),$@); |
| 18 | $(foreach VAR,$(BRIEF), \ |
| 19 | $(eval override $(VAR) = @$$(call ECHO,$(VAR),$$(MSG)); $($(VAR)))) |
| 20 | $(foreach VAR,$(SILENT),$(eval override $(VAR) = @$($(VAR)))) |
| 21 | $(eval INSTALL = @$(call ECHO,INSTALL,$$(^:$(SRC_DIR)/%=%)); $(INSTALL)) |
| 22 | endif |
| 23 | |
| 24 | ALLFFLIBS = avcodec avdevice avfilter avformat avresample avutil postproc swscale swresample |
| 25 | |
| 26 | # NASM requires -I path terminated with / |
| 27 | IFLAGS := -I. -I$(SRC_PATH)/ |
| 28 | CPPFLAGS := $(IFLAGS) $(CPPFLAGS) |
| 29 | CFLAGS += $(ECFLAGS) |
| 30 | CCFLAGS = $(CPPFLAGS) $(CFLAGS) |
| 31 | ASFLAGS := $(CPPFLAGS) $(ASFLAGS) |
| 32 | CXXFLAGS += $(CPPFLAGS) $(CFLAGS) |
| 33 | YASMFLAGS += $(IFLAGS:%=%/) -Pconfig.asm |
| 34 | |
| 35 | HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS) |
| 36 | LDFLAGS := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS) |
| 37 | |
| 38 | define COMPILE |
| 39 | $(call $(1)DEP,$(1)) |
| 40 | $($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $< |
| 41 | endef |
| 42 | |
| 43 | COMPILE_C = $(call COMPILE,CC) |
| 44 | COMPILE_CXX = $(call COMPILE,CXX) |
| 45 | COMPILE_S = $(call COMPILE,AS) |
| 46 | COMPILE_HOSTC = $(call COMPILE,HOSTCC) |
| 47 | |
| 48 | %.o: %.c |
| 49 | $(COMPILE_C) |
| 50 | |
| 51 | %.o: %.cpp |
| 52 | $(COMPILE_CXX) |
| 53 | |
| 54 | %.o: %.m |
| 55 | $(COMPILE_C) |
| 56 | |
| 57 | %.s: %.c |
| 58 | $(CC) $(CPPFLAGS) $(CFLAGS) -S -o $@ $< |
| 59 | |
| 60 | %.o: %.S |
| 61 | $(COMPILE_S) |
| 62 | |
| 63 | %_host.o: %.c |
| 64 | $(COMPILE_HOSTC) |
| 65 | |
| 66 | %.o: %.rc |
| 67 | $(WINDRES) $(IFLAGS) --preprocessor "$(DEPWINDRES) -E -xc-header -DRC_INVOKED $(CC_DEPFLAGS)" -o $@ $< |
| 68 | |
| 69 | %.i: %.c |
| 70 | $(CC) $(CCFLAGS) $(CC_E) $< |
| 71 | |
| 72 | %.h.c: |
| 73 | $(Q)echo '#include "$*.h"' >$@ |
| 74 | |
| 75 | %.ver: %.v |
| 76 | $(Q)sed 's/$$MAJOR/$($(basename $(@F))_VERSION_MAJOR)/' $^ > $@ |
| 77 | |
| 78 | %.c %.h: TAG = GEN |
| 79 | |
| 80 | # Dummy rule to stop make trying to rebuild removed or renamed headers |
| 81 | %.h: |
| 82 | @: |
| 83 | |
| 84 | # Disable suffix rules. Most of the builtin rules are suffix rules, |
| 85 | # so this saves some time on slow systems. |
| 86 | .SUFFIXES: |
| 87 | |
| 88 | # Do not delete intermediate files from chains of implicit rules |
| 89 | $(OBJS): |
| 90 | endif |
| 91 | |
| 92 | include $(SRC_PATH)/arch.mak |
| 93 | |
| 94 | OBJS += $(OBJS-yes) |
| 95 | SLIBOBJS += $(SLIBOBJS-yes) |
| 96 | FFLIBS := $($(NAME)_FFLIBS) $(FFLIBS-yes) $(FFLIBS) |
| 97 | TESTPROGS += $(TESTPROGS-yes) |
| 98 | |
| 99 | LDLIBS = $(FFLIBS:%=%$(BUILDSUF)) |
| 100 | FFEXTRALIBS := $(LDLIBS:%=$(LD_LIB)) $(EXTRALIBS) |
| 101 | |
| 102 | OBJS := $(sort $(OBJS:%=$(SUBDIR)%)) |
| 103 | SLIBOBJS := $(sort $(SLIBOBJS:%=$(SUBDIR)%)) |
| 104 | TESTOBJS := $(TESTOBJS:%=$(SUBDIR)%) $(TESTPROGS:%=$(SUBDIR)%-test.o) |
| 105 | TESTPROGS := $(TESTPROGS:%=$(SUBDIR)%-test$(EXESUF)) |
| 106 | HOSTOBJS := $(HOSTPROGS:%=$(SUBDIR)%.o) |
| 107 | HOSTPROGS := $(HOSTPROGS:%=$(SUBDIR)%$(HOSTEXESUF)) |
| 108 | TOOLS += $(TOOLS-yes) |
| 109 | TOOLOBJS := $(TOOLS:%=tools/%.o) |
| 110 | TOOLS := $(TOOLS:%=tools/%$(EXESUF)) |
| 111 | HEADERS += $(HEADERS-yes) |
| 112 | |
| 113 | PATH_LIBNAME = $(foreach NAME,$(1),lib$(NAME)/$($(CONFIG_SHARED:yes=S)LIBNAME)) |
| 114 | DEP_LIBS := $(foreach lib,$(FFLIBS),$(call PATH_LIBNAME,$(lib))) |
| 115 | |
| 116 | SRC_DIR := $(SRC_PATH)/lib$(NAME) |
| 117 | ALLHEADERS := $(subst $(SRC_DIR)/,$(SUBDIR),$(wildcard $(SRC_DIR)/*.h $(SRC_DIR)/$(ARCH)/*.h)) |
| 118 | SKIPHEADERS += $(ARCH_HEADERS:%=$(ARCH)/%) $(SKIPHEADERS-) |
| 119 | SKIPHEADERS := $(SKIPHEADERS:%=$(SUBDIR)%) |
| 120 | HOBJS = $(filter-out $(SKIPHEADERS:.h=.h.o),$(ALLHEADERS:.h=.h.o)) |
| 121 | checkheaders: $(HOBJS) |
| 122 | .SECONDARY: $(HOBJS:.o=.c) |
| 123 | |
| 124 | alltools: $(TOOLS) |
| 125 | |
| 126 | $(HOSTOBJS): %.o: %.c |
| 127 | $(COMPILE_HOSTC) |
| 128 | |
| 129 | $(HOSTPROGS): %$(HOSTEXESUF): %.o |
| 130 | $(HOSTLD) $(HOSTLDFLAGS) $(HOSTLD_O) $^ $(HOSTLIBS) |
| 131 | |
| 132 | $(OBJS): | $(sort $(dir $(OBJS))) |
| 133 | $(HOBJS): | $(sort $(dir $(HOBJS))) |
| 134 | $(HOSTOBJS): | $(sort $(dir $(HOSTOBJS))) |
| 135 | $(SLIBOBJS): | $(sort $(dir $(SLIBOBJS))) |
| 136 | $(TESTOBJS): | $(sort $(dir $(TESTOBJS))) |
| 137 | $(TOOLOBJS): | tools |
| 138 | |
| 139 | OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SLIBOBJS) $(TESTOBJS)) |
| 140 | |
| 141 | CLEANSUFFIXES = *.d *.o *~ *.h.c *.map *.ver *.ho *.gcno *.gcda |
| 142 | DISTCLEANSUFFIXES = *.pc |
| 143 | LIBSUFFIXES = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a |
| 144 | |
| 145 | define RULES |
| 146 | clean:: |
| 147 | $(RM) $(OBJS) $(OBJS:.o=.d) |
| 148 | $(RM) $(HOSTPROGS) |
| 149 | $(RM) $(TOOLS) |
| 150 | endef |
| 151 | |
| 152 | $(eval $(RULES)) |
| 153 | |
| 154 | -include $(wildcard $(OBJS:.o=.d) $(HOSTOBJS:.o=.d) $(TESTOBJS:.o=.d) $(HOBJS:.o=.d) $(SLIBOBJS:.o=.d)) |