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