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