cannam@154: # NOTE: This Makefile requires GNU make cannam@154: # Location to put the targets. cannam@154: TARGETBINDIR = . cannam@154: TESTBINDIR = tests cannam@154: TARGETLIBDIR = . cannam@154: # Name of the targets cannam@154: LIBOPUSFILE_TARGET = libopusfile.a cannam@154: LIBOPUSURL_TARGET = libopusurl.a cannam@154: OPUSFILE_EXAMPLE_TARGET = opusfile_example cannam@154: SEEKING_EXAMPLE_TARGET = seeking_example cannam@154: # Test targets cannam@154: #TODO: tests cannam@154: FOO_TARGET = foo cannam@154: # The command to use to generate dependency information cannam@154: MAKEDEPEND = ${CC} -MM cannam@154: #MAKEDEPEND = makedepend -f- -Y -- cannam@154: # Optional features to enable cannam@154: #CFLAGS := $(CFLAGS) -DOP_HAVE_LRINTF cannam@154: CFLAGS := $(CFLAGS) -DOP_ENABLE_HTTP cannam@154: # Extra compilation flags. cannam@154: # You may get speed increases by including flags such as -O2 or -O3 or cannam@154: # -ffast-math, or additional flags, depending on your system and compiler. cannam@154: # The -g flag will generally include debugging information. cannam@154: CFLAGS := -g $(CFLAGS) cannam@154: CFLAGS := -DOP_ENABLE_ASSERTIONS $(CFLAGS) cannam@154: # These are gcc-only, but not actually critical. cannam@154: CFLAGS := -fPIC $(CFLAGS) cannam@154: CFLAGS := -std=c89 -pedantic $(CFLAGS) cannam@154: CFLAGS := -fvisibility=hidden $(CFLAGS) cannam@154: CFLAGS := -Wextra -Wno-parentheses -Wno-long-long $(CFLAGS) cannam@154: CFLAGS := -Wall $(CFLAGS) cannam@154: # The list of pkg-config packages we depend on. cannam@154: PACKAGES := ogg opus cannam@154: ifeq ($(findstring -DOP_ENABLE_HTTP,${CFLAGS}),-DOP_ENABLE_HTTP) cannam@154: PACKAGES += openssl cannam@154: endif cannam@154: # The location of include files. cannam@154: # Modify these to point to your Ogg and Opus include directories if they are cannam@154: # not installed in a standard location. cannam@154: CINCLUDE := `pkg-config --cflags ${PACKAGES}` cannam@154: cannam@154: # Libraries to link with, and the location of library files. cannam@154: LIBS := `pkg-config --libs ${PACKAGES}` cannam@154: ifeq ($(findstring -DOP_HAVE_LRINTF,${CFLAGS}),-DOP_HAVE_LRINTF) cannam@154: LIBS := -lm $(LIBS) cannam@154: endif cannam@154: cannam@154: # Extras for the MS target cannam@154: ifneq ($(findstring mingw,${CC}),) cannam@154: LIBS += -lwsock32 -lws2_32 -lgdi32 -lcrypt32 cannam@154: EXEEXT := .exe cannam@154: endif cannam@154: cannam@154: RANLIB ?= ranlib cannam@154: cannam@154: #TODO: tests cannam@154: FOO_LIBS = cannam@154: cannam@154: # ANYTHING BELOW THIS LINE PROBABLY DOES NOT NEED EDITING cannam@154: CINCLUDE := -I../include ${CINCLUDE} cannam@154: LIBSRCDIR = ../src cannam@154: BINSRCDIR = ../examples cannam@154: TESTSRCDIR = ${LIBSRCDIR} cannam@154: WORKDIR = objs cannam@154: cannam@154: # C source file lists cannam@154: LIBOPUSFILE_CSOURCES = \ cannam@154: http.c \ cannam@154: info.c \ cannam@154: internal.c \ cannam@154: opusfile.c \ cannam@154: stream.c \ cannam@154: cannam@154: LIBOPUSFILE_CHEADERS = \ cannam@154: internal.h \ cannam@154: cannam@154: LIBOPUSURL_CSOURCES = \ cannam@154: internal.c \ cannam@154: http.c \ cannam@154: cannam@154: ifneq ($(findstring mingw,${CC}),) cannam@154: LIBOPUSURL_CSOURCES += wincerts.c cannam@154: endif cannam@154: cannam@154: LIBOPUSURL_CHEADERS = \ cannam@154: internal.h \ cannam@154: cannam@154: OPUSFILE_EXAMPLE_CSOURCES = opusfile_example.c cannam@154: cannam@154: SEEKING_EXAMPLE_CSOURCES = seeking_example.c cannam@154: cannam@154: ifneq ($(findstring mingw,${CC}),) cannam@154: OPUSFILE_EXAMPLE_CSOURCES += win32utf8.c cannam@154: SEEKING_EXAMPLE_CSOURCES += win32utf8.c cannam@154: endif cannam@154: cannam@154: FOO_CSOURCES = tests/foo.c cannam@154: cannam@154: # Create object file list. cannam@154: LIBOPUSFILE_OBJS:= ${LIBOPUSFILE_CSOURCES:%.c=${WORKDIR}/%.o} cannam@154: LIBOPUSFILE_ASMS:= ${LIBOPUSFILE_OBJS:%.o=%.s} cannam@154: LIBOPUSFILE_DEPS:= ${LIBOPUSFILE_OBJS:%.o=%.d} cannam@154: LIBOPUSURL_OBJS:= ${LIBOPUSURL_CSOURCES:%.c=${WORKDIR}/%.o} cannam@154: LIBOPUSURL_ASMS:= ${LIBOPUSURL_OBJS:%.o=%.s} cannam@154: LIBOPUSURL_DEPS:= ${LIBOPUSURL_OBJS:%.o=%.d} cannam@154: OPUSFILE_EXAMPLE_OBJS:= ${OPUSFILE_EXAMPLE_CSOURCES:%.c=${WORKDIR}/%.o} cannam@154: SEEKING_EXAMPLE_OBJS:= ${SEEKING_EXAMPLE_CSOURCES:%.c=${WORKDIR}/%.o} cannam@154: #TODO: tests cannam@154: FOO_OBJS:= ${FOO_CSOURCES:%.c=${WORKDIR}/%.o} cannam@154: ALL_OBJS:= \ cannam@154: ${LIBOPUSFILE_OBJS} \ cannam@154: ${LIBOPUSURL_OBJS} \ cannam@154: ${OPUSFILE_EXAMPLE_OBJS} \ cannam@154: ${SEEKING_EXAMPLE_OBJS} \ cannam@154: cannam@154: #TODO: tests cannam@154: # ${FOO_OBJS} cannam@154: cannam@154: # Create the dependency file list cannam@154: ALL_DEPS:= ${ALL_OBJS:%.o=%.d} cannam@154: # Prepend source path to file names. cannam@154: LIBOPUSFILE_CSOURCES:= ${LIBOPUSFILE_CSOURCES:%=${LIBSRCDIR}/%} cannam@154: LIBOPUSFILE_CHEADERS:= ${LIBOPUSFILE_CHEADERS:%=${LIBSRCDIR}/%} cannam@154: LIBOPUSURL_CSOURCES:= ${LIBOPUSURL_CSOURCES:%=${LIBSRCDIR}/%} cannam@154: LIBOPUSURL_CHEADERS:= ${LIBOPUSURL_CHEADERS:%=${LIBSRCDIR}/%} cannam@154: OPUSFILE_EXAMPLE_CSOURCES:= ${OPUSFILE_EXAMPLE_CSOURCES:%=${BINSRCDIR}/%} cannam@154: SEEKING_EXAMPLE_CSOURCES:= ${SEEKING_EXAMPLE_CSOURCES:%=${BINSRCDIR}/%} cannam@154: #TODO: tests cannam@154: FOO_CSOURCES:= ${FOO_CSOURCES:%=${TESTSRCDIR}/%} cannam@154: ALL_CSOURCES:= \ cannam@154: ${LIBOPUSFILE_CSOURCES} \ cannam@154: ${LIBOPUSURL_CSOURCES} \ cannam@154: ${OPUSFILE_EXAMPLE_CSOURCES} \ cannam@154: ${SEEKING_EXAMPLE_CSOURCES} \ cannam@154: cannam@154: #TODO: tests cannam@154: # ${FOO_CSOURCES} \ cannam@154: # Prepand target path to file names. cannam@154: LIBOPUSFILE_TARGET:= ${TARGETLIBDIR}/${LIBOPUSFILE_TARGET} cannam@154: LIBOPUSURL_TARGET:= ${TARGETLIBDIR}/${LIBOPUSURL_TARGET} cannam@154: OPUSFILE_EXAMPLE_TARGET:= ${TARGETBINDIR}/${OPUSFILE_EXAMPLE_TARGET}${EXEEXT} cannam@154: SEEKING_EXAMPLE_TARGET:= ${TARGETBINDIR}/${SEEKING_EXAMPLE_TARGET}${EXEEXT} cannam@154: # Prepend test path to file names. cannam@154: #TODO: tests cannam@154: FOO_TARGET:= ${TESTBINDIR}/${FOO_TARGET} cannam@154: # Complete set of targets cannam@154: ALL_TARGETS:= \ cannam@154: ${LIBOPUSFILE_TARGET} \ cannam@154: ${LIBOPUSURL_TARGET} \ cannam@154: ${OPUSFILE_EXAMPLE_TARGET} \ cannam@154: ${SEEKING_EXAMPLE_TARGET} \ cannam@154: cannam@154: #TODO: tests cannam@154: # ${FOO_TARGET} \ cannam@154: cannam@154: # Targets: cannam@154: # Everything (default) cannam@154: all: ${ALL_TARGETS} cannam@154: cannam@154: # libopusfile cannam@154: ${LIBOPUSFILE_TARGET}: ${LIBOPUSFILE_OBJS} cannam@154: mkdir -p ${TARGETLIBDIR} cannam@154: $(AR) cqs $@ ${LIBOPUSFILE_OBJS} cannam@154: -$(RANLIB) $@ cannam@154: cannam@154: # libopusurl cannam@154: ${LIBOPUSURL_TARGET}: ${LIBOPUSURL_OBJS} cannam@154: mkdir -p ${TARGETLIBDIR} cannam@154: $(AR) cqs $@ ${LIBOPUSURL_OBJS} cannam@154: -$(RANLIB) $@ cannam@154: cannam@154: # opusfile_example cannam@154: ${OPUSFILE_EXAMPLE_TARGET}: ${OPUSFILE_EXAMPLE_OBJS} ${LIBOPUSFILE_TARGET} \ cannam@154: ${LIBOPUSURL_TARGET} cannam@154: mkdir -p ${TARGETBINDIR} cannam@154: ${CC} ${CFLAGS} ${OPUSFILE_EXAMPLE_OBJS} ${LIBOPUSFILE_TARGET} \ cannam@154: ${LIBOPUSURL_TARGET} ${LIBS} -o $@ cannam@154: cannam@154: # seeking_example cannam@154: ${SEEKING_EXAMPLE_TARGET}: ${SEEKING_EXAMPLE_OBJS} ${LIBOPUSFILE_TARGET} \ cannam@154: ${LIBOPUSURL_TARGET} cannam@154: mkdir -p ${TARGETBINDIR} cannam@154: ${CC} ${CFLAGS} ${SEEKING_EXAMPLE_OBJS} ${LIBOPUSFILE_TARGET} \ cannam@154: ${LIBOPUSURL_TARGET} ${LIBS} -o $@ cannam@154: cannam@154: #TODO: cannam@154: #tests: foo cannam@154: # cannam@154: #${FOO_TARGET}: ${FOO_OBJS} cannam@154: # mkdir -p ${TESTBINDIR} cannam@154: # ${CC} ${CFLAGS} ${FOO_OBJS} ${FOO_LIBS} -o $@ cannam@154: # cannam@154: #tests-clean: cannam@154: # -rmdir ${TESTBINDIR} cannam@154: cannam@154: # Assembly listing cannam@154: ALL_ASM := ${ALL_OBJS:%.o=%.s} cannam@154: asm: ${ALL_ASM} cannam@154: cannam@154: # Check that build is complete. cannam@154: check: all cannam@154: cannam@154: # Remove all targets. cannam@154: clean: cannam@154: ${RM} ${ALL_ASM} ${ALL_OBJS} ${ALL_DEPS} cannam@154: ${RM} ${ALL_TARGETS} cannam@154: -rmdir ${WORKDIR} cannam@154: cannam@154: # Make everything depend on changes in the Makefile cannam@154: # This vpath directive needs to be before any include statements cannam@154: vpath Makefile $(dir $(lastword $(MAKEFILE_LIST))) cannam@154: ${ALL_ASM} ${ALL_OBJS} ${ALL_DEPS} ${ALL_TARGETS} : Makefile cannam@154: cannam@154: # Specify which targets are phony for GNU make cannam@154: .PHONY : all clean check cannam@154: cannam@154: # Rules cannam@154: ${WORKDIR}/%.d: ${LIBSRCDIR}/%.c cannam@154: mkdir -p ${dir $@} cannam@154: ${MAKEDEPEND} ${CINCLUDE} ${CFLAGS} $< -MT ${@:%.d=%.o} > $@ cannam@154: ${MAKEDEPEND} ${CINCLUDE} ${CFLAGS} $< -MT ${@:%.d=%.s} >> $@ cannam@154: ${MAKEDEPEND} ${CINCLUDE} ${CFLAGS} $< -MT $@ >> $@ cannam@154: ${WORKDIR}/%.s: ${LIBSRCDIR}/%.c cannam@154: mkdir -p ${dir $@} cannam@154: ${CC} ${CINCLUDE} ${CFLAGS} -S -o $@ $< cannam@154: ${WORKDIR}/%.o: ${LIBSRCDIR}/%.c cannam@154: mkdir -p ${dir $@} cannam@154: ${CC} ${CINCLUDE} ${CFLAGS} -c -o $@ $< cannam@154: cannam@154: ${WORKDIR}/%.d : ${BINSRCDIR}/%.c cannam@154: mkdir -p ${dir $@} cannam@154: ${MAKEDEPEND} ${CINCLUDE} ${CFLAGS} $< -MT ${@:%.d=%.o} > $@ cannam@154: ${WORKDIR}/%.s : ${BINSRCDIR}/%.c ${WORKDIR}/%.o cannam@154: mkdir -p ${dir $@} cannam@154: ${CC} ${CINCLUDE} ${CFLAGS} -S -o $@ $< cannam@154: ${WORKDIR}/%.o : ${BINSRCDIR}/%.c cannam@154: mkdir -p ${dir $@} cannam@154: ${CC} ${CINCLUDE} ${CFLAGS} -c -o $@ $< cannam@154: cannam@154: # Include header file dependencies, except when cleaning cannam@154: ifneq ($(MAKECMDGOALS),clean) cannam@154: include ${ALL_DEPS} cannam@154: endif