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