| # |
| # Stem for static libs and DLLs |
| # |
| LIB_NAME = libwebp_a |
| LIB_NAME_DEBUG = libwebp_a_debug |
| |
| # |
| # Stem for DLL import libs |
| # |
| IMPLIB_NAME = libwebp_dll |
| IMPLIB_NAME_DEBUG = libwebp_dll_debug |
| |
| !IFNDEF DEP_PATH |
| DEPS_PATH = ../../deps |
| !ENDIF |
| |
| !IFNDEF ARCH |
| !IF ! [ cl 2>&1 | find "x86" > NUL ] |
| ARCH = x86 |
| !ELSE IF ! [ cl 2>&1 | find "x64" > NUL ] |
| ARCH = x64 |
| !ELSE |
| !ERROR Unable to auto-detect toolchain architecture! \ |
| If cl.exe is in your PATH rerun nmake with ARCH=<arch>. |
| !ENDIF |
| !ENDIF |
| |
| !IF "$(ARCH)" == "x86" |
| PLATFORM_LDFLAGS = /SAFESEH |
| !ENDIF |
| |
| ############################################################# |
| ## Nothing more to do below this line! |
| |
| MT = mt.exe |
| CCNODBG = cl.exe /nologo /O2 /DNDEBUG |
| CCDEBUG = cl.exe /nologo /Od /Gm /Zi /D_DEBUG /RTC1 |
| CFLAGS = /Isrc /nologo /W3 /EHsc /FD /c /GS |
| CFLAGS = $(CFLAGS) /DWIN32 /D_CRT_SECURE_NO_WARNINGS /DWIN32_LEAN_AND_MEAN |
| CFLAGS = $(CFLAGS) /DHAVE_WINCODEC_H /DWEBP_USE_THREAD /DNOT_HAVE_LOG2 |
| LDFLAGS = /LARGEADDRESSAWARE /MANIFEST /NXCOMPAT /DYNAMICBASE |
| LDFLAGS = $(LDFLAGS) $(PLATFORM_LDFLAGS) |
| LNKDLL = link.exe /DLL |
| LNKLIB = link.exe /lib |
| LNKEXE = link.exe |
| LFLAGS = /nologo /machine:$(ARCH) |
| |
| CFGSET = FALSE |
| !IF "$(OBJDIR)" == "" |
| OUTDIR = ..\obj\ |
| !ELSE |
| OUTDIR = $(OBJDIR) |
| !ENDIF |
| |
| ############################################################## |
| # Runtime library configuration |
| !IF "$(RTLIBCFG)" == "static" |
| RTLIB = /MT |
| RTLIBD = /MTd |
| !ELSE |
| RTLIB = /MD |
| RTLIBD = /MDd |
| !ENDIF |
| DIRBASE = $(OUTDIR)\$(CFG)\$(ARCH) |
| DIROBJ = $(DIRBASE)\obj |
| DIRLIB = $(DIRBASE)\lib |
| DIRINC = $(DIRBASE)\include |
| DIRBIN = $(DIRBASE)\bin |
| LIBPDBNAME = $(DIROBJ)\$(TARGET).pdb |
| OUTPUT_DIRS = $(DIRBIN) $(DIRINC) $(DIRLIB) \ |
| $(DIROBJ)\dec \ |
| $(DIROBJ)\dsp \ |
| $(DIROBJ)\enc \ |
| $(DIROBJ)\examples \ |
| $(DIROBJ)\mux \ |
| $(DIROBJ)\utils \ |
| |
| # Target configuration |
| !IF "$(CFG)" == "release-static" |
| TARGET = $(LIB_NAME).lib |
| CC = $(CCNODBG) |
| STATICLIBBUILD = TRUE |
| !ELSE IF "$(CFG)" == "debug-static" |
| TARGET = $(LIB_NAME_DEBUG).lib |
| CC = $(CCDEBUG) |
| RTLIB = $(RTLIBD) |
| STATICLIBBUILD = TRUE |
| !ELSE IF "$(CFG)" == "release-dynamic" |
| TARGETDLL = $(LIB_NAME).dll |
| TARGET = $(IMPLIB_NAME).lib |
| CC = $(CCNODBG) |
| DLLBUILD = TRUE |
| !ELSE IF "$(CFG)" == "debug-dynamic" |
| TARGETDLL = $(LIB_NAME_DEBUG).dll |
| TARGET = $(IMPLIB_NAME_DEBUG).lib |
| CC = $(CCDEBUG) |
| RTLIB = $(RTLIBD) |
| DLLBUILD = TRUE |
| !ENDIF |
| |
| !IF "$(STATICLIBBUILD)" == "TRUE" |
| CC = $(CC) $(RTLIB) |
| LNK = $(LNKLIB) /out:$(DIRLIB)\$(TARGET) |
| CFGSET = TRUE |
| !ELSE IF "$(DLLBUILD)" == "TRUE" |
| DLLC = webp_dll.c |
| DLLINC = webp_dll.h |
| CC = $(CC) /I$(DIROBJ) /FI$(DLLINC) $(RTLIB) /DWEBP_DLL |
| LNK = $(LNKDLL) /out:$(DIRBIN)\$(TARGETDLL) /implib:$(DIRLIB)\$(TARGET) |
| X_OBJS = $(DIROBJ)\$(DLLC:.c=.obj) |
| LIBPDBNAME = $(DIROBJ)\$(TARGETDLL).pdb |
| CFGSET = TRUE |
| !ENDIF |
| |
| ####################### |
| # Usage |
| # |
| !IF "$(CFGSET)" == "FALSE" |
| !MESSAGE Usage: nmake /f Makefile.vc [CFG=<config>] |
| !MESSAGE . [OBJDIR=<path>] [RTLIBCFG=<rtlib>] [<target>] |
| !MESSAGE |
| !MESSAGE where <config> is one of: |
| !MESSAGE - release-static - release static library |
| !MESSAGE - debug-static - debug static library |
| !MESSAGE - release-dynamic - release dynamic link library (DLL) |
| !MESSAGE - debug-dynamic - debug dynamic link library (DLL) |
| !MESSAGE |
| !MESSAGE <target> may be: |
| !MESSAGE - clean - perform a clean for CFG |
| !MESSAGE - experimental - build CFG with experimental |
| !MESSAGE . features enabled. Requires zlib. |
| !MESSAGE - (empty) or all - build all targets for CFG |
| !MESSAGE |
| !MESSAGE RTLIBCFG controls the runtime library linkage - 'static' or 'dynamic'. |
| !MESSAGE OBJDIR is the path where you like to build (obj, bins, etc.), |
| !MESSAGE defaults to ..\obj |
| |
| !IF "$(CFG)" != "" |
| !MESSAGE |
| !ERROR please choose a valid configuration instead of "$(CFG)" |
| !ENDIF |
| !ENDIF |
| |
| ####################### |
| # Rules |
| # |
| !IF "$(CFGSET)" == "TRUE" |
| # A config was provided, so the library can be built. |
| # |
| |
| X_OBJS= \ |
| $(DIROBJ)\dec\alpha.obj \ |
| $(DIROBJ)\dec\buffer.obj \ |
| $(DIROBJ)\dec\frame.obj \ |
| $(DIROBJ)\dec\idec.obj \ |
| $(DIROBJ)\dec\io.obj \ |
| $(DIROBJ)\dec\layer.obj \ |
| $(DIROBJ)\dec\quant.obj \ |
| $(DIROBJ)\dec\tree.obj \ |
| $(DIROBJ)\dec\vp8.obj \ |
| $(DIROBJ)\dec\vp8l.obj \ |
| $(DIROBJ)\dec\webp.obj \ |
| $(DIROBJ)\dsp\cpu.obj \ |
| $(DIROBJ)\dsp\dec.obj \ |
| $(DIROBJ)\dsp\dec_sse2.obj \ |
| $(DIROBJ)\dsp\enc.obj \ |
| $(DIROBJ)\dsp\enc_sse2.obj \ |
| $(DIROBJ)\dsp\lossless.obj \ |
| $(DIROBJ)\dsp\upsampling.obj \ |
| $(DIROBJ)\dsp\upsampling_sse2.obj \ |
| $(DIROBJ)\dsp\yuv.obj \ |
| $(DIROBJ)\enc\alpha.obj \ |
| $(DIROBJ)\enc\analysis.obj \ |
| $(DIROBJ)\enc\config.obj \ |
| $(DIROBJ)\enc\cost.obj \ |
| $(DIROBJ)\enc\filter.obj \ |
| $(DIROBJ)\enc\frame.obj \ |
| $(DIROBJ)\enc\iterator.obj \ |
| $(DIROBJ)\enc\layer.obj \ |
| $(DIROBJ)\enc\picture.obj \ |
| $(DIROBJ)\enc\quant.obj \ |
| $(DIROBJ)\enc\syntax.obj \ |
| $(DIROBJ)\enc\tree.obj \ |
| $(DIROBJ)\enc\webpenc.obj \ |
| $(DIROBJ)\mux\muxedit.obj \ |
| $(DIROBJ)\mux\muxinternal.obj \ |
| $(DIROBJ)\mux\muxread.obj \ |
| $(DIROBJ)\utils\alpha.obj \ |
| $(DIROBJ)\utils\bit_reader.obj \ |
| $(DIROBJ)\utils\bit_writer.obj \ |
| $(DIROBJ)\utils\color_cache.obj \ |
| $(DIROBJ)\utils\filters.obj \ |
| $(DIROBJ)\utils\huffman.obj \ |
| $(DIROBJ)\utils\quant_levels.obj \ |
| $(DIROBJ)\utils\rescaler.obj \ |
| $(DIROBJ)\utils\tcoder.obj \ |
| $(DIROBJ)\utils\thread.obj \ |
| $(X_OBJS) \ |
| |
| EXAMPLES_OBJS = \ |
| $(DIROBJ)\examples\cwebp.obj \ |
| $(DIROBJ)\examples\dwebp.obj \ |
| $(DIROBJ)\examples\webpmux.obj |
| |
| all: $(DIRLIB)\$(TARGET) $(DIRBIN)\dwebp.exe $(DIRBIN)\cwebp.exe \ |
| $(DIRBIN)\webpmux.exe |
| |
| # Additional include and library paths (for zlib) can be passed via the CL and |
| # LINK environment variables respectively: |
| # > set CL=/I\zlib\include |
| # > set LINK=\zlib\zlib.lib |
| # > nmake /f Makefile.vc CFG=release-static experimental |
| experimental: |
| $(MAKE) /f Makefile.vc \ |
| CFG=$(CFG) \ |
| CFLAGS="$(CFLAGS) /DWEBP_EXPERIMENTAL_FEATURES" /$(MAKEFLAGS) |
| |
| $(DIRLIB)\$(TARGET): $(X_OBJS) |
| $(LNK) $(LFLAGS) $(X_OBJS) |
| -xcopy $(DIROBJ)\*.pdb $(DIRLIB) /y |
| |
| $(X_OBJS): $(OUTPUT_DIRS) |
| |
| !IF "$(DLLBUILD)" == "TRUE" |
| $(X_OBJS): $(DIROBJ)\$(DLLINC) $(DIROBJ)\$(DLLC) |
| |
| {$(DIROBJ)}.c{$(DIROBJ)}.obj: |
| $(CC) $(CFLAGS) /Fd$(LIBPDBNAME) /Fo"$@" $< |
| clean:: |
| @-erase /s $(DIROBJ)\$(DLLC) $(DIROBJ)\$(DLLINC) 2> NUL |
| !ENDIF |
| |
| $(EXAMPLES_OBJS): $(DIRLIB)\$(TARGET) |
| |
| $(OUTPUT_DIRS): |
| @if not exist "$(@)" mkdir "$(@)" |
| |
| # generate a helper include to define WEBP_EXTERN suitable for the DLL build |
| $(DIROBJ)\$(DLLINC): |
| @echo #ifndef WEBP_DLL_H_ > $@ |
| @echo #define WEBP_DLL_H_ >> $@ |
| @echo #define WEBP_EXTERN(type) __declspec(dllexport) type >> $@ |
| @echo #endif /* WEBP_DLL_H_ */ >> $@ |
| |
| # expose a WebPFree() function for use in managed code |
| $(DIROBJ)\$(DLLC): $(DIROBJ)\$(DLLINC) |
| @echo #include ^<stdlib.h^> > $@ |
| @echo #include "webp_dll.h" >> $@ |
| @echo // This function should be used in place of free() for memory >> $@ |
| @echo // returned by the WebP API. >> $@ |
| @echo WEBP_EXTERN(void) WebPFree(void* ptr) { >> $@ |
| @echo free(ptr); >> $@ |
| @echo } >> $@ |
| |
| .SUFFIXES: .c .obj .res .exe |
| {examples}.c{$(DIROBJ)\examples}.obj:: |
| $(CC) $(CFLAGS) /Fd$(DIROBJ)\examples\ /Fo$(DIROBJ)\examples\ $< |
| {src\dec}.c{$(DIROBJ)\dec}.obj:: |
| $(CC) $(CFLAGS) /Fd$(LIBPDBNAME) /Fo$(DIROBJ)\dec\ $< |
| {src\dsp}.c{$(DIROBJ)\dsp}.obj:: |
| $(CC) $(CFLAGS) /Fd$(LIBPDBNAME) /Fo$(DIROBJ)\dsp\ $< |
| {src\enc}.c{$(DIROBJ)\enc}.obj:: |
| $(CC) $(CFLAGS) /Fd$(LIBPDBNAME) /Fo$(DIROBJ)\enc\ $< |
| {src\mux}.c{$(DIROBJ)\mux}.obj:: |
| $(CC) $(CFLAGS) /Fd$(LIBPDBNAME) /Fo$(DIROBJ)\mux\ $< |
| {src\utils}.c{$(DIROBJ)\utils}.obj:: |
| $(CC) $(CFLAGS) /Fd$(LIBPDBNAME) /Fo$(DIROBJ)\utils\ $< |
| |
| {$(DIROBJ)\examples}.obj{$(DIRBIN)}.exe: |
| $(LNKEXE) $(LDFLAGS) /OUT:"$@" $< \ |
| ole32.lib windowscodecs.lib shlwapi.lib $(DIRLIB)\$(TARGET) |
| $(MT) -manifest $@.manifest -outputresource:$@;1 |
| del $@.manifest |
| |
| clean:: |
| @-erase /s $(DIROBJ)\*.dll 2> NUL |
| @-erase /s $(DIROBJ)\*.exp 2> NUL |
| @-erase /s $(DIROBJ)\*.idb 2> NUL |
| @-erase /s $(DIROBJ)\*.lib 2> NUL |
| @-erase /s $(DIROBJ)\*.obj 2> NUL |
| @-erase /s $(DIROBJ)\*.pch 2> NUL |
| @-erase /s $(DIROBJ)\*.pdb 2> NUL |
| @-erase /s $(DIROBJ)\*.res 2> NUL |
| |
| !ENDIF # End of case where a config was provided. |