go-libwebp

Experimental translation from libwebp to Go source.
Log | Files | Refs | README | LICENSE

Makefile.vc (18990B)


      1 #
      2 # Stem for static libs and DLLs
      3 #
      4 LIBWEBPDECODER_BASENAME = libwebpdecoder
      5 LIBWEBP_BASENAME = libwebp
      6 LIBWEBPMUX_BASENAME = libwebpmux
      7 LIBWEBPDEMUX_BASENAME = libwebpdemux
      8 LIBSHARPYUV_BASENAME = libsharpyuv
      9 
     10 !IFNDEF ARCH
     11 !IF ! [ cl 2>&1 | find "x86" > NUL ]
     12 ARCH = x86
     13 !ELSE IF ! [ cl 2>&1 | find "x64" > NUL ]
     14 ARCH = x64
     15 !ELSE IF ! [ cl 2>&1 | find "ARM64" > NUL ]
     16 ARCH = ARM64
     17 !ELSE IF ! [ cl 2>&1 | find "ARM" > NUL ]
     18 ARCH = ARM
     19 !ELSE
     20 !ERROR Unable to auto-detect toolchain architecture! \
     21 If cl.exe is in your PATH rerun nmake with ARCH=<arch>.
     22 !ENDIF
     23 !ENDIF
     24 
     25 !IF "$(ARCH)" == "x86"
     26 PLATFORM_LDFLAGS = /SAFESEH
     27 !ENDIF
     28 
     29 #############################################################
     30 ## Nothing more to do below this line!
     31 
     32 NOLOGO     = /nologo
     33 CCNODBG    = cl.exe $(NOLOGO) /O2 /DNDEBUG
     34 CCDEBUG    = cl.exe $(NOLOGO) /Od /Zi /D_DEBUG /RTC1
     35 CFLAGS     = /I. /Isrc $(NOLOGO) /MP /W3 /EHsc /c
     36 CFLAGS     = $(CFLAGS) /DWIN32 /D_CRT_SECURE_NO_WARNINGS /DWIN32_LEAN_AND_MEAN
     37 LDFLAGS    = /LARGEADDRESSAWARE /MANIFEST:EMBED /NXCOMPAT /DYNAMICBASE
     38 LDFLAGS    = $(LDFLAGS) $(PLATFORM_LDFLAGS)
     39 LNKDLL     = link.exe /DLL $(NOLOGO)
     40 LNKEXE     = link.exe $(NOLOGO)
     41 LNKLIB     = lib.exe $(NOLOGO)
     42 RCNODBG    = rc.exe $(NOLOGO) /l"0x0409"  # 0x409 = U.S. English
     43 RCDEBUG    = $(RCNODBG) /D_DEBUG
     44 
     45 !IF "$(ARCH)" == "ARM"
     46 CFLAGS = $(CFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP /DWEBP_USE_THREAD
     47 !ELSE
     48 CFLAGS = $(CFLAGS) /DHAVE_WINCODEC_H /DWEBP_USE_THREAD
     49 !ENDIF
     50 
     51 CFGSET     = FALSE
     52 !IF "$(OBJDIR)" == ""
     53 OUTDIR = ..\obj\
     54 !ELSE
     55 OUTDIR = $(OBJDIR)
     56 !ENDIF
     57 
     58 ##############################################################
     59 # Runtime library configuration
     60 !IF "$(RTLIBCFG)" == "static"
     61 RTLIB  = /MT
     62 RTLIBD = /MTd
     63 !ELSE IF "$(RTLIBCFG)" == "legacy"
     64 RTLIBCFG = static
     65 RTLIB  = /MT
     66 RTLIBD = /MTd
     67 CFLAGS = $(CFLAGS) /GS- /arch:IA32
     68 !ELSE
     69 RTLIB   = /MD
     70 RTLIBD  = /MDd
     71 !ENDIF
     72 DIRBASE = $(OUTDIR)\$(CFG)\$(ARCH)
     73 DIROBJ = $(DIRBASE)\obj
     74 DIRLIB = $(DIRBASE)\lib
     75 DIRINC = $(DIRBASE)\include
     76 DIRBIN = $(DIRBASE)\bin
     77 LIBWEBP_PDBNAME = $(DIROBJ)\$(LIBWEBP_BASENAME).pdb
     78 OUTPUT_DIRS = $(DIRBIN) $(DIRINC) $(DIRLIB) \
     79               $(DIROBJ)\dec \
     80               $(DIROBJ)\demux \
     81               $(DIROBJ)\dsp \
     82               $(DIROBJ)\enc \
     83               $(DIROBJ)\examples \
     84               $(DIROBJ)\extras \
     85               $(DIROBJ)\imageio \
     86               $(DIROBJ)\mux \
     87               $(DIROBJ)\sharpyuv \
     88               $(DIROBJ)\utils \
     89 
     90 # Target configuration
     91 !IF "$(CFG)" == "release-static"
     92 CC             = $(CCNODBG)
     93 STATICLIBBUILD = TRUE
     94 !ELSE IF "$(CFG)" == "debug-static"
     95 CC             = $(CCDEBUG)
     96 RTLIB          = $(RTLIBD)
     97 STATICLIBBUILD = TRUE
     98 LIBWEBPDECODER_BASENAME = $(LIBWEBPDECODER_BASENAME)_debug
     99 LIBWEBP_BASENAME = $(LIBWEBP_BASENAME)_debug
    100 LIBWEBPMUX_BASENAME = $(LIBWEBPMUX_BASENAME)_debug
    101 LIBWEBPDEMUX_BASENAME = $(LIBWEBPDEMUX_BASENAME)_debug
    102 LIBSHARPYUV_BASENAME = $(LIBSHARPYUV_BASENAME)_debug
    103 !ELSE IF "$(CFG)" == "release-dynamic"
    104 CC        = $(CCNODBG)
    105 RC        = $(RCNODBG)
    106 DLLBUILD  = TRUE
    107 !ELSE IF "$(CFG)" == "debug-dynamic"
    108 CC        = $(CCDEBUG)
    109 RC        = $(RCDEBUG)
    110 RTLIB     = $(RTLIBD)
    111 DLLBUILD  = TRUE
    112 LIBWEBPDECODER_BASENAME = $(LIBWEBPDECODER_BASENAME)_debug
    113 LIBWEBP_BASENAME = $(LIBWEBP_BASENAME)_debug
    114 LIBWEBPMUX_BASENAME = $(LIBWEBPMUX_BASENAME)_debug
    115 LIBWEBPDEMUX_BASENAME = $(LIBWEBPDEMUX_BASENAME)_debug
    116 LIBSHARPYUV_BASENAME = $(LIBSHARPYUV_BASENAME)_debug
    117 !ENDIF
    118 
    119 !IF "$(STATICLIBBUILD)" == "TRUE"
    120 CC     = $(CC) $(RTLIB)
    121 CFGSET = TRUE
    122 LIBWEBPDECODER = $(DIRLIB)\$(LIBWEBPDECODER_BASENAME).lib
    123 LIBWEBP = $(DIRLIB)\$(LIBWEBP_BASENAME).lib
    124 LIBWEBPMUX = $(DIRLIB)\$(LIBWEBPMUX_BASENAME).lib
    125 LIBWEBPDEMUX = $(DIRLIB)\$(LIBWEBPDEMUX_BASENAME).lib
    126 LIBSHARPYUV = $(DIRLIB)\$(LIBSHARPYUV_BASENAME).lib
    127 !ELSE IF "$(DLLBUILD)" == "TRUE"
    128 CC     = $(CC) /I$(DIROBJ) $(RTLIB) /DWEBP_DLL
    129 LIBWEBPDECODER = $(DIRLIB)\$(LIBWEBPDECODER_BASENAME)_dll.lib
    130 LIBWEBP = $(DIRLIB)\$(LIBWEBP_BASENAME)_dll.lib
    131 LIBWEBPMUX = $(DIRLIB)\$(LIBWEBPMUX_BASENAME)_dll.lib
    132 LIBWEBPDEMUX = $(DIRLIB)\$(LIBWEBPDEMUX_BASENAME)_dll.lib
    133 LIBSHARPYUV = $(DIRLIB)\$(LIBSHARPYUV_BASENAME)_dll.lib
    134 LIBWEBP_PDBNAME = $(DIROBJ)\$(LIBWEBP_BASENAME)_dll.pdb
    135 CFGSET = TRUE
    136 !ENDIF
    137 
    138 !IF "$(UNICODE)" == "1"
    139 CFLAGS = $(CFLAGS) /D_UNICODE /DUNICODE
    140 !ENDIF
    141 
    142 #######################
    143 # Usage
    144 #
    145 !IF "$(CFGSET)" == "FALSE"
    146 !MESSAGE Usage: nmake /f Makefile.vc [CFG=<config>]
    147 !MESSAGE .          [OBJDIR=<path>] [RTLIBCFG=<rtlib>] [UNICODE=1] [<target>]
    148 !MESSAGE
    149 !MESSAGE where <config> is one of:
    150 !MESSAGE -  release-static                - release static library
    151 !MESSAGE -  debug-static                  - debug static library
    152 !MESSAGE -  release-dynamic               - release dynamic link library (DLL)
    153 !MESSAGE -  debug-dynamic                 - debug dynamic link library (DLL)
    154 !MESSAGE
    155 !MESSAGE <target> may be:
    156 !MESSAGE -  clean                         - perform a clean for CFG
    157 !MESSAGE -  experimental                  - build CFG with experimental
    158 !MESSAGE .                                  features enabled.
    159 !MESSAGE - (empty)                        - build libwebp-based targets for CFG
    160 !MESSAGE - all                            - build (de)mux-based targets for CFG
    161 !MESSAGE - gif2webp                       - requires libgif & >= VS2013
    162 !MESSAGE - anim_diff                      - requires libgif & >= VS2013
    163 !MESSAGE - anim_dump
    164 !MESSAGE
    165 !MESSAGE RTLIBCFG controls the runtime library linkage - 'static' or 'dynamic'.
    166 !MESSAGE   'legacy' will produce a Windows 2000 compatible library.
    167 !MESSAGE OBJDIR is the path where you like to build (obj, bins, etc.),
    168 !MESSAGE   defaults to ..\obj
    169 
    170 !IF "$(CFG)" != ""
    171 !MESSAGE
    172 !ERROR please choose a valid configuration instead of "$(CFG)"
    173 !ENDIF
    174 !ENDIF
    175 
    176 #######################
    177 # Rules
    178 #
    179 !IF "$(CFGSET)" == "TRUE"
    180 # A config was provided, so the library can be built.
    181 #
    182 
    183 SHARPYUV_OBJS = \
    184     $(DIROBJ)\sharpyuv\sharpyuv.obj \
    185     $(DIROBJ)\sharpyuv\sharpyuv_cpu.obj \
    186     $(DIROBJ)\sharpyuv\sharpyuv_csp.obj \
    187     $(DIROBJ)\sharpyuv\sharpyuv_dsp.obj \
    188     $(DIROBJ)\sharpyuv\sharpyuv_gamma.obj \
    189     $(DIROBJ)\sharpyuv\sharpyuv_neon.obj \
    190     $(DIROBJ)\sharpyuv\sharpyuv_sse2.obj \
    191 
    192 DEC_OBJS = \
    193     $(DIROBJ)\dec\alpha_dec.obj \
    194     $(DIROBJ)\dec\buffer_dec.obj \
    195     $(DIROBJ)\dec\frame_dec.obj \
    196     $(DIROBJ)\dec\idec_dec.obj \
    197     $(DIROBJ)\dec\io_dec.obj \
    198     $(DIROBJ)\dec\quant_dec.obj \
    199     $(DIROBJ)\dec\tree_dec.obj \
    200     $(DIROBJ)\dec\vp8_dec.obj \
    201     $(DIROBJ)\dec\vp8l_dec.obj \
    202     $(DIROBJ)\dec\webp_dec.obj \
    203 
    204 DEMUX_OBJS = \
    205     $(DIROBJ)\demux\anim_decode.obj \
    206     $(DIROBJ)\demux\demux.obj \
    207 
    208 DSP_DEC_OBJS = \
    209     $(DIROBJ)\dsp\alpha_processing.obj \
    210     $(DIROBJ)\dsp\alpha_processing_mips_dsp_r2.obj \
    211     $(DIROBJ)\dsp\alpha_processing_neon.obj \
    212     $(DIROBJ)\dsp\alpha_processing_sse2.obj \
    213     $(DIROBJ)\dsp\alpha_processing_sse41.obj \
    214     $(DIROBJ)\dsp\cpu.obj \
    215     $(DIROBJ)\dsp\dec.obj \
    216     $(DIROBJ)\dsp\dec_clip_tables.obj \
    217     $(DIROBJ)\dsp\dec_mips32.obj \
    218     $(DIROBJ)\dsp\dec_mips_dsp_r2.obj \
    219     $(DIROBJ)\dsp\dec_msa.obj \
    220     $(DIROBJ)\dsp\dec_neon.obj \
    221     $(DIROBJ)\dsp\dec_sse2.obj \
    222     $(DIROBJ)\dsp\dec_sse41.obj \
    223     $(DIROBJ)\dsp\filters.obj \
    224     $(DIROBJ)\dsp\filters_mips_dsp_r2.obj \
    225     $(DIROBJ)\dsp\filters_msa.obj \
    226     $(DIROBJ)\dsp\filters_neon.obj \
    227     $(DIROBJ)\dsp\filters_sse2.obj \
    228     $(DIROBJ)\dsp\lossless.obj \
    229     $(DIROBJ)\dsp\lossless_mips_dsp_r2.obj \
    230     $(DIROBJ)\dsp\lossless_msa.obj \
    231     $(DIROBJ)\dsp\lossless_neon.obj \
    232     $(DIROBJ)\dsp\lossless_sse2.obj \
    233     $(DIROBJ)\dsp\lossless_sse41.obj \
    234     $(DIROBJ)\dsp\lossless_avx2.obj \
    235     $(DIROBJ)\dsp\rescaler.obj \
    236     $(DIROBJ)\dsp\rescaler_mips32.obj \
    237     $(DIROBJ)\dsp\rescaler_mips_dsp_r2.obj \
    238     $(DIROBJ)\dsp\rescaler_msa.obj \
    239     $(DIROBJ)\dsp\rescaler_neon.obj \
    240     $(DIROBJ)\dsp\rescaler_sse2.obj \
    241     $(DIROBJ)\dsp\upsampling.obj \
    242     $(DIROBJ)\dsp\upsampling_mips_dsp_r2.obj \
    243     $(DIROBJ)\dsp\upsampling_msa.obj \
    244     $(DIROBJ)\dsp\upsampling_neon.obj \
    245     $(DIROBJ)\dsp\upsampling_sse2.obj \
    246     $(DIROBJ)\dsp\upsampling_sse41.obj \
    247     $(DIROBJ)\dsp\yuv.obj \
    248     $(DIROBJ)\dsp\yuv_mips32.obj \
    249     $(DIROBJ)\dsp\yuv_mips_dsp_r2.obj \
    250     $(DIROBJ)\dsp\yuv_neon.obj \
    251     $(DIROBJ)\dsp\yuv_sse2.obj \
    252     $(DIROBJ)\dsp\yuv_sse41.obj \
    253 
    254 DSP_ENC_OBJS = \
    255     $(DIROBJ)\dsp\cost.obj \
    256     $(DIROBJ)\dsp\cost_mips32.obj \
    257     $(DIROBJ)\dsp\cost_mips_dsp_r2.obj \
    258     $(DIROBJ)\dsp\cost_neon.obj \
    259     $(DIROBJ)\dsp\cost_sse2.obj \
    260     $(DIROBJ)\dsp\enc.obj \
    261     $(DIROBJ)\dsp\enc_mips32.obj \
    262     $(DIROBJ)\dsp\enc_mips_dsp_r2.obj \
    263     $(DIROBJ)\dsp\enc_msa.obj \
    264     $(DIROBJ)\dsp\enc_neon.obj \
    265     $(DIROBJ)\dsp\enc_sse2.obj \
    266     $(DIROBJ)\dsp\enc_sse41.obj \
    267     $(DIROBJ)\dsp\lossless_enc.obj \
    268     $(DIROBJ)\dsp\lossless_enc_mips32.obj \
    269     $(DIROBJ)\dsp\lossless_enc_mips_dsp_r2.obj \
    270     $(DIROBJ)\dsp\lossless_enc_msa.obj \
    271     $(DIROBJ)\dsp\lossless_enc_neon.obj \
    272     $(DIROBJ)\dsp\lossless_enc_sse2.obj \
    273     $(DIROBJ)\dsp\lossless_enc_sse41.obj \
    274     $(DIROBJ)\dsp\lossless_enc_avx2.obj \
    275     $(DIROBJ)\dsp\ssim.obj \
    276     $(DIROBJ)\dsp\ssim_sse2.obj \
    277 
    278 EX_ANIM_UTIL_OBJS = \
    279     $(DIROBJ)\examples\anim_util.obj \
    280 
    281 IMAGEIO_DEC_OBJS = \
    282     $(DIROBJ)\imageio\image_dec.obj \
    283     $(DIROBJ)\imageio\jpegdec.obj \
    284     $(DIROBJ)\imageio\metadata.obj \
    285     $(DIROBJ)\imageio\pngdec.obj \
    286     $(DIROBJ)\imageio\pnmdec.obj \
    287     $(DIROBJ)\imageio\tiffdec.obj \
    288     $(DIROBJ)\imageio\webpdec.obj \
    289     $(DIROBJ)\imageio\wicdec.obj \
    290 
    291 IMAGEIO_ENC_OBJS = \
    292     $(DIROBJ)\imageio\image_enc.obj \
    293 
    294 EX_GIF_DEC_OBJS = \
    295     $(DIROBJ)\examples\gifdec.obj \
    296 
    297 EX_UTIL_OBJS = \
    298     $(DIROBJ)\examples\example_util.obj \
    299 
    300 ENC_OBJS = \
    301     $(DIROBJ)\enc\alpha_enc.obj \
    302     $(DIROBJ)\enc\analysis_enc.obj \
    303     $(DIROBJ)\enc\backward_references_cost_enc.obj \
    304     $(DIROBJ)\enc\backward_references_enc.obj \
    305     $(DIROBJ)\enc\config_enc.obj \
    306     $(DIROBJ)\enc\cost_enc.obj \
    307     $(DIROBJ)\enc\filter_enc.obj \
    308     $(DIROBJ)\enc\frame_enc.obj \
    309     $(DIROBJ)\enc\histogram_enc.obj \
    310     $(DIROBJ)\enc\iterator_enc.obj \
    311     $(DIROBJ)\enc\near_lossless_enc.obj \
    312     $(DIROBJ)\enc\picture_enc.obj \
    313     $(DIROBJ)\enc\picture_csp_enc.obj \
    314     $(DIROBJ)\enc\picture_psnr_enc.obj \
    315     $(DIROBJ)\enc\picture_rescale_enc.obj \
    316     $(DIROBJ)\enc\picture_tools_enc.obj \
    317     $(DIROBJ)\enc\predictor_enc.obj \
    318     $(DIROBJ)\enc\quant_enc.obj \
    319     $(DIROBJ)\enc\syntax_enc.obj \
    320     $(DIROBJ)\enc\token_enc.obj \
    321     $(DIROBJ)\enc\tree_enc.obj \
    322     $(DIROBJ)\enc\vp8l_enc.obj \
    323     $(DIROBJ)\enc\webp_enc.obj \
    324 
    325 EXTRAS_OBJS = \
    326     $(DIROBJ)\extras\extras.obj \
    327     $(DIROBJ)\extras\quality_estimate.obj \
    328     $(DIROBJ)\extras\sharpyuv_risk_table.obj \
    329 
    330 IMAGEIO_UTIL_OBJS = \
    331     $(DIROBJ)\imageio\imageio_util.obj \
    332 
    333 MUX_OBJS = \
    334     $(DIROBJ)\mux\anim_encode.obj \
    335     $(DIROBJ)\mux\muxedit.obj \
    336     $(DIROBJ)\mux\muxinternal.obj \
    337     $(DIROBJ)\mux\muxread.obj \
    338 
    339 UTILS_DEC_OBJS = \
    340     $(DIROBJ)\utils\bit_reader_utils.obj \
    341     $(DIROBJ)\utils\color_cache_utils.obj \
    342     $(DIROBJ)\utils\filters_utils.obj \
    343     $(DIROBJ)\utils\huffman_utils.obj \
    344     $(DIROBJ)\utils\palette.obj \
    345     $(DIROBJ)\utils\quant_levels_dec_utils.obj \
    346     $(DIROBJ)\utils\rescaler_utils.obj \
    347     $(DIROBJ)\utils\random_utils.obj \
    348     $(DIROBJ)\utils\thread_utils.obj \
    349     $(DIROBJ)\utils\utils.obj \
    350 
    351 UTILS_ENC_OBJS = \
    352     $(DIROBJ)\utils\bit_writer_utils.obj \
    353     $(DIROBJ)\utils\huffman_encode_utils.obj \
    354     $(DIROBJ)\utils\quant_levels_utils.obj \
    355 
    356 LIBWEBPDECODER_OBJS = $(DEC_OBJS) $(DSP_DEC_OBJS) $(UTILS_DEC_OBJS)
    357 LIBWEBP_OBJS = $(LIBWEBPDECODER_OBJS) $(ENC_OBJS) \
    358                $(DSP_ENC_OBJS) $(UTILS_ENC_OBJS) $(DLL_OBJS)
    359 LIBWEBPMUX_OBJS = $(MUX_OBJS) $(LIBWEBPMUX_OBJS)
    360 LIBWEBPDEMUX_OBJS = $(DEMUX_OBJS) $(LIBWEBPDEMUX_OBJS)
    361 LIBSHARPYUV_OBJS = $(SHARPYUV_OBJS)
    362 
    363 OUT_LIBS = $(LIBWEBPDECODER) $(LIBWEBP) $(LIBSHARPYUV)
    364 !IF "$(ARCH)" == "ARM"
    365 ex: $(OUT_LIBS)
    366 all: ex
    367 !ELSE
    368 OUT_EXAMPLES = $(DIRBIN)\cwebp.exe $(DIRBIN)\dwebp.exe
    369 EXTRA_EXAMPLES = $(DIRBIN)\vwebp.exe $(DIRBIN)\webpmux.exe \
    370                  $(DIRBIN)\img2webp.exe $(DIRBIN)\get_disto.exe \
    371                  $(DIRBIN)\webp_quality.exe $(DIRBIN)\vwebp_sdl.exe \
    372                  $(DIRBIN)\webpinfo.exe
    373 
    374 ex: $(OUT_LIBS) $(OUT_EXAMPLES)
    375 all: ex $(EXTRA_EXAMPLES)
    376 # NB: gif2webp.exe and anim_diff.exe are excluded from 'all' as libgif requires
    377 # C99 support which is only available from VS2013 onward.
    378 gif2webp: $(DIRBIN)\gif2webp.exe
    379 anim_diff: $(DIRBIN)\anim_diff.exe
    380 anim_dump: $(DIRBIN)\anim_dump.exe
    381 
    382 $(DIRBIN)\anim_diff.exe: $(DIROBJ)\examples\anim_diff.obj $(EX_ANIM_UTIL_OBJS)
    383 $(DIRBIN)\anim_diff.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS)
    384 $(DIRBIN)\anim_diff.exe: $(EX_GIF_DEC_OBJS) $(LIBWEBPDEMUX) $(LIBWEBP)
    385 $(DIRBIN)\anim_dump.exe: $(DIROBJ)\examples\anim_dump.obj $(EX_ANIM_UTIL_OBJS)
    386 $(DIRBIN)\anim_dump.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS)
    387 $(DIRBIN)\anim_dump.exe: $(EX_GIF_DEC_OBJS) $(LIBWEBPDEMUX) $(LIBWEBP)
    388 $(DIRBIN)\anim_dump.exe: $(IMAGEIO_ENC_OBJS)
    389 $(DIRBIN)\cwebp.exe: $(DIROBJ)\examples\cwebp.obj $(IMAGEIO_DEC_OBJS)
    390 $(DIRBIN)\cwebp.exe: $(IMAGEIO_UTIL_OBJS)
    391 $(DIRBIN)\cwebp.exe: $(LIBWEBPDEMUX) $(LIBSHARPYUV)
    392 $(DIRBIN)\dwebp.exe: $(DIROBJ)\examples\dwebp.obj $(IMAGEIO_DEC_OBJS)
    393 $(DIRBIN)\dwebp.exe: $(IMAGEIO_ENC_OBJS)
    394 $(DIRBIN)\dwebp.exe: $(IMAGEIO_UTIL_OBJS)
    395 $(DIRBIN)\dwebp.exe: $(LIBWEBPDEMUX)
    396 $(DIRBIN)\gif2webp.exe: $(DIROBJ)\examples\gif2webp.obj $(EX_GIF_DEC_OBJS)
    397 $(DIRBIN)\gif2webp.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS) $(LIBWEBPMUX)
    398 $(DIRBIN)\gif2webp.exe: $(LIBWEBP) $(LIBSHARPYUV)
    399 $(DIRBIN)\vwebp.exe: $(DIROBJ)\examples\vwebp.obj $(EX_UTIL_OBJS)
    400 $(DIRBIN)\vwebp.exe: $(IMAGEIO_UTIL_OBJS) $(LIBWEBPDEMUX) $(LIBWEBP)
    401 $(DIRBIN)\vwebp_sdl.exe: $(DIROBJ)\extras\vwebp_sdl.obj
    402 $(DIRBIN)\vwebp_sdl.exe: $(DIROBJ)\extras\webp_to_sdl.obj
    403 $(DIRBIN)\vwebp_sdl.exe: $(IMAGEIO_UTIL_OBJS) $(LIBWEBP)
    404 $(DIRBIN)\webpmux.exe: $(DIROBJ)\examples\webpmux.obj $(LIBWEBPMUX)
    405 $(DIRBIN)\webpmux.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS) $(LIBWEBP)
    406 $(DIRBIN)\img2webp.exe: $(DIROBJ)\examples\img2webp.obj $(LIBWEBPMUX)
    407 $(DIRBIN)\img2webp.exe: $(IMAGEIO_DEC_OBJS)
    408 $(DIRBIN)\img2webp.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS)
    409 $(DIRBIN)\img2webp.exe: $(LIBWEBPDEMUX) $(LIBWEBP) $(LIBSHARPYUV)
    410 $(DIRBIN)\get_disto.exe: $(DIROBJ)\extras\get_disto.obj
    411 $(DIRBIN)\get_disto.exe: $(IMAGEIO_DEC_OBJS) $(IMAGEIO_UTIL_OBJS)
    412 $(DIRBIN)\get_disto.exe: $(LIBWEBPDEMUX) $(LIBWEBP)
    413 $(DIRBIN)\webp_quality.exe: $(DIROBJ)\extras\webp_quality.obj
    414 $(DIRBIN)\webp_quality.exe: $(IMAGEIO_UTIL_OBJS)
    415 $(DIRBIN)\webp_quality.exe: $(EXTRAS_OBJS)
    416 # EXTRA_OBJS requires private symbols from dsp. Explicitly add those when
    417 # building libwebp as a dll.
    418 !IF "$(DLLBUILD)" == "TRUE"
    419 $(DIRBIN)\webp_quality.exe: $(DSP_DEC_OBJS)
    420 !ENDIF
    421 $(DIRBIN)\webp_quality.exe: $(LIBWEBP)
    422 $(DIRBIN)\webpinfo.exe: $(DIROBJ)\examples\webpinfo.obj
    423 $(DIRBIN)\webpinfo.exe: $(IMAGEIO_DEC_OBJS)
    424 $(DIRBIN)\webpinfo.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS)
    425 $(DIRBIN)\webpinfo.exe: $(LIBWEBPDEMUX) $(LIBWEBP)
    426 
    427 $(OUT_EXAMPLES): $(EX_UTIL_OBJS) $(LIBWEBP)
    428 $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS): $(OUTPUT_DIRS)
    429 $(IMAGEIO_DEC_OBJS) $(IMAGEIO_ENC_OBJS) $(EXTRAS_OBJS): $(OUTPUT_DIRS)
    430 !ENDIF  # ARCH == ARM
    431 
    432 $(LIBSHARPYUV): $(LIBSHARPYUV_OBJS)
    433 $(LIBWEBPDECODER): $(LIBWEBPDECODER_OBJS)
    434 $(LIBWEBP): $(LIBWEBP_OBJS) $(LIBSHARPYUV)
    435 $(LIBWEBPMUX): $(LIBWEBPMUX_OBJS)
    436 $(LIBWEBPDEMUX): $(LIBWEBPDEMUX_OBJS)
    437 
    438 $(LIBWEBP_OBJS) $(LIBWEBPMUX_OBJS) $(LIBWEBPDEMUX_OBJS) $(LIBSHARPYUV_OBJS): \
    439     $(OUTPUT_DIRS)
    440 
    441 !IF "$(DLLBUILD)" == "TRUE"
    442 {$(DIROBJ)}.c{$(DIROBJ)}.obj:
    443 	$(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$@  $<
    444 
    445 {src}.rc{$(DIROBJ)}.res:
    446 	$(RC) /fo$@ $<
    447 {src\demux}.rc{$(DIROBJ)\demux}.res:
    448 	$(RC) /fo$@ $<
    449 {src\mux}.rc{$(DIROBJ)\mux}.res:
    450 	$(RC) /fo$@ $<
    451 {sharpyuv}.rc{$(DIROBJ)\sharpyuv}.res:
    452 	$(RC) /fo$@ $<
    453 
    454 $(LIBSHARPYUV): $(DIROBJ)\sharpyuv\$(LIBSHARPYUV_BASENAME:_debug=).res
    455 $(LIBWEBP): $(LIBSHARPYUV) $(DIROBJ)\$(LIBWEBP_BASENAME:_debug=).res
    456 $(LIBWEBPDECODER): $(DIROBJ)\$(LIBWEBPDECODER_BASENAME:_debug=).res
    457 $(LIBWEBPMUX): $(LIBWEBP) $(DIROBJ)\mux\$(LIBWEBPMUX_BASENAME:_debug=).res
    458 $(LIBWEBPDEMUX): $(LIBWEBP) $(DIROBJ)\demux\$(LIBWEBPDEMUX_BASENAME:_debug=).res
    459 
    460 $(LIBWEBPDECODER) $(LIBWEBP) $(LIBWEBPMUX) $(LIBWEBPDEMUX) $(LIBSHARPYUV):
    461 	$(LNKDLL) /out:$(DIRBIN)\$(@B:_dll=.dll) /implib:$@ $(LFLAGS) $**
    462 	-xcopy $(DIROBJ)\*.pdb $(DIRLIB) /y
    463 !ELSE
    464 $(LIBWEBPDECODER) $(LIBWEBP) $(LIBWEBPMUX) $(LIBWEBPDEMUX) $(LIBSHARPYUV):
    465 	$(LNKLIB) /out:$@ $**
    466 	-xcopy $(DIROBJ)\*.pdb $(DIRLIB) /y
    467 !ENDIF
    468 
    469 $(OUTPUT_DIRS):
    470 	@if not exist "$(@)" mkdir "$(@)"
    471 
    472 .SUFFIXES: .c .obj .res .exe
    473 # File-specific flag builds. Note batch rules take precedence over wildcards,
    474 # so for now name each file individually.
    475 $(DIROBJ)\examples\anim_diff.obj: examples\anim_diff.c
    476 	$(CC) $(CFLAGS) /DWEBP_HAVE_GIF /Fd$(LIBWEBP_PDBNAME) \
    477 	  /Fo$(DIROBJ)\examples\ examples\$(@B).c
    478 $(DIROBJ)\examples\anim_dump.obj: examples\anim_dump.c
    479 	$(CC) $(CFLAGS) /DWEBP_HAVE_GIF /Fd$(LIBWEBP_PDBNAME) \
    480 	  /Fo$(DIROBJ)\examples\ examples\$(@B).c
    481 $(DIROBJ)\examples\anim_util.obj: examples\anim_util.c
    482 	$(CC) $(CFLAGS) /DWEBP_HAVE_GIF /Fd$(LIBWEBP_PDBNAME) \
    483 	  /Fo$(DIROBJ)\examples\ examples\$(@B).c
    484 $(DIROBJ)\examples\gif2webp.obj: examples\gif2webp.c
    485 	$(CC) $(CFLAGS) /DWEBP_HAVE_GIF /Fd$(LIBWEBP_PDBNAME) \
    486 	  /Fo$(DIROBJ)\examples\ examples\$(@B).c
    487 $(DIROBJ)\examples\gifdec.obj: examples\gifdec.c
    488 	$(CC) $(CFLAGS) /DWEBP_HAVE_GIF /Fd$(LIBWEBP_PDBNAME) \
    489 	  /Fo$(DIROBJ)\examples\ examples\$(@B).c
    490 # Batch rules
    491 {examples}.c{$(DIROBJ)\examples}.obj::
    492 	$(CC) $(CFLAGS) /Fd$(DIROBJ)\examples\ /Fo$(DIROBJ)\examples\ $<
    493 {extras}.c{$(DIROBJ)\extras}.obj::
    494 	$(CC) $(CFLAGS) /Fd$(DIROBJ)\extras\ /Fo$(DIROBJ)\extras\ $<
    495 {imageio}.c{$(DIROBJ)\imageio}.obj::
    496 	$(CC) $(CFLAGS) /Fd$(DIROBJ)\imageio\ /Fo$(DIROBJ)\imageio\ $<
    497 {sharpyuv}.c{$(DIROBJ)\sharpyuv}.obj::
    498 	$(CC) $(CFLAGS) /Fd$(DIROBJ)\sharpyuv\ /Fo$(DIROBJ)\sharpyuv\ $<
    499 {src\dec}.c{$(DIROBJ)\dec}.obj::
    500 	$(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$(DIROBJ)\dec\ $<
    501 {src\demux}.c{$(DIROBJ)\demux}.obj::
    502 	$(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$(DIROBJ)\demux\ $<
    503 {src\dsp}.c{$(DIROBJ)\dsp}.obj::
    504 	$(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$(DIROBJ)\dsp\ $<
    505 {src\enc}.c{$(DIROBJ)\enc}.obj::
    506 	$(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$(DIROBJ)\enc\ $<
    507 {src\mux}.c{$(DIROBJ)\mux}.obj::
    508 	$(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$(DIROBJ)\mux\ $<
    509 {src\utils}.c{$(DIROBJ)\utils}.obj::
    510 	$(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$(DIROBJ)\utils\ $<
    511 
    512 LNKLIBS     = ole32.lib windowscodecs.lib shlwapi.lib
    513 !IF "$(UNICODE)" == "1"
    514 LNKLIBS     = $(LNKLIBS) Shell32.lib
    515 !ENDIF
    516 
    517 {$(DIROBJ)\examples}.obj{$(DIRBIN)}.exe:
    518 	$(LNKEXE) $(LDFLAGS) /OUT:$@ $** $(LNKLIBS)
    519 
    520 {$(DIROBJ)\extras}.obj{$(DIRBIN)}.exe:
    521 	$(LNKEXE) $(LDFLAGS) /OUT:$@ $** $(LNKLIBS)
    522 
    523 clean::
    524 	@-erase /s $(DIROBJ)\*.dll 2> NUL
    525 	@-erase /s $(DIROBJ)\*.exp 2> NUL
    526 	@-erase /s $(DIROBJ)\*.idb 2> NUL
    527 	@-erase /s $(DIROBJ)\*.lib 2> NUL
    528 	@-erase /s $(DIROBJ)\*.obj 2> NUL
    529 	@-erase /s $(DIROBJ)\*.pch 2> NUL
    530 	@-erase /s $(DIROBJ)\*.pdb 2> NUL
    531 	@-erase /s $(DIROBJ)\*.res 2> NUL
    532 
    533 !ENDIF  # End of case where a config was provided.