Merge "Fix mutex free in multi-thread lpf"
[platform/upstream/libvpx.git] / examples.mk
1 ##
2 ##  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 ##
4 ##  Use of this source code is governed by a BSD-style license
5 ##  that can be found in the LICENSE file in the root of the source
6 ##  tree. An additional intellectual property rights grant can be found
7 ##  in the file PATENTS.  All contributing project authors may
8 ##  be found in the AUTHORS file in the root of the source tree.
9 ##
10
11 LIBYUV_SRCS +=  third_party/libyuv/include/libyuv/basic_types.h  \
12                 third_party/libyuv/include/libyuv/convert.h \
13                 third_party/libyuv/include/libyuv/convert_argb.h \
14                 third_party/libyuv/include/libyuv/convert_from.h \
15                 third_party/libyuv/include/libyuv/cpu_id.h  \
16                 third_party/libyuv/include/libyuv/planar_functions.h  \
17                 third_party/libyuv/include/libyuv/rotate.h  \
18                 third_party/libyuv/include/libyuv/row.h  \
19                 third_party/libyuv/include/libyuv/scale.h  \
20                 third_party/libyuv/include/libyuv/scale_row.h  \
21                 third_party/libyuv/source/cpu_id.cc \
22                 third_party/libyuv/source/planar_functions.cc \
23                 third_party/libyuv/source/row_any.cc \
24                 third_party/libyuv/source/row_common.cc \
25                 third_party/libyuv/source/row_gcc.cc \
26                 third_party/libyuv/source/row_msa.cc \
27                 third_party/libyuv/source/row_neon.cc \
28                 third_party/libyuv/source/row_neon64.cc \
29                 third_party/libyuv/source/row_win.cc \
30                 third_party/libyuv/source/scale.cc \
31                 third_party/libyuv/source/scale_any.cc \
32                 third_party/libyuv/source/scale_common.cc \
33                 third_party/libyuv/source/scale_gcc.cc \
34                 third_party/libyuv/source/scale_msa.cc \
35                 third_party/libyuv/source/scale_neon.cc \
36                 third_party/libyuv/source/scale_neon64.cc \
37                 third_party/libyuv/source/scale_win.cc \
38
39 LIBWEBM_COMMON_SRCS += third_party/libwebm/common/hdr_util.cc \
40                        third_party/libwebm/common/hdr_util.h \
41                        third_party/libwebm/common/webmids.h
42
43 LIBWEBM_MUXER_SRCS += third_party/libwebm/mkvmuxer/mkvmuxer.cc \
44                       third_party/libwebm/mkvmuxer/mkvmuxerutil.cc \
45                       third_party/libwebm/mkvmuxer/mkvwriter.cc \
46                       third_party/libwebm/mkvmuxer/mkvmuxer.h \
47                       third_party/libwebm/mkvmuxer/mkvmuxertypes.h \
48                       third_party/libwebm/mkvmuxer/mkvmuxerutil.h \
49                       third_party/libwebm/mkvparser/mkvparser.h \
50                       third_party/libwebm/mkvmuxer/mkvwriter.h
51
52 LIBWEBM_PARSER_SRCS = third_party/libwebm/mkvparser/mkvparser.cc \
53                       third_party/libwebm/mkvparser/mkvreader.cc \
54                       third_party/libwebm/mkvparser/mkvparser.h \
55                       third_party/libwebm/mkvparser/mkvreader.h
56
57 # Add compile flags and include path for libwebm sources.
58 ifeq ($(CONFIG_WEBM_IO),yes)
59   CXXFLAGS     += -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS
60   INC_PATH-yes += $(SRC_PATH_BARE)/third_party/libwebm
61 endif
62
63
64 # List of examples to build. UTILS are tools meant for distribution
65 # while EXAMPLES demonstrate specific portions of the API.
66 UTILS-$(CONFIG_DECODERS)    += vpxdec.c
67 vpxdec.SRCS                 += md5_utils.c md5_utils.h
68 vpxdec.SRCS                 += vpx_ports/mem_ops.h
69 vpxdec.SRCS                 += vpx_ports/mem_ops_aligned.h
70 vpxdec.SRCS                 += vpx_ports/msvc.h
71 vpxdec.SRCS                 += vpx_ports/vpx_timer.h
72 vpxdec.SRCS                 += vpx/vpx_integer.h
73 vpxdec.SRCS                 += args.c args.h
74 vpxdec.SRCS                 += ivfdec.c ivfdec.h
75 vpxdec.SRCS                 += y4minput.c y4minput.h
76 vpxdec.SRCS                 += tools_common.c tools_common.h
77 vpxdec.SRCS                 += y4menc.c y4menc.h
78 ifeq ($(CONFIG_LIBYUV),yes)
79   vpxdec.SRCS                 += $(LIBYUV_SRCS)
80   $(BUILD_PFX)third_party/libyuv/%.cc.o: CXXFLAGS += ${LIBYUV_CXXFLAGS}
81 endif
82 ifeq ($(CONFIG_WEBM_IO),yes)
83   vpxdec.SRCS                 += $(LIBWEBM_COMMON_SRCS)
84   vpxdec.SRCS                 += $(LIBWEBM_MUXER_SRCS)
85   vpxdec.SRCS                 += $(LIBWEBM_PARSER_SRCS)
86   vpxdec.SRCS                 += webmdec.cc webmdec.h
87 endif
88 vpxdec.GUID                  = BA5FE66F-38DD-E034-F542-B1578C5FB950
89 vpxdec.DESCRIPTION           = Full featured decoder
90 UTILS-$(CONFIG_ENCODERS)    += vpxenc.c
91 vpxenc.SRCS                 += args.c args.h y4minput.c y4minput.h vpxenc.h
92 vpxenc.SRCS                 += ivfdec.c ivfdec.h
93 vpxenc.SRCS                 += ivfenc.c ivfenc.h
94 vpxenc.SRCS                 += rate_hist.c rate_hist.h
95 vpxenc.SRCS                 += tools_common.c tools_common.h
96 vpxenc.SRCS                 += warnings.c warnings.h
97 vpxenc.SRCS                 += vpx_ports/mem_ops.h
98 vpxenc.SRCS                 += vpx_ports/mem_ops_aligned.h
99 vpxenc.SRCS                 += vpx_ports/msvc.h
100 vpxenc.SRCS                 += vpx_ports/vpx_timer.h
101 vpxenc.SRCS                 += vpxstats.c vpxstats.h
102 ifeq ($(CONFIG_LIBYUV),yes)
103   vpxenc.SRCS                 += $(LIBYUV_SRCS)
104 endif
105 ifeq ($(CONFIG_WEBM_IO),yes)
106   vpxenc.SRCS                 += $(LIBWEBM_COMMON_SRCS)
107   vpxenc.SRCS                 += $(LIBWEBM_MUXER_SRCS)
108   vpxenc.SRCS                 += $(LIBWEBM_PARSER_SRCS)
109   vpxenc.SRCS                 += webmenc.cc webmenc.h
110 endif
111 vpxenc.GUID                  = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1
112 vpxenc.DESCRIPTION           = Full featured encoder
113
114 EXAMPLES-$(CONFIG_VP9_ENCODER)      += vp9_spatial_svc_encoder.c
115 vp9_spatial_svc_encoder.SRCS        += args.c args.h
116 vp9_spatial_svc_encoder.SRCS        += ivfenc.c ivfenc.h
117 vp9_spatial_svc_encoder.SRCS        += y4minput.c y4minput.h
118 vp9_spatial_svc_encoder.SRCS        += tools_common.c tools_common.h
119 vp9_spatial_svc_encoder.SRCS        += video_common.h
120 vp9_spatial_svc_encoder.SRCS        += video_writer.h video_writer.c
121 vp9_spatial_svc_encoder.SRCS        += vpx_ports/msvc.h
122 vp9_spatial_svc_encoder.SRCS        += vpxstats.c vpxstats.h
123 vp9_spatial_svc_encoder.SRCS        += examples/svc_encodeframe.c
124 vp9_spatial_svc_encoder.SRCS        += examples/svc_context.h
125 vp9_spatial_svc_encoder.GUID        = 4A38598D-627D-4505-9C7B-D4020C84100D
126 vp9_spatial_svc_encoder.DESCRIPTION = VP9 Spatial SVC Encoder
127
128 ifneq ($(CONFIG_SHARED),yes)
129 EXAMPLES-$(CONFIG_VP9_ENCODER)    += resize_util.c
130 endif
131
132 EXAMPLES-$(CONFIG_ENCODERS)          += vpx_temporal_svc_encoder.c
133 vpx_temporal_svc_encoder.SRCS        += ivfenc.c ivfenc.h
134 vpx_temporal_svc_encoder.SRCS        += y4minput.c y4minput.h
135 vpx_temporal_svc_encoder.SRCS        += tools_common.c tools_common.h
136 vpx_temporal_svc_encoder.SRCS        += video_common.h
137 vpx_temporal_svc_encoder.SRCS        += video_writer.h video_writer.c
138 vpx_temporal_svc_encoder.SRCS        += vpx_ports/msvc.h
139 vpx_temporal_svc_encoder.GUID        = B18C08F2-A439-4502-A78E-849BE3D60947
140 vpx_temporal_svc_encoder.DESCRIPTION = Temporal SVC Encoder
141 EXAMPLES-$(CONFIG_DECODERS)        += simple_decoder.c
142 simple_decoder.GUID                 = D3BBF1E9-2427-450D-BBFF-B2843C1D44CC
143 simple_decoder.SRCS                += ivfdec.h ivfdec.c
144 simple_decoder.SRCS                += y4minput.c y4minput.h
145 simple_decoder.SRCS                += tools_common.h tools_common.c
146 simple_decoder.SRCS                += video_common.h
147 simple_decoder.SRCS                += video_reader.h video_reader.c
148 simple_decoder.SRCS                += vpx_ports/mem_ops.h
149 simple_decoder.SRCS                += vpx_ports/mem_ops_aligned.h
150 simple_decoder.SRCS                += vpx_ports/msvc.h
151 simple_decoder.DESCRIPTION          = Simplified decoder loop
152 EXAMPLES-$(CONFIG_DECODERS)        += postproc.c
153 postproc.SRCS                      += ivfdec.h ivfdec.c
154 postproc.SRCS                      += y4minput.c y4minput.h
155 postproc.SRCS                      += tools_common.h tools_common.c
156 postproc.SRCS                      += video_common.h
157 postproc.SRCS                      += video_reader.h video_reader.c
158 postproc.SRCS                      += vpx_ports/mem_ops.h
159 postproc.SRCS                      += vpx_ports/mem_ops_aligned.h
160 postproc.SRCS                      += vpx_ports/msvc.h
161 postproc.GUID                       = 65E33355-F35E-4088-884D-3FD4905881D7
162 postproc.DESCRIPTION                = Decoder postprocessor control
163 EXAMPLES-$(CONFIG_DECODERS)        += decode_to_md5.c
164 decode_to_md5.SRCS                 += md5_utils.h md5_utils.c
165 decode_to_md5.SRCS                 += ivfdec.h ivfdec.c
166 decode_to_md5.SRCS                 += y4minput.c y4minput.h
167 decode_to_md5.SRCS                 += tools_common.h tools_common.c
168 decode_to_md5.SRCS                 += video_common.h
169 decode_to_md5.SRCS                 += video_reader.h video_reader.c
170 decode_to_md5.SRCS                 += vpx_ports/mem_ops.h
171 decode_to_md5.SRCS                 += vpx_ports/mem_ops_aligned.h
172 decode_to_md5.SRCS                 += vpx_ports/msvc.h
173 decode_to_md5.GUID                  = 59120B9B-2735-4BFE-B022-146CA340FE42
174 decode_to_md5.DESCRIPTION           = Frame by frame MD5 checksum
175 EXAMPLES-$(CONFIG_ENCODERS)     += simple_encoder.c
176 simple_encoder.SRCS             += ivfenc.h ivfenc.c
177 simple_encoder.SRCS             += y4minput.c y4minput.h
178 simple_encoder.SRCS             += tools_common.h tools_common.c
179 simple_encoder.SRCS             += video_common.h
180 simple_encoder.SRCS             += video_writer.h video_writer.c
181 simple_encoder.SRCS             += vpx_ports/msvc.h
182 simple_encoder.GUID              = 4607D299-8A71-4D2C-9B1D-071899B6FBFD
183 simple_encoder.DESCRIPTION       = Simplified encoder loop
184 EXAMPLES-$(CONFIG_VP9_ENCODER)  += vp9_lossless_encoder.c
185 vp9_lossless_encoder.SRCS       += ivfenc.h ivfenc.c
186 vp9_lossless_encoder.SRCS       += y4minput.c y4minput.h
187 vp9_lossless_encoder.SRCS       += tools_common.h tools_common.c
188 vp9_lossless_encoder.SRCS       += video_common.h
189 vp9_lossless_encoder.SRCS       += video_writer.h video_writer.c
190 vp9_lossless_encoder.SRCS       += vpx_ports/msvc.h
191 vp9_lossless_encoder.GUID        = B63C7C88-5348-46DC-A5A6-CC151EF93366
192 vp9_lossless_encoder.DESCRIPTION = Simplified lossless VP9 encoder
193 EXAMPLES-$(CONFIG_ENCODERS)     += twopass_encoder.c
194 twopass_encoder.SRCS            += ivfenc.h ivfenc.c
195 twopass_encoder.SRCS            += y4minput.c y4minput.h
196 twopass_encoder.SRCS            += tools_common.h tools_common.c
197 twopass_encoder.SRCS            += video_common.h
198 twopass_encoder.SRCS            += video_writer.h video_writer.c
199 twopass_encoder.SRCS            += vpx_ports/msvc.h
200 twopass_encoder.GUID             = 73494FA6-4AF9-4763-8FBB-265C92402FD8
201 twopass_encoder.DESCRIPTION      = Two-pass encoder loop
202 EXAMPLES-$(CONFIG_DECODERS)     += decode_with_drops.c
203 decode_with_drops.SRCS          += ivfdec.h ivfdec.c
204 decode_with_drops.SRCS          += y4minput.c y4minput.h
205 decode_with_drops.SRCS          += tools_common.h tools_common.c
206 decode_with_drops.SRCS          += video_common.h
207 decode_with_drops.SRCS          += video_reader.h video_reader.c
208 decode_with_drops.SRCS          += vpx_ports/mem_ops.h
209 decode_with_drops.SRCS          += vpx_ports/mem_ops_aligned.h
210 decode_with_drops.SRCS          += vpx_ports/msvc.h
211 decode_with_drops.GUID           = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D26
212 decode_with_drops.DESCRIPTION    = Drops frames while decoding
213 EXAMPLES-$(CONFIG_ENCODERS)        += set_maps.c
214 set_maps.SRCS                      += ivfenc.h ivfenc.c
215 set_maps.SRCS                      += y4minput.c y4minput.h
216 set_maps.SRCS                      += tools_common.h tools_common.c
217 set_maps.SRCS                      += video_common.h
218 set_maps.SRCS                      += video_writer.h video_writer.c
219 set_maps.SRCS                      += vpx_ports/msvc.h
220 set_maps.GUID                       = ECB2D24D-98B8-4015-A465-A4AF3DCC145F
221 set_maps.DESCRIPTION                = Set active and ROI maps
222 EXAMPLES-$(CONFIG_VP8_ENCODER)     += vp8cx_set_ref.c
223 vp8cx_set_ref.SRCS                 += ivfenc.h ivfenc.c
224 vp8cx_set_ref.SRCS                 += y4minput.c y4minput.h
225 vp8cx_set_ref.SRCS                 += tools_common.h tools_common.c
226 vp8cx_set_ref.SRCS                 += video_common.h
227 vp8cx_set_ref.SRCS                 += video_writer.h video_writer.c
228 vp8cx_set_ref.SRCS                 += vpx_ports/msvc.h
229 vp8cx_set_ref.GUID                  = C5E31F7F-96F6-48BD-BD3E-10EBF6E8057A
230 vp8cx_set_ref.DESCRIPTION           = VP8 set encoder reference frame
231
232 ifeq ($(CONFIG_VP9_ENCODER),yes)
233 ifeq ($(CONFIG_DECODERS),yes)
234 EXAMPLES-yes                       += vp9cx_set_ref.c
235 vp9cx_set_ref.SRCS                 += ivfenc.h ivfenc.c
236 vp9cx_set_ref.SRCS                 += y4minput.c y4minput.h
237 vp9cx_set_ref.SRCS                 += tools_common.h tools_common.c
238 vp9cx_set_ref.SRCS                 += video_common.h
239 vp9cx_set_ref.SRCS                 += video_writer.h video_writer.c
240 vp9cx_set_ref.GUID                  = 65D7F14A-2EE6-4293-B958-AB5107A03B55
241 vp9cx_set_ref.DESCRIPTION           = VP9 set encoder reference frame
242 endif
243 endif
244
245 ifeq ($(CONFIG_MULTI_RES_ENCODING),yes)
246 ifeq ($(CONFIG_LIBYUV),yes)
247 EXAMPLES-$(CONFIG_VP8_ENCODER)          += vp8_multi_resolution_encoder.c
248 vp8_multi_resolution_encoder.SRCS       += ivfenc.h ivfenc.c
249 vp8_multi_resolution_encoder.SRCS       += y4minput.c y4minput.h
250 vp8_multi_resolution_encoder.SRCS       += tools_common.h tools_common.c
251 vp8_multi_resolution_encoder.SRCS       += video_writer.h video_writer.c
252 vp8_multi_resolution_encoder.SRCS       += vpx_ports/msvc.h
253 vp8_multi_resolution_encoder.SRCS       += $(LIBYUV_SRCS)
254 vp8_multi_resolution_encoder.GUID        = 04f8738e-63c8-423b-90fa-7c2703a374de
255 vp8_multi_resolution_encoder.DESCRIPTION = VP8 Multiple-resolution Encoding
256 endif
257 endif
258
259 # Handle extra library flags depending on codec configuration
260
261 # We should not link to math library (libm) on RVCT
262 # when building for bare-metal targets
263 ifeq ($(CONFIG_OS_SUPPORT), yes)
264 CODEC_EXTRA_LIBS-$(CONFIG_VP8)         += m
265 CODEC_EXTRA_LIBS-$(CONFIG_VP9)         += m
266 else
267     ifeq ($(CONFIG_GCC), yes)
268     CODEC_EXTRA_LIBS-$(CONFIG_VP8)         += m
269     CODEC_EXTRA_LIBS-$(CONFIG_VP9)         += m
270     endif
271 endif
272 #
273 # End of specified files. The rest of the build rules should happen
274 # automagically from here.
275 #
276
277
278 # Examples need different flags based on whether we're building
279 # from an installed tree or a version controlled tree. Determine
280 # the proper paths.
281 ifeq ($(HAVE_ALT_TREE_LAYOUT),yes)
282     LIB_PATH-yes := $(SRC_PATH_BARE)/../lib
283     INC_PATH-yes := $(SRC_PATH_BARE)/../include
284 else
285     LIB_PATH-yes                     += $(if $(BUILD_PFX),$(BUILD_PFX),.)
286     INC_PATH-$(CONFIG_VP8_DECODER)   += $(SRC_PATH_BARE)/vp8
287     INC_PATH-$(CONFIG_VP8_ENCODER)   += $(SRC_PATH_BARE)/vp8
288     INC_PATH-$(CONFIG_VP9_DECODER)   += $(SRC_PATH_BARE)/vp9
289     INC_PATH-$(CONFIG_VP9_ENCODER)   += $(SRC_PATH_BARE)/vp9
290 endif
291 INC_PATH-$(CONFIG_LIBYUV) += $(SRC_PATH_BARE)/third_party/libyuv/include
292 LIB_PATH := $(call enabled,LIB_PATH)
293 INC_PATH := $(call enabled,INC_PATH)
294 INTERNAL_CFLAGS = $(addprefix -I,$(INC_PATH))
295 INTERNAL_LDFLAGS += $(addprefix -L,$(LIB_PATH))
296
297
298 # Expand list of selected examples to build (as specified above)
299 UTILS           = $(call enabled,UTILS)
300 EXAMPLES        = $(addprefix examples/,$(call enabled,EXAMPLES))
301 ALL_EXAMPLES    = $(UTILS) $(EXAMPLES)
302 UTIL_SRCS       = $(foreach ex,$(UTILS),$($(ex:.c=).SRCS))
303 ALL_SRCS        = $(foreach ex,$(ALL_EXAMPLES),$($(notdir $(ex:.c=)).SRCS))
304 CODEC_EXTRA_LIBS=$(sort $(call enabled,CODEC_EXTRA_LIBS))
305
306
307 # Expand all example sources into a variable containing all sources
308 # for that example (not just them main one specified in UTILS/EXAMPLES)
309 # and add this file to the list (for MSVS workspace generation)
310 $(foreach ex,$(ALL_EXAMPLES),$(eval $(notdir $(ex:.c=)).SRCS += $(ex) examples.mk))
311
312
313 # Create build/install dependencies for all examples. The common case
314 # is handled here. The MSVS case is handled below.
315 NOT_MSVS = $(if $(CONFIG_MSVS),,yes)
316 DIST-BINS-$(NOT_MSVS)      += $(addprefix bin/,$(ALL_EXAMPLES:.c=$(EXE_SFX)))
317 INSTALL-BINS-$(NOT_MSVS)   += $(addprefix bin/,$(UTILS:.c=$(EXE_SFX)))
318 DIST-SRCS-yes              += $(ALL_SRCS)
319 INSTALL-SRCS-yes           += $(UTIL_SRCS)
320 OBJS-$(NOT_MSVS)           += $(call objs,$(ALL_SRCS))
321 BINS-$(NOT_MSVS)           += $(addprefix $(BUILD_PFX),$(ALL_EXAMPLES:.c=$(EXE_SFX)))
322
323
324 # Instantiate linker template for all examples.
325 CODEC_LIB=$(if $(CONFIG_DEBUG_LIBS),vpx_g,vpx)
326 ifneq ($(filter darwin%,$(TGT_OS)),)
327 SHARED_LIB_SUF=.dylib
328 else
329 ifneq ($(filter os2%,$(TGT_OS)),)
330 SHARED_LIB_SUF=_dll.a
331 else
332 SHARED_LIB_SUF=.so
333 endif
334 endif
335 CODEC_LIB_SUF=$(if $(CONFIG_SHARED),$(SHARED_LIB_SUF),.a)
336 $(foreach bin,$(BINS-yes),\
337     $(eval $(bin):$(LIB_PATH)/lib$(CODEC_LIB)$(CODEC_LIB_SUF))\
338     $(eval $(call linker_template,$(bin),\
339         $(call objs,$($(notdir $(bin:$(EXE_SFX)=)).SRCS)) \
340         -l$(CODEC_LIB) $(addprefix -l,$(CODEC_EXTRA_LIBS))\
341         )))
342
343 # The following pairs define a mapping of locations in the distribution
344 # tree to locations in the source/build trees.
345 INSTALL_MAPS += src/%.c   %.c
346 INSTALL_MAPS += src/%     $(SRC_PATH_BARE)/%
347 INSTALL_MAPS += bin/%     %
348 INSTALL_MAPS += %         %
349
350
351 # Set up additional MSVS environment
352 ifeq ($(CONFIG_MSVS),yes)
353 CODEC_LIB=$(if $(CONFIG_SHARED),vpx,$(if $(CONFIG_STATIC_MSVCRT),vpxmt,vpxmd))
354 # This variable uses deferred expansion intentionally, since the results of
355 # $(wildcard) may change during the course of the Make.
356 VS_PLATFORMS = $(foreach d,$(wildcard */Release/$(CODEC_LIB).lib),$(word 1,$(subst /, ,$(d))))
357 INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),bin/$(p)/%  $(p)/Release/%)
358 endif
359
360 # Build Visual Studio Projects. We use a template here to instantiate
361 # explicit rules rather than using an implicit rule because we want to
362 # leverage make's VPATH searching rather than specifying the paths on
363 # each file in ALL_EXAMPLES. This has the unfortunate side effect that
364 # touching the source files trigger a rebuild of the project files
365 # even though there is no real dependency there (the dependency is on
366 # the makefiles). We may want to revisit this.
367 define vcproj_template
368 $(1): $($(1:.$(VCPROJ_SFX)=).SRCS) vpx.$(VCPROJ_SFX)
369         $(if $(quiet),@echo "    [vcproj] $$@")
370         $(qexec)$$(GEN_VCPROJ)\
371             --exe\
372             --target=$$(TOOLCHAIN)\
373             --name=$$(@:.$(VCPROJ_SFX)=)\
374             --ver=$$(CONFIG_VS_VERSION)\
375             --proj-guid=$$($$(@:.$(VCPROJ_SFX)=).GUID)\
376             --src-path-bare="$(SRC_PATH_BARE)" \
377             $$(if $$(CONFIG_STATIC_MSVCRT),--static-crt) \
378             --out=$$@ $$(INTERNAL_CFLAGS) $$(CFLAGS) \
379             $$(INTERNAL_LDFLAGS) $$(LDFLAGS) -l$$(CODEC_LIB) $$^
380 endef
381 ALL_EXAMPLES_BASENAME := $(notdir $(ALL_EXAMPLES))
382 PROJECTS-$(CONFIG_MSVS) += $(ALL_EXAMPLES_BASENAME:.c=.$(VCPROJ_SFX))
383 INSTALL-BINS-$(CONFIG_MSVS) += $(foreach p,$(VS_PLATFORMS),\
384                                $(addprefix bin/$(p)/,$(ALL_EXAMPLES_BASENAME:.c=.exe)))
385 $(foreach proj,$(call enabled,PROJECTS),\
386     $(eval $(call vcproj_template,$(proj))))
387
388 #
389 # Documentation Rules
390 #
391 %.dox: %.c
392         @echo "    [DOXY] $@"
393         @mkdir -p $(dir $@)
394         @echo "/*!\page example_$(@F:.dox=) $(@F:.dox=)" > $@
395         @echo "   \includelineno $(<F)" >> $@
396         @echo "*/" >> $@
397
398 samples.dox: examples.mk
399         @echo "    [DOXY] $@"
400         @echo "/*!\page samples Sample Code" > $@
401         @echo "    This SDK includes a number of sample applications."\
402               "Each sample documents a feature of the SDK in both prose"\
403               "and the associated C code."\
404               "The following samples are included: ">>$@
405         @$(foreach ex,$(sort $(notdir $(EXAMPLES:.c=))),\
406            echo "     - \subpage example_$(ex) $($(ex).DESCRIPTION)" >> $@;)
407         @echo >> $@
408         @echo "    In addition, the SDK contains a number of utilities."\
409               "Since these utilities are built upon the concepts described"\
410               "in the sample code listed above, they are not documented in"\
411               "pieces like the samples are. Their source is included here"\
412               "for reference. The following utilities are included:" >> $@
413         @$(foreach ex,$(sort $(UTILS:.c=)),\
414            echo "     - \subpage example_$(ex) $($(ex).DESCRIPTION)" >> $@;)
415         @echo "*/" >> $@
416
417 CLEAN-OBJS += examples.doxy samples.dox $(ALL_EXAMPLES:.c=.dox)
418 DOCS-yes += examples.doxy samples.dox
419 examples.doxy: samples.dox $(ALL_EXAMPLES:.c=.dox)
420         @echo "INPUT += $^" > $@
421         @echo "ENABLED_SECTIONS += samples" >> $@