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