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