# Copyright 1992-1996 by Jutta Degener and Carsten Bormann, Technische
# Universitaet Berlin. See the accompanying file "COPYRIGHT" for
# details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
# Machine- or installation dependent flags you should configure to port
SASR = -DSASR
######### Define SASR if >> is a signed arithmetic shift (-1 >> 1 == -1)
# MULHACK = -DUSE_FLOAT_MUL
######### Define this if your host multiplies floats faster than integers,
######### e.g. on a SPARCstation.
# FAST = -DFAST
######### Define together with USE_FLOAT_MUL to enable the GSM library's
######### approximation option for incorrect, but good-enough results.
# LTP_CUT = -DLTP_CUT
LTP_CUT =
######### Define to enable the GSM library's long-term correlation
######### approximation option---faster, but worse; works for
######### both integer and floating point multiplications.
######### This flag is still in the experimental stage.
WAV49 = -DWAV49
# WAV49 =
######### Define to enable the GSM library's option to pack GSM frames
######### in the style used by the WAV #49 format. If you want to write
######### a tool that produces .WAV files which contain GSM-encoded data,
######### define this, and read about the GSM_OPT_WAV49 option in the
######### manual page on gsm_option(3).
# Choose a compiler. The code works both with ANSI and K&R-C.
# Use -DNeedFunctionPrototypes to compile with, -UNeedFunctionPrototypes to
# compile without, function prototypes in the header files.
#
# You can use the -DSTUPID_COMPILER to circumvent some compilers'
# static limits regarding the number of subexpressions in a statement.
# CC = cc
# CCFLAGS = -c -DSTUPID_COMPILER
# CC = /usr/lang/acc
# CCFLAGS = -c -O
CC = gcc -ansi -pedantic
CCFLAGS = -c -O2 -DNeedFunctionPrototypes=1 -Wall -Wno-comment
LD = $(CC)
# LD = gcc
# LDFLAGS =
# If your compiler needs additional flags/libraries, regardless of
# the source compiled, configure them here.
# CCINC = -I/usr/gnu/lib/gcc-2.1/gcc-lib/sparc-sun-sunos4.1.2/2.1/include
######### Includes needed by $(CC)
# LDINC = -L/usr/gnu/lib/gcc-2.1/gcc-lib/sparc-sun-sunos4.1.2/2.1
######### Library paths needed by $(LD)
# LDLIB = -lgcc
######### Additional libraries needed by $(LD)
# Where do you want to install libraries, binaries, a header file
# and the manual pages?
#
# Leave INSTALL_ROOT empty (or just don't execute "make install") to
# not install gsm and toast outside of this directory.
INSTALL_ROOT =
# Where do you want to install the gsm library, header file, and manpages?
#
# Leave GSM_INSTALL_ROOT empty to not install the GSM library outside of
# this directory.
GSM_INSTALL_ROOT = $(INSTALL_ROOT)
GSM_INSTALL_LIB = $(GSM_INSTALL_ROOT)/lib
GSM_INSTALL_INC = $(GSM_INSTALL_ROOT)/inc
GSM_INSTALL_MAN = $(GSM_INSTALL_ROOT)/man/man3
# Where do you want to install the toast binaries and their manpage?
#
# Leave TOAST_INSTALL_ROOT empty to not install the toast binaries outside
# of this directory.
TOAST_INSTALL_ROOT = $(INSTALL_ROOT)
TOAST_INSTALL_BIN = $(TOAST_INSTALL_ROOT)/bin
TOAST_INSTALL_MAN = $(TOAST_INSTALL_ROOT)/man/man1
# Other tools
SHELL = /bin/sh
LN = ln
BASENAME = basename
AR = ar
ARFLAGS = cr
RMFLAGS =
FIND = find
COMPRESS = compress
COMPRESSFLAGS =
# RANLIB = true
RANLIB = ranlib
#
# You shouldn't have to configure below this line if you're porting.
#
# Local Directories
ROOT = .
ADDTST = $(ROOT)/add-test
TST = $(ROOT)/tst
MAN = $(ROOT)/man
BIN = $(ROOT)/bin
SRC = $(ROOT)/src
LIB = $(ROOT)/lib
TLS = $(ROOT)/tls
INC = $(ROOT)/inc
# Flags
# DEBUG = -DNDEBUG
######### Remove -DNDEBUG to enable assertions.
CFLAGS = $(CCFLAGS) $(SASR) $(DEBUG) $(MULHACK) $(FAST) $(LTP_CUT) \
$(WAV49) $(CCINC) -I$(INC)
######### It's $(CC) $(CFLAGS)
LFLAGS = $(LDFLAGS) $(LDINC)
######### It's $(LD) $(LFLAGS)
# Targets
LIBGSM = $(LIB)/libgsm.a
TOAST = $(BIN)/toast
UNTOAST = $(BIN)/untoast
TCAT = $(BIN)/tcat
# Headers
GSM_HEADERS = $(INC)/gsm.h
HEADERS = $(INC)/proto.h \
$(INC)/unproto.h \
$(INC)/config.h \
$(INC)/private.h \
$(INC)/gsm.h \
$(INC)/toast.h \
$(TLS)/taste.h
# Sources
GSM_SOURCES = $(SRC)/add.c \
$(SRC)/code.c \
$(SRC)/debug.c \
$(SRC)/decode.c \
$(SRC)/long_term.c \
$(SRC)/lpc.c \
$(SRC)/preprocess.c \
$(SRC)/rpe.c \
$(SRC)/gsm_destroy.c \
$(SRC)/gsm_decode.c \
$(SRC)/gsm_encode.c \
$(SRC)/gsm_explode.c \
$(SRC)/gsm_implode.c \
$(SRC)/gsm_create.c \
$(SRC)/gsm_print.c \
$(SRC)/gsm_option.c \
$(SRC)/short_term.c \
$(SRC)/table.c
TOAST_SOURCES = $(SRC)/toast.c \
$(SRC)/toast_lin.c \
$(SRC)/toast_ulaw.c \
$(SRC)/toast_alaw.c \
$(SRC)/toast_audio.c
SOURCES = $(GSM_SOURCES) \
$(TOAST_SOURCES) \
$(ADDTST)/add_test.c \
$(TLS)/sour.c \
$(TLS)/ginger.c \
$(TLS)/sour1.dta \
$(TLS)/sour2.dta \
$(TLS)/bitter.c \
$(TLS)/bitter.dta \
$(TLS)/taste.c \
$(TLS)/sweet.c \
$(TST)/cod2lin.c \
$(TST)/cod2txt.c \
$(TST)/gsm2cod.c \
$(TST)/lin2cod.c \
$(TST)/lin2txt.c
# Object files
GSM_OBJECTS = $(SRC)/add.o \
$(SRC)/code.o \
$(SRC)/debug.o \
$(SRC)/decode.o \
$(SRC)/long_term.o \
$(SRC)/lpc.o \
$(SRC)/preprocess.o \
$(SRC)/rpe.o \
$(SRC)/gsm_destroy.o \
$(SRC)/gsm_decode.o \
$(SRC)/gsm_encode.o \
$(SRC)/gsm_explode.o \
$(SRC)/gsm_implode.o \
$(SRC)/gsm_create.o \
$(SRC)/gsm_print.o \
$(SRC)/gsm_option.o \
$(SRC)/short_term.o \
$(SRC)/table.o
TOAST_OBJECTS = $(SRC)/toast.o \
$(SRC)/toast_lin.o \
$(SRC)/toast_ulaw.o \
$(SRC)/toast_alaw.o \
$(SRC)/toast_audio.o
OBJECTS = $(GSM_OBJECTS) $(TOAST_OBJECTS)
# Manuals
GSM_MANUALS = $(MAN)/gsm.3 \
$(MAN)/gsm_explode.3 \
$(MAN)/gsm_option.3 \
$(MAN)/gsm_print.3
TOAST_MANUALS = $(MAN)/toast.1
MANUALS = $(GSM_MANUALS) $(TOAST_MANUALS) $(MAN)/bitter.1
# Other stuff in the distribution
STUFF = ChangeLog \
INSTALL \
MACHINES \
MANIFEST \
Makefile \
README \
$(ADDTST)/add_test.dta \
$(TLS)/bitter.dta \
$(TST)/run
# Install targets
GSM_INSTALL_TARGETS = \
$(GSM_INSTALL_LIB)/libgsm.a \
$(GSM_INSTALL_INC)/gsm.h \
$(GSM_INSTALL_MAN)/gsm.3 \
$(GSM_INSTALL_MAN)/gsm_explode.3 \
$(GSM_INSTALL_MAN)/gsm_option.3 \
$(GSM_INSTALL_MAN)/gsm_print.3
TOAST_INSTALL_TARGETS = \
$(TOAST_INSTALL_BIN)/toast \
$(TOAST_INSTALL_BIN)/tcat \
$(TOAST_INSTALL_BIN)/untoast \
$(TOAST_INSTALL_MAN)/toast.1
# Default rules
.c.o:
$(CC) $(CFLAGS) $?
@-mv `$(BASENAME) $@` $@ > /dev/null 2>&1
# Target rules
all: $(LIBGSM) $(TOAST) $(TCAT) $(UNTOAST)
@-echo $(ROOT): Done.
tst: $(TST)/lin2cod $(TST)/cod2lin $(TOAST) $(TST)/test-result
@-echo tst: Done.
addtst: $(ADDTST)/add $(ADDTST)/add_test.dta
$(ADDTST)/add < $(ADDTST)/add_test.dta > /dev/null
@-echo addtst: Done.
misc: $(TLS)/sweet $(TLS)/bitter $(TLS)/sour $(TLS)/ginger \
$(TST)/lin2txt $(TST)/cod2txt $(TST)/gsm2cod
@-echo misc: Done.
install: toastinstall gsminstall
@-echo install: Done.
# The basic API: libgsm
$(LIBGSM): $(LIB) $(GSM_OBJECTS)
-rm $(RMFLAGS) $(LIBGSM)
$(AR) $(ARFLAGS) $(LIBGSM) $(GSM_OBJECTS)
$(RANLIB) $(LIBGSM)
# Toast, Untoast and Tcat -- the compress-like frontends to gsm.
$(TOAST): $(BIN) $(TOAST_OBJECTS) $(LIBGSM)
$(LD) $(LFLAGS) -o $(TOAST) $(TOAST_OBJECTS) $(LIBGSM) $(LDLIB)
$(UNTOAST): $(BIN) $(TOAST)
-rm $(RMFLAGS) $(UNTOAST)
$(LN) $(TOAST) $(UNTOAST)
$(TCAT): $(BIN) $(TOAST)
-rm $(RMFLAGS) $(TCAT)
$(LN) $(TOAST) $(TCAT)
# The local bin and lib directories
$(BIN):
if [ ! -d $(BIN) ] ; then mkdir $(BIN) ; fi
$(LIB):
if [ ! -d $(LIB) ] ; then mkdir $(LIB) ; fi
# Installation
gsminstall:
-if [ x"$(GSM_INSTALL_ROOT)" != x ] ; then \
make $(GSM_INSTALL_TARGETS) ; \
fi
toastinstall:
-if [ x"$(TOAST_INSTALL_ROOT)" != x ]; then \
make $(TOAST_INSTALL_TARGETS); \
fi
gsmuninstall:
-if [ x"$(GSM_INSTALL_ROOT)" != x ] ; then \
rm $(RMFLAGS) $(GSM_INSTALL_TARGETS) ; \
fi
toastuninstall:
-if [ x"$(TOAST_INSTALL_ROOT)" != x ] ; then \
rm $(RMFLAGS) $(TOAST_INSTALL_TARGETS); \
fi
$(TOAST_INSTALL_BIN)/toast: $(TOAST)
-rm $@
cp $(TOAST) $@
chmod 755 $@
$(TOAST_INSTALL_BIN)/untoast: $(TOAST_INSTALL_BIN)/toast
-rm $@
ln $? $@
$(TOAST_INSTALL_BIN)/tcat: $(TOAST_INSTALL_BIN)/toast
-rm $@
ln $? $@
$(TOAST_INSTALL_MAN)/toast.1: $(MAN)/toast.1
-rm $@
cp $? $@
chmod 444 $@
$(GSM_INSTALL_MAN)/gsm.3: $(MAN)/gsm.3
-rm $@
cp $? $@
chmod 444 $@
$(GSM_INSTALL_MAN)/gsm_option.3: $(MAN)/gsm_option.3
-rm $@
cp $? $@
chmod 444 $@
$(GSM_INSTALL_MAN)/gsm_explode.3: $(MAN)/gsm_explode.3
-rm $@
cp $? $@
chmod 444 $@
$(GSM_INSTALL_MAN)/gsm_print.3: $(MAN)/gsm_print.3
-rm $@
cp $? $@
chmod 444 $@
$(GSM_INSTALL_INC)/gsm.h: $(INC)/gsm.h
-rm $@
cp $? $@
chmod 444 $@
$(GSM_INSTALL_LIB)/libgsm.a: $(LIBGSM)
-rm $@
cp $? $@
chmod 444 $@
# Distribution
dist: gsm-1.0.tar.Z
@echo dist: Done.
gsm-1.0.tar.Z: $(STUFF) $(SOURCES) $(HEADERS) $(MANUALS)
( cd $(ROOT)/..; \
tar cvf - `cat $(ROOT)/gsm-1.0/MANIFEST \
| sed '/^#/d'` \
) | $(COMPRESS) $(COMPRESSFLAGS) > $(ROOT)/gsm-1.0.tar.Z
# Clean
uninstall: toastuninstall gsmuninstall
@-echo uninstall: Done.
semi-clean:
-rm $(RMFLAGS) */*.o \
$(TST)/lin2cod $(TST)/lin2txt \
$(TST)/cod2lin $(TST)/cod2txt \
$(TST)/gsm2cod \
$(TST)/*.*.*
-$(FIND) . \( -name core -o -name foo \) \
-print | xargs rm $(RMFLAGS)
clean: semi-clean
-rm $(RMFLAGS) $(LIBGSM) $(ADDTST)/add \
$(TOAST) $(TCAT) $(UNTOAST) \
$(ROOT)/gsm-1.0.tar.Z
# Two tools that helped me generate gsm_encode.c and gsm_decode.c,
# but aren't generally needed to port this.
$(TLS)/sweet: $(TLS)/sweet.o $(TLS)/taste.o
$(LD) $(LFLAGS) -o $(TLS)/sweet \
$(TLS)/sweet.o $(TLS)/taste.o $(LDLIB)
$(TLS)/bitter: $(TLS)/bitter.o $(TLS)/taste.o
$(LD) $(LFLAGS) -o $(TLS)/bitter \
$(TLS)/bitter.o $(TLS)/taste.o $(LDLIB)
# A version of the same family that Jeff Chilton used to implement
# the WAV #49 GSM format.
$(TLS)/ginger: $(TLS)/ginger.o $(TLS)/taste.o
$(LD) $(LFLAGS) -o $(TLS)/ginger \
$(TLS)/ginger.o $(TLS)/taste.o $(LDLIB)
$(TLS)/sour: $(TLS)/sour.o $(TLS)/taste.o
$(LD) $(LFLAGS) -o $(TLS)/sour \
$(TLS)/sour.o $(TLS)/taste.o $(LDLIB)
# Run $(ADDTST)/add < $(ADDTST)/add_test.dta to make sure the
# basic arithmetic functions work as intended.
$(ADDTST)/add: $(ADDTST)/add_test.o
$(LD) $(LFLAGS) -o $(ADDTST)/add $(ADDTST)/add_test.o $(LDLIB)
# Various conversion programs between linear, text, .gsm and the code
# format used by the tests we ran (.cod). We paid for the test data,
# so I guess we can't just provide them with this package. Still,
# if you happen to have them lying around, here's the code.
#
# You can use gsm2cod | cod2txt independently to look at what's
# coded inside the compressed frames, although this shouldn't be
# hard to roll on your own using the gsm_print() function from
# the API.
$(TST)/test-result: $(TST)/lin2cod $(TST)/cod2lin $(TOAST) $(TST)/run
( cd $(TST); ./run )
$(TST)/lin2txt: $(TST)/lin2txt.o $(LIBGSM)
$(LD) $(LFLAGS) -o $(TST)/lin2txt \
$(TST)/lin2txt.o $(LIBGSM) $(LDLIB)
$(TST)/lin2cod: $(TST)/lin2cod.o $(LIBGSM)
$(LD) $(LFLAGS) -o $(TST)/lin2cod \
$(TST)/lin2cod.o $(LIBGSM) $(LDLIB)
$(TST)/gsm2cod: $(TST)/gsm2cod.o $(LIBGSM)
$(LD) $(LFLAGS) -o $(TST)/gsm2cod \
$(TST)/gsm2cod.o $(LIBGSM) $(LDLIB)
$(TST)/cod2txt: $(TST)/cod2txt.o $(LIBGSM)
$(LD) $(LFLAGS) -o $(TST)/cod2txt \
$(TST)/cod2txt.o $(LIBGSM) $(LDLIB)
$(TST)/cod2lin: $(TST)/cod2lin.o $(LIBGSM)
$(LD) $(LFLAGS) -o $(TST)/cod2lin \
$(TST)/cod2lin.o $(LIBGSM) $(LDLIB)