1VERSION = 0.2.0 2 3API_MAJOR = 0 4API_MINOR = 1 5API_PATCH = 0 6 7CFLAGS := -std=gnu99 -D_FILE_OFFSET_BITS=64 -Wall -Wextra -O3 -ffast-math -g -MMD $(CFLAGS) 8 9PREFIX ?= /usr/local 10BINDIR ?= $(PREFIX)/bin 11MYLIBDIR ?= $(PREFIX)/lib 12MYINCLUDEDIR ?= $(PREFIX)/include 13 14SRC_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST)))) 15vpath %.c $(SRC_DIR) 16vpath %.h $(SRC_DIR) 17vpath %.pc.in $(SRC_DIR) 18 19-include .config 20 21ifdef CONFIG_DEBUG 22 CFLAGS += -D_DEBUG 23else 24 CFLAGS += -DNDEBUG 25endif 26 27ifdef CONFIG_WINDOWS 28 EXESUF ?= .exe 29 DLLSUF ?= .dll 30 LIBSUF ?= .a 31else 32 DLLSUF ?= .so 33 LIBSUF ?= .a 34 LIBS ?= -lm 35 ifdef CONFIG_SHARED 36 SONAMESUF ?= .$(API_MAJOR).$(API_MINOR).$(API_PATCH) 37 SONAMESUF_MAJOR ?= .$(API_MAJOR) 38 SONAME ?= libdcadec$(DLLSUF)$(SONAMESUF_MAJOR) 39 endif 40endif 41 42ifdef CONFIG_SHARED 43 OUT_LIB ?= libdcadec/libdcadec$(DLLSUF)$(SONAMESUF) 44else 45 OUT_LIB ?= libdcadec/libdcadec$(LIBSUF) 46endif 47 48OUT_DEC ?= dcadec$(EXESUF) 49OUT_CUT ?= dcacut$(EXESUF) 50 51OUT_DEV ?= test/stddev$(EXESUF) 52SRC_DEV ?= test/stddev.c 53CFLAGS_DEV ?= -O2 -Wall -Wextra 54 55SRC_LIB = \ 56libdcadec/bitstream.c \ 57libdcadec/core_decoder.c \ 58libdcadec/dca_context.c \ 59libdcadec/dmix_tables.c \ 60libdcadec/exss_parser.c \ 61libdcadec/idct_fixed.c \ 62libdcadec/idct_float.c \ 63libdcadec/interpolator.c \ 64libdcadec/interpolator_fixed.c \ 65libdcadec/interpolator_float.c \ 66libdcadec/ta.c \ 67libdcadec/xll_decoder.c 68INC_LIB = \ 69libdcadec/dca_context.h 70 71ifndef CONFIG_SMALL 72SRC_LIB += libdcadec/dca_frame.c 73SRC_LIB += libdcadec/dca_stream.c 74SRC_LIB += libdcadec/dca_waveout.c 75INC_LIB += libdcadec/dca_frame.h 76INC_LIB += libdcadec/dca_stream.h 77INC_LIB += libdcadec/dca_waveout.h 78endif 79 80OBJ_LIB = $(SRC_LIB:.c=.o) 81DEP_LIB = $(SRC_LIB:.c=.d) 82 83SRC_DEC = dcadec.c 84OBJ_DEC = $(SRC_DEC:.c=.o) 85DEP_DEC = $(SRC_DEC:.c=.d) 86 87SRC_CUT = dcacut.c 88OBJ_CUT = $(SRC_CUT:.c=.o) 89DEP_CUT = $(SRC_CUT:.c=.d) 90 91default: $(OUT_LIB) $(OUT_DEC) 92 93lib: $(OUT_LIB) 94 95all: $(OUT_LIB) $(OUT_DEC) $(OUT_CUT) 96 97-include $(DEP_LIB) $(DEP_DEC) $(DEP_CUT) 98 99$(OBJ_LIB): | objdir 100$(OBJ_DEC): | objdir 101$(OBJ_CUT): | objdir 102 103objdir: 104 mkdir -p libdcadec 105 106ifdef CONFIG_SHARED 107 CFLAGS_DLL = $(CFLAGS) -DDCADEC_SHARED -DDCADEC_INTERNAL 108 LDFLAGS_DLL = $(LDFLAGS) -shared 109 110 ifdef CONFIG_WINDOWS 111 IMP_LIB = libdcadec/libdcadec$(DLLSUF)$(LIBSUF) 112 IMP_DEF = libdcadec/libdcadec.def 113 EXTRA_LIB = $(IMP_LIB) $(IMP_DEF) 114 LDFLAGS_DLL += -static-libgcc 115 LDFLAGS_DLL += -Wl,--nxcompat,--dynamicbase 116 LDFLAGS_DLL += -Wl,--output-def,$(IMP_DEF) 117 LDFLAGS_DLL += -Wl,--out-implib,$(IMP_LIB) 118 else 119 CFLAGS_DLL += -fPIC -fvisibility=hidden 120 ifdef SONAME 121 LDFLAGS_DLL += -Wl,-soname,$(SONAME) 122 EXTRA_LIB += libdcadec/libdcadec$(DLLSUF) 123 EXTRA_LIB += libdcadec/libdcadec$(DLLSUF)$(SONAMESUF_MAJOR) 124 endif 125 IMP_LIB = -Llibdcadec -ldcadec 126 endif 127 128libdcadec/%.o: libdcadec/%.c 129 $(CC) -c $(CFLAGS_DLL) -o $@ $< 130 131$(OUT_LIB): $(OBJ_LIB) 132 $(CC) $(LDFLAGS_DLL) -o $@ $(OBJ_LIB) $(LIBS) 133ifdef SONAME 134 ln -sf $(@F) libdcadec/libdcadec$(DLLSUF) 135 ln -sf $(@F) libdcadec/libdcadec$(DLLSUF)$(SONAMESUF_MAJOR) 136endif 137 138$(OUT_DEC): $(OBJ_DEC) $(OUT_LIB) 139 $(CC) $(LDFLAGS) -o $@ $(OBJ_DEC) $(IMP_LIB) $(LIBS) 140 141$(OUT_CUT): $(OBJ_CUT) $(OUT_LIB) 142 $(CC) $(LDFLAGS) -o $@ $(OBJ_CUT) $(IMP_LIB) $(LIBS) 143 144else 145 146$(OUT_LIB): $(OBJ_LIB) 147 $(AR) crsu $@ $(OBJ_LIB) 148 149$(OUT_DEC): $(OBJ_DEC) $(OUT_LIB) 150 $(CC) $(LDFLAGS) -o $@ $(OBJ_DEC) $(OUT_LIB) $(LIBS) 151 152$(OUT_CUT): $(OBJ_CUT) $(OUT_LIB) 153 $(CC) $(LDFLAGS) -o $@ $(OBJ_CUT) $(OUT_LIB) $(LIBS) 154 155endif 156 157$(OUT_DEV): $(SRC_DEV) 158 $(CC) $(LDFLAGS) -o $@ $(CFLAGS_DEV) $< $(LIBS) 159 160check: $(OUT_DEC) $(OUT_DEV) 161 cd test && ./test.sh 162 163clean: 164 $(RM) $(OUT_LIB) $(OBJ_LIB) $(DEP_LIB) $(EXTRA_LIB) 165 $(RM) $(OUT_DEC) $(OBJ_DEC) $(DEP_DEC) 166 $(RM) $(OUT_CUT) $(OBJ_CUT) $(DEP_CUT) 167 $(RM) dcadec.pc 168 $(RM) $(OUT_DEV) 169 $(RM) -r test/decoded 170 171.PHONY: dcadec.pc 172dcadec.pc: dcadec.pc.in 173 sed 's,%PREFIX%,$(PREFIX),;s,%MYLIBDIR%,$(MYLIBDIR),;s,%MYINCLUDEDIR%,$(MYINCLUDEDIR),;s,%VERSION%,$(VERSION),' $< > $@ 174 175install-lib: $(OUT_LIB) dcadec.pc 176 install -d -m 755 $(DESTDIR)$(MYLIBDIR) $(DESTDIR)$(PREFIX)/libdata/pkgconfig $(DESTDIR)$(MYINCLUDEDIR)/libdcadec 177 install -m 644 $(OUT_LIB) $(DESTDIR)$(MYLIBDIR) 178 install -m 644 $(addprefix $(SRC_DIR)/, $(INC_LIB)) $(DESTDIR)$(MYINCLUDEDIR)/libdcadec 179 install -m 644 dcadec.pc $(DESTDIR)$(PREFIX)/libdata/pkgconfig 180ifdef SONAME 181 ln -sf libdcadec$(DLLSUF)$(SONAMESUF) $(DESTDIR)$(MYLIBDIR)/libdcadec$(DLLSUF) 182 ln -sf libdcadec$(DLLSUF)$(SONAMESUF) $(DESTDIR)$(MYLIBDIR)/libdcadec$(DLLSUF)$(SONAMESUF_MAJOR) 183endif 184 185install-dec: $(OUT_DEC) 186 install -d -m 755 $(DESTDIR)$(BINDIR) 187 install -m 755 $(OUT_DEC) $(DESTDIR)$(BINDIR) 188 189install: install-lib install-dec 190