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