blob: d19344178436044a88151a49e25fab846c28ae44 [file] [log] [blame]
# Makefile.MSVC: MSVC Makefile for LAME
#
# 2000-2007 Robert Hegemann
# dedicated to the LAME project http://www.mp3dev.org
###############################################################################
#__ readme ____________________________________________________________________
# nmake -f Makefile.MSVC
# -> build lame, but not mp3x
# -> use Robert's code modifications
# -> assume MSVC 6.0 compiler available
# -> assume NASM available
# -> assemble MMX code with NASM
# -> no compiler warnings
# -> use single precision float
#
# passing arguments, one can modify the default behaviour:
# COMP=<not INTEL or BCC> -> use MS compiler
# WARN=<anything but OFF> -> give verbose compiler warnings
# ASM=<anything but YES> -> no NASM nor MMX
# MMX=<anything but YES> -> do not assemble MMX code
# CFG=<anything but RH> -> disable Robert's modifications
# CPU=P1 -> optimize for Pentium instead of P II/III
# CPU=P2 -> optimize for Pentium II/III, you need a PII or better
# CPU=P3 -> optimize for Pentium III, you need a PIII or better
# GTK=YES -> have GTK, adds mp3x to default targets
# PREC=<anything but SINGLE> -> use double instead of single float
# SNDFILE=<anything but YES> -> do not use LibSndfile for reading input files
#
# Example:
# nmake -f Makefile.MSVC CPU=P1 GTK=YES
#____________________________________________________________________ readme __
# targets <-> DOS filenames
T_LAME = lame.exe
T_MP3X = mp3x.exe
T_DLL = libmp3lame.dll
T_LIB_DYNAMIC = libmp3lame.lib
T_LIB_STATIC = libmp3lame-static.lib
T_LEGACY_DLL = lame_enc.dll
TARGET_DIR = .\output\
# default targets
PGM = $(T_LAME)
# some default settings
! IF "$(MSVCVER)" != ""
COMP = MS
! IF "$(MSVCVER)" == "Win64"
! IF "$(ASM)" == ""
ASM = NO # or it could be ML64 if we want to use it...
GTK = NO
! ENDIF
! ENDIF
! ELSE
! IF "$(COMP)" == ""
COMP = MSVC
! ENDIF
! ENDIF
! IF "$(ASM)" == ""
ASM = YES
! ENDIF
! IF "$(MMX)" == ""
MMX = YES
! ENDIF
! IF "$(CFG)" == ""
CFG = RH
! ENDIF
! IF "$(CPU)" == ""
CPU = P2auto
!if "$(PROCESSOR_LEVEL)"=="6"
CPU = P6
!endif
! ENDIF
! IF "$(WARN)" == ""
WARN = OFF
! ENDIF
! IF "$(PREC)" == ""
PREC = SINGLE
! ENDIF
! IF "$(SNDFILE)" == ""
SNDFILE = NO
! ENDIF
OFF = win32
MACHINE = /machine:I386
LIB_OPTS = /nologo $(MACHINE)
! MESSAGE ----------------------------------------------------------------------
! IF "$(CFG)" == ""
! MESSAGE building LAME
! ELSE
! MESSAGE building LAME featuring $(CFG)
! ENDIF
! IF "$(ASM)" == "YES"
! MESSAGE + ASM
! IF "$(MMX)" == "YES"
! MESSAGE + MMX
! ENDIF
! ENDIF
! IF "$(GTK)" == "YES"
! MESSAGE + GTK
! ENDIF
! IF "$(COMP)" == "INTEL"
! MESSAGE using INTEL COMPILER
! IF "$(CPU)" == "P1"
! MESSAGE + optimizing for Pentium (MMX)
! ELSE
! IF "$(CPU)" == "P2"
! MESSAGE + you need a Pentium II or better
! ELSE
! IF "$(CPU)" == "P3"
! MESSAGE + you need a Pentium III or better
! ELSE
! MESSAGE + optimizing for Pentium II/III
! ENDIF
! ENDIF
! ENDIF
! ELSE
! IF "$(MSVCVER)" == "6.0"
! MESSAGE + using MSVC 6.0 32-Bit Compiler
! IF "$(CPU)" == "P1"
! MESSAGE + optimizing for Pentium (MMX) (may slow down PIII a few percent)
! ELSE
! MESSAGE + optimizing for Pentium II/III
! ENDIF
! ELSEIF "$(MSVCVER)" == "8.0"
! MESSAGE + using MSVC 8.0 32-Bit Compiler
! IF "$(CPU)" == "P1"
! MESSAGE + optimizing for Pentium (MMX) (may slow down PIII a few percent)
! ELSE
! MESSAGE + optimizing for Pentium II/III
! ENDIF
! ELSE
! IF "$(MSVCVER)" == "Win64"
! MESSAGE + using MS 64-Bit Compiler
! ELSE
! MESSAGE using MS COMPILER
! IF "$(CPU)" == "P1"
! MESSAGE + optimizing for Pentium (MMX) (may slow down PIII a few percent)
! ELSE
! MESSAGE + optimizing for Pentium II/III
! ENDIF
! ENDIF
! ENDIF
! ENDIF
! IF "$(PREC)" == "SINGLE"
! MESSAGE + using Single precision
! ENDIF
! IF "$(SNDFILE)" == "YES"
! MESSAGE + using LibSndfile reading input files
! ENDIF
! MESSAGE ----------------------------------------------------------------------
! IF "$(COMP)" != "INTEL"
! IF "$(COMP)" != "BCC"
#__ Microsoft C options _______________________________________________________
#
# /O2 maximize speed
# /Ob<n> inline expansion
# /Og enable global optimizations
# /Oi enable intrinsic functions
# /Ot favor code speed
# /Oy enable frame pointer omission
# /G5 Pentium optimization
# /G6 Pentium II/III optimization
# /GA optimize for Windows Application
# /GF enable read-only string pooling
# /Gf enable string spooling
# /Gs disable stack checking calls
# /Gy separate functions for linker
# /QIfdiv generate code for Pentium FDIV fix
# /QI0f generate code for Pentium 0x0f erratum fix
#
# remarks:
# - aliasing options seem to break code
# - try to get the Intel compiler demonstration code!
# ICL produces faster code.
# debugging options
# CC_OPTS = /nologo /Zi /Ge /GZ
# LN_OPTS = /nologo /debug:full /debugtype:cv /fixed:no
# profiling options
# CC_OPTS = /nologo /Zi /O2b2gity /G6As /DNDEBUG
# LN_OPTS = /nologo /debug:full /debugtype:cv /fixed:no /profile
# release options
! IF "$(MSVCVER)" == "Win64"
CC_OPTS = /nologo /DWin64 /O2b2ity /GAy /Gs1024 /Zp8 /GL /GS- /Zi
! ELSEIF "$(MSVCVER)" == "8.0"
CC_OPTS = /nologo /O2 /Wp64 /Oi /GL /arch:SSE /fp:precise
! ELSEif "$(CPU)"=="P6"
CC_OPTS = /nologo /O2 /Ob2 /GAy /Gs1024 /Zp8 /Zi
!else
CC_OPTS = /nologo /O2 /Ob2 /GAy /Gs1024 /QIfdiv /QI0f /YX
! ENDIF
! IF "$(MSVCVER)" == "6.0"
! IF "$(CPU)" == "P1"
CC_OPTS = $(CC_OPTS) /G5
! ELSE
CC_OPTS = $(CC_OPTS) /G6
! ENDIF
! ENDIF
! IF "$(WARN)" == "OFF"
CC_OPTS = $(CC_OPTS) /w
! ELSE
CC_OPTS = $(CC_OPTS) /W$(WARN)
! ENDIF
! IF "$(PREC)" == "SINGLE"
CC_OPTS = $(CC_OPTS) /DFLOAT8=float /DREAL_IS_FLOAT=1
! ENDIF
CC_OPTS = $(CC_OPTS) /DNDEBUG /MD
LN_OPTS = /nologo /opt:NOWIN98 /pdb:none
LN_DLL = /nologo /DLL /opt:NOWIN98
CC_OUT = /Fo
LN_OUT = /force /OUT:
CC = cl
LN = link
#_______________________________________________________ Microsoft C options __
! ELSE
#__ Borland BCC options _______________________________________________________
#
# first draft, DLL not working, generates very slow code!
BCCINST = C:/Borland/BCC55
CC_OPTS = -pc -q -ff -fp -jb -j1 -tWC -tWM -O2 -OS -I$(BCCINST)/include -DNDEBUG -DWIN32
# dll >> -tWD
LN_OPTS = -lGn -lGi -lap -lx -L$(BCCINST)/lib
# dll >> -Tpd
! IF "$(CPU)" == "P1"
CC_OPTS = $(CC_OPTS) -5
! ELSE
CC_OPTS = $(CC_OPTS) -6
! ENDIF
! IF "$(WARN)" == "OFF"
CC_OPTS = $(CC_OPTS) -w-
! ELSE
CC_OPTS = $(CC_OPTS)
! ENDIF
LN_DLL =
#$(CCINST)/lib/cw32R.lib
LN_OUT = -e
CC_OUT = -o
CC = bcc32
LN = bcc32
OFF = obj
! ENDIF
#_______________________________________________________ Borland BCC options __
! ELSE
#__ Intel 4.5 options _________________________________________________________
#
# /YX enable automatic precompiled header file creation/usage
# /Ox maximum optimization same as /O2 without /Gfy
# /O2 same as /Gfsy /Ob1gyti
# /Gd 1) make cdecl the default calling convention
# /G5 2) optimized for Pentium
# /G6 3) optimized for Pentium II/III
# /GA assume single threaded
# /Gs[n] disable stack checks for functions with <n bytes of locals
# /GF read-only string pooling optimization
# /Gy separate functions for the linker
# /Qunroll unroll loops with default heuristic
# /QIfist enable fast float to int conversion
# /QIfdiv enable patch for Pentium with FDIV erratum
# /QI0f enable patch for Pentium with 0f erratum
# /Qip 2) enable single-file IP optimizations (within files)
# /Qipo enable multi-file IP optimizations (between files)
# /Qipo_wp 4) enable entire program multi-file IP optimizations
# /QaxiMK automatic use of specialized code for PII/III, MMX, SIMD
#
# remarks:
# 1) slows speed down, not using
# 2) faster compared to 3) or 4) on Pentium MMX at 200 MHz
! IF "$(CPU)" == "P1"
CC_OPTS = /G5 /QaxiMK /QIfdiv /QI0f
! ELSE
! IF "$(CPU)" == "P2"
CC_OPTS = /G6 /Qxi /QaxMK
! ELSE
! IF "$(CPU)" == "P3"
CC_OPTS = /G6 /QxiMK
! ELSE
CC_OPTS = /G6 /QaxiMK /QIfdiv /QI0f
! ENDIF
! ENDIF
! ENDIF
! IF "$(WARN)" == "OFF"
CC_OPTS = $(CC_OPTS) /w
! ELSE
CC_OPTS = $(CC_OPTS) /W2 /Wport
! ENDIF
! IF "$(PREC)" == "SINGLE"
CC_OPTS = $(CC_OPTS) /DFLOAT8=float /DREAL_IS_FLOAT=1
! ENDIF
CC_OPTS = /nologo /DNDEBUG /YX /GA /Ox /Ob2 \
/Qunroll /Qsox- /Qip $(CC_OPTS)
LN_OPTS = $(CC_OPTS)
LN_DLL = /LD
LN_OUT = /Fe
CC_OUT = /Fo
CC = icl
LN = icl
#_________________________________________________________ Intel 4.5 options __
! ENDIF
#__ LIBSNDFILE ________________________________________________________________
#
# uncomment the following if you want LibSndfile for input
# It's always a good idea to compile it in!
#
! IF "$(SNDFILE)" == "YES"
SNDFILE_OPTS = /DLIBSNDFILE
LIBSNDFILE = $(SNDFILE_DIR)libsndfile.lib
! ENDIF
#________________________________________________________________ LIBSNDFILE __
#-- MISC --
BRHIST_SWITCH = /DBRHIST
CPP_OPTS = /DHAVE_CONFIG_H -I.
#__ FRAME ANALYZER SUPPORT ____________________________________________________
#
# Assuming you have "glib-dev" and "gtk+-dev" installed and the system
# DLLs "glib-1.3.dll", "gdk-1.3.dll" and "gtk-1.3.dll" copied into the
# "Win\System" folder
#
# To compile in the frame analyzer support, you need the above mentioned
# libraries. You can pass the appropriate path to them in GTK_DIRS.
#
! IF "$(GTK)" == "YES"
! IF "$(GTK_DIRS)" == ""
GTK_DIRS = ../3rdparty
! ENDIF
GTK_OPTS = -I$(GTK_DIRS)/glib \
-I$(GTK_DIRS)/gtk+ \
-I$(GTK_DIRS)/gtk+/gtk \
-I$(GTK_DIRS)/gtk+/gdk
GTK_LIBS = $(GTK_DIRS)/gtk+/gtk/gtk-1.3.lib \
$(GTK_DIRS)/gtk+/gdk/gdk-1.3.lib \
$(GTK_DIRS)/glib/glib-1.3.lib
PGM = $(T_MP3X) $(PGM)
! ELSE
! IF "$(GTK)" == ""
! MESSAGE Pass GTK=YES to build the frame analyzer. (requires installed GTK)
! ENDIF
! ENDIF
#____________________________________________________ FRAME ANALYZER SUPPORT __
#__ MPG123 DECODING ___________________________________________________________
#
# uncomment the following if you want decoding support
# It's always a good idea to compile it in!
#
CPP_OPTS = $(CPP_OPTS) /DHAVE_MPGLIB /DUSE_LAYER_1 /DUSE_LAYER_2
#___________________________________________________________ MPG123 DECODING __
#__ Takehiro's IEEE hack ______________________________________________________
#
# uncomment the following to enable Takehiro's IEEE hack
# You'll want it on a x86 machine with i387 FPU
#
CPP_OPTS = $(CPP_OPTS) /DTAKEHIRO_IEEE754_HACK
#______________________________________________________ Takehiro's IEEE hack __
#__ Robert's alternate code ___________________________________________________
! IF "$(CFG)" == "RH"
! IF "$(MSVCVER)" == "8.0"
LIB_OPTS = $(LIB_OPTS) /LTCG
LN_OPTS = $(LN_OPTS) /LTCG
! ENDIF
! ENDIF
#___________________________________________________ Robert's alternate code __
CC_SWITCHES = $(CC_OPTS) $(SNDFILE_OPTS) $(BRHIST_SWITCH) \
$(GTK_OPTS) /DBS_FORMAT=BINARY
LN_SWITCHES = $(LN_OPTS)
lame_sources = \
frontend/main.c
mpx_sources = \
frontend/gpkplotting.c \
frontend/gtkanal.c \
frontend/mp3x.c
dll_sources = \
dll/BladeMP3EncDll.c
common_sources = \
frontend/portableio.c \
frontend/get_audio.c \
frontend/parse.c \
frontend/timestatus.c \
frontend/lametime.c \
frontend/console.c \
frontend/brhist.c
lamelib_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/vector/xmm_quantize_sub.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/presets.c \
libmp3lame/version.c
mpglib_sources = \
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
!IF "$(MSVCVER)" == "Win64"
ADDL_OBJ = bufferoverflowU.lib
!ENDIF
LIB_OBJ = $(lamelib_sources:.c=.obj)
MPG_OBJ = $(mpglib_sources:.c=.obj)
CMMN_OBJ = $(common_sources:.c=.obj)
LAME_OBJ = $(lame_sources:.c=.obj)
MPX_OBJ = $(mpx_sources:.c=.obj)
DLL_OBJ = $(dll_sources:.c=.obj)
.c.obj:
@$(CC) $(CPP_OPTS) $(CC_SWITCHES) -Iinclude -Ilibmp3lame -Impglib \
$(CC_OUT)$@ -c $<
#__ MASM ______________________________________________________________________
#
# MASM: Microsoft Assembler
#
! IF "$(ASM)" == "ML64"
#
.SUFFIXES : .nas
.nas.obj:
@echo $<
@ml64 -Ilibmp3lame\i386 -Sf -DWIN32 -DWIN64 $< -Fo$@
CC_SWITCHES = $(CC_SWITCHES) -DHAVE_NASM
ASM_OBJ = $(ASM_OBJ) \
libmp3lame\i386\cpu_feat.obj \
libmp3lame\i386\fft3dn.obj \
libmp3lame\i386\fftsse.obj
# not yet coded
#CC_SWITCHES = $(CC_SWITCHES) -DUSE_FFTFPU
#ASM_OBJ = $(ASM_OBJ) libmp3lame\i386\fftfpu.obj
#______________________________________________________________________ MASM __
#__ NASM ______________________________________________________________________
#
# NASM: Netwide Assembler
#
! ELSEIF "$(ASM)" == "YES"
#
.SUFFIXES : .nas
.nas.obj:
@echo $<
@nasmw -f $(OFF) -i libmp3lame/i386/ -DWIN32 $< -o $@
CC_SWITCHES = $(CC_SWITCHES) /DHAVE_NASM
ASM_OBJ = $(ASM_OBJ) \
libmp3lame\i386\cpu_feat.obj \
libmp3lame\i386\fft3dn.obj \
libmp3lame\i386\fftsse.obj
# not yet coded
#CC_SWITCHES = $(CC_SWITCHES) /DUSE_FFTFPU
#ASM_OBJ = $(ASM_OBJ) libmp3lame/i386/fftfpu.obj
#______________________________________________________________________ NASM __
! ELSE
! MESSAGE Pass ASM=YES to build the assembler optimizations
! ENDIF
#__ MMX _______________________________________________________________________
#
# you need NASM but *not necessarily* a processor with MMX
# The above CPU feature detection code allows to run the same
# binary on a CPU without MMX too!
#
! IF "$(ASM)" == "YES"
! IF "$(MMX)" == "YES"
CC_SWITCHES = $(CC_SWITCHES) /DMMX_choose_table
ASM_OBJ = $(ASM_OBJ) libmp3lame/i386/choose_table.obj
! ENDIF
! ENDIF
#_______________________________________________________________________ MMX __
! MESSAGE
no_target_specified : $(PGM)
@echo.
@echo --=* $(PGM) uptodate *=--
@echo.
target_directory :
@if not exist $(TARGET_DIR) mkdir $(TARGET_DIR)
common: $(CMMN_OBJ)
@echo.
@echo --- COMMON FRONTEND STUFF UPTODATE ---
@echo.
libA: $(LIB_OBJ)
@echo.
@echo --- LAME MP3 ENCODING LIBRARY UPTODATE ---
@echo.
libB: $(MPG_OBJ)
@echo.
@echo --- MPG123 DECODING LIBRARY UPTODATE ---
@echo.
lib: $(ASM_OBJ) libA libB
$(T_LAME) : target_directory config.h $(T_LIB_STATIC) common $(LAME_OBJ)
@$(LN) $(LN_OUT)$(TARGET_DIR)$@ $(LN_SWITCHES) $(LIBSNDFILE) \
$(TARGET_DIR)$(T_LIB_STATIC) $(CMMN_OBJ) $(LAME_OBJ) $(ADDL_OBJ)
@echo.
@echo --=* $(TARGET_DIR)$@ ready *=--
@echo.
$(T_MP3X) : target_directory config.h lib common $(MPX_OBJ)
@$(LN) $(LN_OUT)$(TARGET_DIR)$@ $(LN_SWITCHES) $(GTK_LIBS) $(LIBSNDFILE) \
$(TARGET_DIR)$(T_LIB_STATIC) $(CMMN_OBJ) $(MPX_OBJ) $(ADDL_OBJ)
@echo.
@echo --=* $(TARGET_DIR)$@ ready *=--
@echo.
$(T_LEGACY_DLL) : target_directory config.h $(DLL_OBJ)
@$(LN) $(LN_OUT)$(TARGET_DIR)$@ $(LN_SWITCHES) \
$(TARGET_DIR)$(T_LIB_STATIC) $(LN_DLL) \
$(DLL_OBJ) $(ADDL_OBJ)
@echo.
@echo --=* $(TARGET_DIR)$@ ready *=--
@echo.
$(T_DLL) : target_directory config.h $(T_LIB_STATIC)
@$(LN) $(LN_DLL) $(MACHINE) \
/DEF:"include\lame.def" \
$(ADDL_OBJ) \
$(LN_OUT)"$(TARGET_DIR)$@" \
$(TARGET_DIR)$(T_LIB_STATIC) libmp3lame\version.obj
@echo.
@echo --=* $(TARGET_DIR)$@ ready *=--
@echo.
$(T_LIB_STATIC) : target_directory lib
@lib $(LIB_OPTS) \
/OUT:"$(TARGET_DIR)$@" \
$(ASM_OBJ) $(LIB_OBJ) $(MPG_OBJ)
@echo.
@echo --=* $(TARGET_DIR)$@ ready *=--
@echo.
config.h : configMS.h
@-copy configMS.h config.h
clean:
@-del $(TARGET_DIR)$(T_LAME)
@-del $(TARGET_DIR)$(T_MP3X)
@-del $(TARGET_DIR)$(T_DLL)
@-del $(TARGET_DIR)$(T_LIB_STATIC)
@-del $(TARGET_DIR)$(T_LIB_DYNAMIC)
@-del $(TARGET_DIR)$(T_LEGACY_DLL)
@-del lame.pdb
@-del icl.pch
@-del $(TARGET_DIR)lame_enc.*
@-del frontend\*.obj
@-del dll\*.obj
@-del mpglib\*.obj
@-del libmp3lame\*.obj
@-del libmp3lame\i386\*.obj
@-del libmp3lame\vector\*.obj
rebuild: clean all
lame : $(T_LAME)
lame_enc: $(T_LEGACY_DLL)
dll : $(T_DLL) $(T_LEGACY_DLL)
mp3x : $(T_MP3X)
all : $(PGM) dll lame_enc
@echo.
@echo --=* all uptodate *=--
@echo.