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