# Makefile for LAME 3.xx -*- makefile -*- # # LAME is reported to work under: # Linux (i86), NetBSD 1.3.2 (StrongARM), FreeBSD (i86) # Compaq Alpha(OSF, Linux, Tru64 Unix), Sun Solaris, SGI IRIX, # OS2 Warp, Macintosh PPC, BeOS, Amiga and even VC++ # # these variables are available on command line: # # make UNAME=xxxxx ARCH=xxxxx - specify a type of host # make PGM=lame_exp - specify a name of an executable file # # if you have mingw32-gcc, try: # make -fMakefile.unix UNAME=MSDOS # or if you get the error # "process_begin: CreateProcess((null), copy configMS.h config.h, ...)": # make -fMakefile.unix UNAME=MSDOS NOUNIXCMD=NO # or if you have NASM: # make -fMakefile.unix UNAME=MSDOS HAVE_NASM=YES # ifeq ($(UNAME),MSDOS) UNAME ?= UNKNOWN ARCH = x86 NOUNIXCMD = YES else UNAME = $(shell uname) ARCH = $(shell uname -m) iARCH = $(patsubst i%86,x86,$(ARCH)) endif HAVE_NASM = NO HAVE_NEWER_GLIBC = NO NASM_FLAGS=elf # generic defaults. OS specific options go in versious sections below PGM = lame CC = gcc CC_OPTS = -O CPP_OPTS = -Iinclude -Impglib -Ifrontend -Ilibmp3lame AR = ar RANLIB = ranlib GTK = GTKLIBS = LIBSNDFILE = LIBS = -lm MP3LIB = libmp3lame/libmp3lame.a MP3LIB_SHARED = libmp3lame/libmp3lame.so MAKEDEP = -M BRHIST_SWITCH = LIBTERMCAP = RM = rm -f CPP_OPTS += -DHAVE_CONFIG_H -I. ########################################################################## # -DHAVEMPGLIB compiles the mpglib *decoding* library into libmp3lame ########################################################################## CPP_OPTS += -DHAVE_MPGLIB ########################################################################## # -DTAKEHIRO_IEEE754_HACK enables Takehiro's IEEE hack ########################################################################## ifeq ($(iARCH),x86) ifeq ($(CFG),RH_SSE) # SSE and IEEE754 HACK don't work together else CPP_OPTS += -DTAKEHIRO_IEEE754_HACK endif endif ########################################################################## # Define these in the OS specific sections below to compile in code # for the optional VBR bitrate histogram. # Requires ncurses, but libtermcap also works. # If you have any trouble, just dont define these # # BRHIST_SWITCH = -DBRHIST -DHAVE_TERMCAP -DHAVE_{NCURSES_}TERMCAP_H # LIBTERMCAP = -lncurses # LIBTERMCAP = -ltermcap # # or, to try and simulate TERMCAP (ANSI), use: # BRHIST_SWITCH = -DBRHIST # ########################################################################## ########################################################################## # Define these in the OS specific sections below to compile in code for: # # SNDLIB = -DLIBSNDFILE to use Erik de Castro Lopo's libsndfile # http://www.zip.com.au/~erikd/libsndfile/ instead of LAME's internal # routines. Also set: # # LIBSNDFILE = -lsndfile # or # LIBSNDFILE = -L/location_of_libsndfile -lsndfile # ########################################################################## ########################################################################## # Define these in the OS specific sections below to compile in code for # the GTK mp3 frame analyzer # # Requires -DHAVE_MPGLIB # # GTK = -DHAVE_GTK `gtk-config --cflags` # GTKLIBS = `gtk-config --libs` # ########################################################################## ########################################################################## # LINUX ########################################################################## ifeq ($(UNAME),Linux) # The frame analyzer depends on gtk1.2. Uncomment the next 2 lines to get it # GTK = -DHAVE_GTK `gtk-config --cflags` # GTKLIBS = `gtk-config --libs` # Comment out next 2 lines if you want to remove VBR histogram capability BRHIST_SWITCH = -DHAVE_TERMCAP -DHAVE_TERMCAP_H LIBTERMCAP = -lncurses # uncomment to use LIBSNDFILE # SNDLIB = -DLIBSNDFILE # LIBSNDFILE=-lsndfile # suggested for gcc-2.7.x # CC_OPTS = -O3 -fomit-frame-pointer -funroll-loops -ffast-math -finline-functions -Wall -pedantic # CC_OPTS = -O9 -fomit-frame-pointer -fno-strength-reduce -mpentiumpro -ffast-math -finline-functions -funroll-loops -Wall -malign-double -g -march=pentiumpro -mfancy-math-387 -pipe -pedantic # Suggested for GCC 4.* & machines with sse+sse2+sse3: -Os might reduce # the use of the instruction cache and, thus, get better performance, # but this should be experimented by the user. Customize at your own # convenience. # #CC_OPTS = -pipe -O3 \ # -Wall -Wextra -pedantic \ # -Wmissing-declarations -Wfloat-equal -Wshadow \ # -Wcast-qual -Wcast-align -Wdisabled-optimization \ # -ffast-math -ftree-vectorize -ftree-vect-loop-version \ # -mtune=nocona -march=nocona -mfpmath=sse -msse -msse2 -msse3 \ # -malign-double -maccumulate-outgoing-args # for debugging: CC_OPTS = -UNDEBUG -O -Wall -pedantic -ggdb -DABORTFP # for lots of debugging: # CC_OPTS = -DDEBUG -UNDEBUG -O -Wall -pedantic -g -DABORTFP ifeq ($(CFG),RH) GTK = -DHAVE_GTK `gtk-config --cflags` GTKLIBS = `gtk-config --libs` CPP_OPTS += -DFLOAT8=float -DREAL_IS_FLOAT=1 -DHAVE_ICONV -DHAVE_XMMINTRIN_H -D_ALLOW_INTERNAL_OPTIONS # these options for gcc-3.2 & AthlonXP CC_OPTS = \ -pipe -O3 \ -Wall -W -Wmissing-declarations -Wfloat-equal -Wformat \ -Wcast-qual -Wcast-align -Wdisabled-optimization -Wshadow \ -march=athlon-xp \ -malign-double \ -maccumulate-outgoing-args # -Wconversion -Wunreachable-code \ HAVE_NEWER_GLIBC = YES HAVE_NASM = YES endif ifeq ($(CFG),RH_SSE) GTK = -DHAVE_GTK `gtk-config --cflags` GTKLIBS = `gtk-config --libs` CPP_OPTS += -DFLOAT8=float -DREAL_IS_FLOAT=1 -DHAVE_ICONV -DHAVE_XMMINTRIN_H -DMIN_ARCH_SSE -D_ALLOW_INTERNAL_OPTIONS # these options for gcc-3.2 & AthlonXP CC_OPTS = \ -std=c99 -pipe -O3 -fstrict-aliasing \ -Wall -W -Wmissing-declarations -Wfloat-equal -Wformat \ -Wcast-qual -Wcast-align -Wdisabled-optimization -Wshadow \ -Wunsafe-loop-optimizations \ -march=k8 \ -ffast-math \ -mfpmath=sse -msse -msse2 \ -malign-double \ -funsafe-math-optimizations \ -funsafe-loop-optimizations \ -maccumulate-outgoing-args # -Dpowf=pow -Dfabsf=fabs -Dlog10f=log10 # -fsingle-precision-constant \ # -Wconversion -Wunreachable-code \ # -ftree-vectorizer-verbose=10 \ HAVE_NEWER_GLIBC = YES # HAVE_NASM = YES NASM_FLAGS = elf64 endif ifeq ($(CFG),RH_INTEL) CC=icc GTK = -DHAVE_GTK `gtk-config --cflags` GTKLIBS = `gtk-config --libs` CPP_OPTS += -DFLOAT8=float -DREAL_IS_FLOAT=1 -DHAVE_ICONV -DHAVE_XMMINTRIN_H -DMIN_ARCH_SSE -D_ALLOW_INTERNAL_OPTIONS CC_OPTS = \ -cxxlib-nostd \ -O3 -fno-alias -ip -finline-limit=400 \ -scalar-rep # -vec_report5 -opt-report # -parallel endif ifeq ($(CFG),PFK) CPP_OPTS += -DKLEMM -DKLEMM_00 -DKLEMM_01 -DKLEMM_02 -DKLEMM_03 -DKLEMM_04 -DKLEMM_05 -DKLEMM_06 -DKLEMM_07 -DKLEMM_08 -DKLEMM_09 -DKLEMM_10 -DKLEMM_11 -DKLEMM_12 -DKLEMM_13 -DKLEMM_14 -DKLEMM_15 -DKLEMM_16 -DKLEMM_17 -DKLEMM_18 -DKLEMM_19 -DKLEMM_20 -DKLEMM_21 -DKLEMM_22 -DKLEMM_23 -DKLEMM_24 -DKLEMM_25 -DKLEMM_26 -DKLEMM_27 -DKLEMM_28 -DKLEMM_29 -DKLEMM_30 -DKLEMM_31 -DKLEMM_32 -DKLEMM_33 -DKLEMM_34 -DKLEMM_35 -DKLEMM_36 -DKLEMM_37 -DKLEMM_38 -DKLEMM_39 -DKLEMM_40 -DKLEMM_41 -DKLEMM_42 -DKLEMM_43 -DKLEMM_44 -DKLEMM_45 -DKLEMM_46 -DKLEMM_47 -DKLEMM_48 -DKLEMM_49 -DKLEMM_50 CC_OPTS = \ -Wall -O9 -fomit-frame-pointer -march=pentium \ -finline-functions -fexpensive-optimizations \ -funroll-loops -funroll-all-loops -pipe -fschedule-insns2 \ -fstrength-reduce \ -malign-double -mfancy-math-387 -ffast-math HAVE_NEWER_GLIBC = YES HAVE_NASM = YES endif ########################################################################## # LINUX on Digital/Compaq Alpha CPUs ########################################################################## ifeq ($(ARCH),alpha) ################################################################ #### Check if 'ccc' is in our path #### if not, use 'gcc' ################################################################ ifeq ($(shell which ccc 2>/dev/null | grep -c ccc),0) # double is faster than float on Alpha CC_OPTS = -O4 -pedantic -Wall -fomit-frame-pointer -ffast-math -funroll-loops \ -mfp-regs -fschedule-insns -fschedule-insns2 \ -finline-functions \ # -DFLOAT=double # add "-mcpu=21164a -Wa,-m21164a" to optimize for 21164a (ev56) CPU ################################################################ #### else, use 'ccc' ################################################################ else # Compaq's C Compiler CC = ccc ################################################################ #### set 'CC_OPTS = -arch host -tune host' to generate/tune instructions for this machine #### 'CC_OPTS += -migrate -fast -inline speed -unroll 0' tweak to run as fast as possible :) #### 'CC_OPTS += -w0 -pedantic -Wall' set warning and linking flags ################################################################ CC_OPTS = -arch host -tune host CC_OPTS += -migrate -fast -inline speed -unroll 0 CC_OPTS += -w0 -pedantic -Wall ################################################################ #### to debug, uncomment ################################################################ # For Debugging #CC_OPTS += -g3 ################################################################ #### define __DECALPHA__ (i was getting re-declaration warnings #### in machine.h ################################################################ # Define DEC Alpha CPP_OPTS += -D__DECALPHA__ # standard Linux libm #LIBS = -lm # optimized libffm (free fast math library) #LIBS = -lffm # Compaq's fast math library LIBS = -lcpml endif # gcc or ccc? endif # alpha endif # linux ########################################################################## # FreeBSD ########################################################################## ifeq ($(UNAME),FreeBSD) # remove if you do not have GTK or do not want the GTK frame analyzer GTK = -DHAVE_GTK `gtk12-config --cflags` GTKLIBS = `gtk12-config --libs` # Comment out next 2 lines if you want to remove VBR histogram capability BRHIST_SWITCH = -DHAVE_TERMCAP -DHAVE_TERMCAP_H LIBTERMCAP = -lncurses endif ########################################################################## # OpenBSD ########################################################################## ifeq ($(UNAME),OpenBSD) # remove if you do not have GTK or do not want the GTK frame analyzer GTK = -DHAVE_GTK `gtk-config --cflags` GTKLIBS = `gtk-config --libs` # Comment out next 2 lines if you want to remove VBR histogram capability BRHIST_SWITCH = -DHAVE_TERMCAP -DHAVE_TERMCAP_H LIBTERMCAP = -lcurses endif ########################################################################## # SunOS ########################################################################## ifeq ($(UNAME),SunOS) CC = cc CC_OPTS = -O -xCC MAKEDEP = -xM # for gcc, use instead: # CC = gcc # CC_OPTS = -O # MAKEDEP = -M endif ########################################################################## # SGI ########################################################################## ifeq ($(UNAME),IRIX64) CC = cc CC_OPTS = -O3 -woff all #optonal: # GTK = -DHAVE_GTK `gtk-config --cflags` # GTKLIBS = `gtk-config --libs` # BRHIST_SWITCH = -DBRHIST -DHAVE_TERMCAP -DHAVE_TERMCAP_H # LIBTERMCAP = -lncurses endif ifeq ($(UNAME),IRIX) CC = cc CC_OPTS = -O3 -woff all endif ########################################################################## # Compaq Alpha running Dec Unix (OSF) ########################################################################## ifeq ($(UNAME),OSF1) CC = cc CC_OPTS = -fast -O3 -std -g3 -non_shared endif ########################################################################## # BeOS ########################################################################## ifeq ($(UNAME),BeOS) CC = $(BE_C_COMPILER) LIBS = ifeq ($(ARCH),BePC) CC_OPTS = -O9 -fomit-frame-pointer -march=pentium \ -mcpu=pentium -ffast-math -funroll-loops \ -fprofile-arcs -fbranch-probabilities else CC_OPTS = -opt all MAKEDEP = -make endif endif ########################################################################### # MOSXS (Rhapsody PPC) ########################################################################### ifeq ($(UNAME),Rhapsody) CC = cc LIBS = CC_OPTS = -O9 -ffast-math -funroll-loops -fomit-frame-pointer MAKEDEP = -make endif ########################################################################## # OS/2 ########################################################################## # Properly installed EMX runtime & development package is a prerequisite. # tools I used: make 3.76.1, uname 1.12, sed 2.05, PD-ksh 5.2.13 # ########################################################################## ifeq ($(UNAME),OS/2) SHELL=sh CC = gcc CC_OPTS = -O3 -D__OS2__ PGM = lame.exe LIBS = RANLIB = touch # I use the following for slightly better performance on my Pentium-II # using pgcc-2.91.66: # CC_OPTS = -O6 -ffast-math -funroll-loops -mpentiumpro -march=pentiumpro -D__OS2__ # for the unfortunates with a regular pentium (using pgcc): # CC_OPTS = -O6 -ffast-math -funroll-loops -mpentium -march=pentium -D__OS2__ # Comment out next 2 lines if you want to remove VBR histogram capability BRHIST_SWITCH = -DHAVE_TERMCAP -DHAVE_{NCURSES_}TERMCAP_H LIBTERMCAP = -lncurses # Uncomment & inspect the 2 GTK lines to use MP3x GTK frame analyzer. # Properly installed XFree86/devlibs & GTK+ is a prerequisite. # The following works for me using Xfree86/OS2 3.3.5 and GTK+ 1.2.3: # GTK = -DHAVE_GTK -IC:/XFree86/include/gtk12 -Zmt -D__ST_MT_ERRNO__ -IC:/XFree86/include/glib12 -IC:/XFree86/include # GTKLIBS = -LC:/XFree86/lib -Zmtd -Zsysv-signals -Zbin-files -lgtk12 -lgdk12 -lgmodule -lglib12 -lXext -lX11 -lshm -lbsd -lsocket -lm endif ########################################################################### # MSDOS/Windows ########################################################################### ifeq ($(UNAME),MSDOS) RM = CC_OPTS = \ -Wall -pipe -O3 -fomit-frame-pointer -ffast-math -funroll-loops \ -fschedule-insns2 -fmove-all-movables -freduce-all-givs \ -mcpu=pentium -march=pentium -mfancy-math-387 CC_OPTS += -D_cdecl=__cdecl PGM = lame.exe endif ########################################################################### # AmigaOS ########################################################################### # Type 'Make ARCH=PPC' for PowerUP and 'Make ARCH=WOS' for WarpOS # ########################################################################### ifeq ($(UNAME),AmigaOS) CC = gcc -noixemul CC_OPTS = -O3 -ffast-math -funroll-loops -m68020-60 -m68881 BRHIST_SWITCH = -DBRHIST MAKEDEP = -MM ifeq ($(ARCH),WOS) CC = ppc-amigaos-gcc -warpup CC_OPTS = -O3 -ffast-math -fomit-frame-pointer -funroll-loops \ -mmultiple -mcpu=603e AR = ppc-amigaos-ar RANLIB = ppc-amigaos-ranlib LIBS = endif ifeq ($(ARCH),PPC) CC = ppc-amigaos-gcc CC_OPTS = -O3 -ffast-math -fomit-frame-pointer -funroll-loops \ -mmultiple -mcpu=603e AR = ppc-amigaos-ar RANLIB = ppc-amigaos-ranlib LIBS = endif endif # 10/99 added -D__NO_MATH_INLINES to fix a bug in *all* versions of # gcc 2.8+ as of 10/99. ifeq ($(HAVE_NEWER_GLIBC),YES) CC_SWITCHES = else CC_SWITCHES = -D__NO_MATH_INLINES # only needed by some older glibc endif CC_SWITCHES += -DNDEBUG $(CC_OPTS) $(SNDLIB) $(BRHIST_SWITCH) frontend_sources = \ frontend/main.c \ frontend/amiga_mpega.c \ frontend/brhist.c \ frontend/get_audio.c \ frontend/lametime.c \ frontend/parse.c \ frontend/timestatus.c \ frontend/console.c \ lib_sources = \ libmp3lame/bitstream.c \ libmp3lame/encoder.c \ libmp3lame/fft.c \ libmp3lame/gain_analysis.c \ libmp3lame/id3tag.c \ libmp3lame/lame.c \ libmp3lame/newmdct.c \ libmp3lame/psymodel.c \ libmp3lame/quantize.c \ libmp3lame/quantize_pvt.c \ libmp3lame/set_get.c \ libmp3lame/vbrquantize.c \ libmp3lame/reservoir.c \ libmp3lame/tables.c \ libmp3lame/takehiro.c \ libmp3lame/util.c \ libmp3lame/mpglib_interface.c \ libmp3lame/VbrTag.c \ libmp3lame/version.c \ libmp3lame/presets.c \ libmp3lame/vector/xmm_quantize_sub.c \ mpglib/common.c \ mpglib/dct64_i386.c \ mpglib/decode_i386.c \ mpglib/layer1.c \ mpglib/layer2.c \ mpglib/layer3.c \ mpglib/tabinit.c \ mpglib/interface.c #ifeq ($(UNAME),MSDOS) # frontend_sources := $(subst /,\,$(frontend_sources)) # lib_sources := $(subst /,\,$(lib_sources)) #endif frontend_obj = $(frontend_sources:.c=.o) lib_obj = $(lib_sources:.c=.o) DEP = $(frontend_sources:.c=.d) $(lib_sources:.c=.d ) gtk_sources = frontend/gtkanal.c frontend/gpkplotting.c frontend/mp3x.c gtk_obj = $(gtk_sources:.c=.gtk.o) gtk_dep = $(gtk_sources:.c=.d) NASM = nasm ASFLAGS=-f $(NASM_FLAGS) -i libmp3lame/i386/ # for people with nasmw ifeq ($(UNAME),MSDOS) NASM = nasmw ASFLAGS=-f win32 -DWIN32 -i libmp3lame/i386/ endif %.o: %.nas $(NASM) $(ASFLAGS) $< -o $@ %.o: %.s gcc -c $< -o $@ #HAVE_NASM = YES ifeq ($(HAVE_NASM),YES) ## have NASM CC_SWITCHES += -DHAVE_NASM lib_obj += libmp3lame/i386/cpu_feat.o ## use MMX extension. you need nasm and MMX supported CPU. CC_SWITCHES += -DMMX_choose_table lib_obj += libmp3lame/i386/choose_table.o ## use 3DNow! extension. you need nasm and 3DNow! supported CPU. lib_obj += libmp3lame/i386/fft3dn.o ## use SSE extension. you need nasm and SSE supported CPU. lib_obj += libmp3lame/i386/fftsse.o ## not yet coded #CC_SWITCHES += -DUSE_FFTFPU #lib_obj += libmp3lame/i386/fftfpu.o endif # # Makefile rules---you probably won't have to modify below this line # %.o: %.c $(CC) $(CPP_OPTS) $(CC_SWITCHES) -c $< -o $@ %.d: %.c ifeq ($(NOUNIXCMD),YES) $(CC) $(MAKEDEP) $(CPP_OPTS) $(CC_SWITCHES) $< > $@ else $(SHELL) -ec '$(CC) $(MAKEDEP) $(CPP_OPTS) $(CC_SWITCHES) $< | sed '\''s;$*.o;& $@;g'\'' > $@' endif %.gtk.o: %.c $(CC) $(CPP_OPTS) $(CC_SWITCHES) $(GTK) -c $< -o $@ all: frontend/$(PGM) $(lib_sources) $(frontend_sources) $(gtk_sources) : config.h config.h: configMS.h ifeq ($(NOUNIXCMD),YES) copy configMS.h config.h else cp configMS.h config.h endif frontend/$(PGM): frontend/lame_main.o $(frontend_obj) $(MP3LIB) $(CC) $(CC_OPTS) -o frontend/$(PGM) frontend/lame_main.o $(frontend_obj) \ $(MP3LIB) $(LIBS) $(LIBSNDFILE) $(LIBTERMCAP) mp3x: $(frontend_obj) $(gtk_obj) $(MP3LIB) $(CC) $(CC_OPTS) -o frontend/mp3x $(frontend_obj) $(gtk_obj) \ $(MP3LIB) $(LIBS) $(LIBSNDFILE) $(LIBTERMCAP) $(GTKLIBS) mp3rtp: frontend/rtp.o frontend/mp3rtp.o $(frontend_obj) $(MP3LIB) $(CC) $(CC_OPTS) -o frontend/mp3rtp frontend/mp3rtp.o frontend/rtp.o $(frontend_obj) $(MP3LIB) \ $(LIBS) $(LIBSNDFILE) $(LIBTERMCAP) libmp3lame/libmp3lame.a: $(lib_obj) echo $(lib_obj) $(AR) cr libmp3lame/libmp3lame.a $(lib_obj) $(RANLIB) libmp3lame/libmp3lame.a #shared library. GNU specific? libmp3lame/libmp3lame.so: $(lib_obj) gcc -shared -Wl,-soname,libmp3lame/libmp3lame.so -o libmp3lame/libmp3lame.so $(lib_obj) install: frontend/$(PGM) #libmp3lame.a cp frontend/$(PGM) /usr/bin #cp libmp3lame.a /usr/lib #cp lame.h /usr/lib clean: ifeq ($(UNAME),MSDOS) -del $(subst /,\,$(frontend_obj)) -del $(subst /,\,$(lib_obj)) -del $(subst /,\,$(gtk_obj)) -del $(subst /,\,$(DEP)) -del frontend\$(PGM) -del frontend\main.o -del libmp3lame\libmp3lame.a else -$(RM) $(gtk_obj) $(frontend_obj) $(lib_obj) $(DEP) frontend/$(PGM) \ frontend/main.o frontend/lame libmp3lame/libmp3lame.a \ frontend/mp3x.o frontend/mp3x endif tags: TAGS TAGS: ${c_sources} etags -T ${c_sources} ifneq ($(MAKECMDGOALS),clean) -include $(DEP) endif # # testcase.mp3 is a 2926 byte file. The first number output by # wc is the number of bytes which differ between new output # and 'official' results. # # Because of compiler options and effects of roundoff, the # number of bytes which are different may not be zero, but # should be at most 30. # test: frontend/$(PGM) frontend/$(PGM) --nores testcase.wav testcase.new.mp3 cmp -l testcase.new.mp3 testcase.mp3 | wc -l