av1_convolve_ x,y _avx2() -- use 256 bit load/store
[aom.git] / examples.mk
blobdd59880b6e22b614d12522c2760de2ff0ba96da8
1 ##
2 ## Copyright (c) 2016, Alliance for Open Media. All rights reserved
3 ##
4 ## This source code is subject to the terms of the BSD 2 Clause License and
5 ## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 ## was not distributed with this source code in the LICENSE file, you can
7 ## obtain it at www.aomedia.org/license/software. If the Alliance for Open
8 ## Media Patent License 1.0 was not distributed with this source code in the
9 ## PATENTS file, you can obtain it at www.aomedia.org/license/patent.
13 LIBYUV_SRCS += third_party/libyuv/include/libyuv/basic_types.h \
14 third_party/libyuv/include/libyuv/convert.h \
15 third_party/libyuv/include/libyuv/convert_argb.h \
16 third_party/libyuv/include/libyuv/convert_from.h \
17 third_party/libyuv/include/libyuv/cpu_id.h \
18 third_party/libyuv/include/libyuv/planar_functions.h \
19 third_party/libyuv/include/libyuv/rotate.h \
20 third_party/libyuv/include/libyuv/row.h \
21 third_party/libyuv/include/libyuv/scale.h \
22 third_party/libyuv/include/libyuv/scale_row.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 \
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
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
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
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
65 # List of examples to build. UTILS are tools meant for distribution
66 # while EXAMPLES demonstrate specific portions of the API.
67 UTILS-$(CONFIG_AV1_DECODER) += aomdec.c
68 aomdec.SRCS += md5_utils.c md5_utils.h
69 aomdec.SRCS += aom_ports/mem_ops.h
70 aomdec.SRCS += aom_ports/mem_ops_aligned.h
71 aomdec.SRCS += aom_ports/msvc.h
72 aomdec.SRCS += aom_ports/aom_timer.h
73 aomdec.SRCS += aom/aom_integer.h
74 aomdec.SRCS += args.c args.h
75 aomdec.SRCS += ivfdec.c ivfdec.h
76 aomdec.SRCS += tools_common.c tools_common.h
77 aomdec.SRCS += y4menc.c y4menc.h
78 ifeq ($(CONFIG_LIBYUV),yes)
79 aomdec.SRCS += $(LIBYUV_SRCS)
80 endif
81 ifeq ($(CONFIG_WEBM_IO),yes)
82 aomdec.SRCS += $(LIBWEBM_COMMON_SRCS)
83 aomdec.SRCS += $(LIBWEBM_MUXER_SRCS)
84 aomdec.SRCS += $(LIBWEBM_PARSER_SRCS)
85 aomdec.SRCS += webmdec.cc webmdec.h
86 endif
87 ifeq ($(CONFIG_OBU_NO_IVF),yes)
88 aomdec.SRCS += obudec.c obudec.h
89 endif
90 aomdec.GUID = BA5FE66F-38DD-E034-F542-B1578C5FB950
91 aomdec.DESCRIPTION = Full featured decoder
92 UTILS-$(CONFIG_AV1_ENCODER) += aomenc.c
93 aomenc.SRCS += args.c args.h y4minput.c y4minput.h aomenc.h
94 aomenc.SRCS += ivfdec.c ivfdec.h
95 aomenc.SRCS += ivfenc.c ivfenc.h
96 aomenc.SRCS += rate_hist.c rate_hist.h
97 aomenc.SRCS += tools_common.c tools_common.h
98 aomenc.SRCS += examples/encoder_util.h examples/encoder_util.c
99 aomenc.SRCS += warnings.c warnings.h
100 aomenc.SRCS += aom_ports/mem_ops.h
101 aomenc.SRCS += aom_ports/mem_ops_aligned.h
102 aomenc.SRCS += aom_ports/msvc.h
103 aomenc.SRCS += aom_ports/aom_timer.h
104 aomenc.SRCS += aomstats.c aomstats.h
105 ifeq ($(CONFIG_LIBYUV),yes)
106 aomenc.SRCS += $(LIBYUV_SRCS)
107 endif
108 ifeq ($(CONFIG_WEBM_IO),yes)
109 aomenc.SRCS += $(LIBWEBM_COMMON_SRCS)
110 aomenc.SRCS += $(LIBWEBM_MUXER_SRCS)
111 aomenc.SRCS += $(LIBWEBM_PARSER_SRCS)
112 aomenc.SRCS += webmenc.cc webmenc.h
113 endif
114 aomenc.GUID = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1
115 aomenc.DESCRIPTION = Full featured encoder
117 ifeq ($(CONFIG_ANALYZER),yes)
118 EXAMPLES-$(CONFIG_AV1_DECODER) += analyzer.cc
119 analyzer.GUID = 83827a8c-e3c3-4b19-8832-0cfc206c4496
120 analyzer.SRCS += ivfdec.h ivfdec.c
121 analyzer.SRCS += av1/decoder/inspection.h
122 analyzer.SRCS += av1/decoder/inspection.c
123 analyzer.SRCS += video_reader.h video_reader.c
124 analyzer.SRCS += tools_common.h tools_common.c
125 analyzer.DESCRIPTION = Bitstream analyzer
126 endif
128 ifeq ($(CONFIG_INSPECTION),yes)
129 EXAMPLES-$(CONFIG_AV1_DECODER) += inspect.c
130 inspect.GUID = FA46A420-3356-441F-B0FD-60AA1345C181
131 inspect.SRCS += ivfdec.h ivfdec.c
132 inspect.SRCS += args.c args.h
133 inspect.SRCS += tools_common.h tools_common.c
134 inspect.SRCS += video_common.h
135 inspect.SRCS += video_reader.h video_reader.c
136 inspect.SRCS += aom_ports/mem_ops.h
137 inspect.SRCS += aom_ports/mem_ops_aligned.h
138 inspect.SRCS += aom_ports/msvc.h
139 inspect.DESCRIPTION = Dump inspection data
140 endif
142 EXAMPLES-$(CONFIG_AV1_DECODER) += simple_decoder.c
143 simple_decoder.GUID = D3BBF1E9-2427-450D-BBFF-B2843C1D44CC
144 simple_decoder.SRCS += ivfdec.h ivfdec.c
145 simple_decoder.SRCS += tools_common.h tools_common.c
146 simple_decoder.SRCS += video_common.h
147 simple_decoder.SRCS += video_reader.h video_reader.c
148 simple_decoder.SRCS += aom_ports/mem_ops.h
149 simple_decoder.SRCS += aom_ports/mem_ops_aligned.h
150 simple_decoder.SRCS += aom_ports/msvc.h
151 simple_decoder.DESCRIPTION = Simplified decoder loop
152 EXAMPLES-$(CONFIG_AV1_DECODER) += decode_to_md5.c
153 decode_to_md5.SRCS += md5_utils.h md5_utils.c
154 decode_to_md5.SRCS += ivfdec.h ivfdec.c
155 decode_to_md5.SRCS += tools_common.h tools_common.c
156 decode_to_md5.SRCS += video_common.h
157 decode_to_md5.SRCS += video_reader.h video_reader.c
158 decode_to_md5.SRCS += aom_ports/mem_ops.h
159 decode_to_md5.SRCS += aom_ports/mem_ops_aligned.h
160 decode_to_md5.SRCS += aom_ports/msvc.h
161 decode_to_md5.GUID = 59120B9B-2735-4BFE-B022-146CA340FE42
162 decode_to_md5.DESCRIPTION = Frame by frame MD5 checksum
163 EXAMPLES-$(CONFIG_AV1_ENCODER) += simple_encoder.c
164 simple_encoder.SRCS += ivfenc.h ivfenc.c
165 simple_encoder.SRCS += tools_common.h tools_common.c
166 simple_encoder.SRCS += video_common.h
167 simple_encoder.SRCS += video_writer.h video_writer.c
168 simple_encoder.SRCS += aom_ports/msvc.h
169 simple_encoder.GUID = 4607D299-8A71-4D2C-9B1D-071899B6FBFD
170 simple_encoder.DESCRIPTION = Simplified encoder loop
171 EXAMPLES-$(CONFIG_AV1_ENCODER) += lossless_encoder.c
172 lossless_encoder.SRCS += ivfenc.h ivfenc.c
173 lossless_encoder.SRCS += tools_common.h tools_common.c
174 lossless_encoder.SRCS += video_common.h
175 lossless_encoder.SRCS += video_writer.h video_writer.c
176 lossless_encoder.SRCS += aom_ports/msvc.h
177 lossless_encoder.GUID = B63C7C88-5348-46DC-A5A6-CC151EF93366
178 lossless_encoder.DESCRIPTION = Simplified lossless encoder
179 EXAMPLES-$(CONFIG_AV1_ENCODER) += twopass_encoder.c
180 twopass_encoder.SRCS += ivfenc.h ivfenc.c
181 twopass_encoder.SRCS += tools_common.h tools_common.c
182 twopass_encoder.SRCS += video_common.h
183 twopass_encoder.SRCS += video_writer.h video_writer.c
184 twopass_encoder.SRCS += aom_ports/msvc.h
185 twopass_encoder.GUID = 73494FA6-4AF9-4763-8FBB-265C92402FD8
186 twopass_encoder.DESCRIPTION = Two-pass encoder loop
187 EXAMPLES-$(CONFIG_AV1_DECODER) += decode_with_drops.c
188 decode_with_drops.SRCS += ivfdec.h ivfdec.c
189 decode_with_drops.SRCS += tools_common.h tools_common.c
190 decode_with_drops.SRCS += video_common.h
191 decode_with_drops.SRCS += video_reader.h video_reader.c
192 decode_with_drops.SRCS += aom_ports/mem_ops.h
193 decode_with_drops.SRCS += aom_ports/mem_ops_aligned.h
194 decode_with_drops.SRCS += aom_ports/msvc.h
195 decode_with_drops.GUID = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D26
196 decode_with_drops.DESCRIPTION = Drops frames while decoding
197 EXAMPLES-$(CONFIG_AV1_ENCODER) += set_maps.c
198 set_maps.SRCS += ivfenc.h ivfenc.c
199 set_maps.SRCS += tools_common.h tools_common.c
200 set_maps.SRCS += video_common.h
201 set_maps.SRCS += video_writer.h video_writer.c
202 set_maps.SRCS += aom_ports/msvc.h
203 set_maps.GUID = ECB2D24D-98B8-4015-A465-A4AF3DCC145F
204 set_maps.DESCRIPTION = Set active and ROI maps
205 ifeq ($(CONFIG_EXT_TILE),yes)
206 EXAMPLES-$(CONFIG_AV1_ENCODER) += lightfield_encoder.c
207 lightfield_encoder.SRCS += ivfenc.h ivfenc.c
208 lightfield_encoder.SRCS += tools_common.h tools_common.c
209 lightfield_encoder.SRCS += video_common.h
210 lightfield_encoder.SRCS += video_writer.h video_writer.c
211 lightfield_encoder.SRCS += aom_ports/msvc.h
212 lightfield_encoder.GUID = 73494FA6-4AF9-4763-8FBB-265C92402FD8
213 lightfield_encoder.DESCRIPTION = Lightfield encoder loop
214 EXAMPLES-$(CONFIG_AV1_DECODER) += lightfield_decoder.c
215 lightfield_decoder.SRCS += ivfdec.h ivfdec.c
216 lightfield_decoder.SRCS += tools_common.h tools_common.c
217 lightfield_decoder.SRCS += video_common.h
218 lightfield_decoder.SRCS += video_reader.h video_reader.c
219 lightfield_decoder.SRCS += aom_ports/mem_ops.h
220 lightfield_decoder.SRCS += aom_ports/mem_ops_aligned.h
221 lightfield_decoder.SRCS += aom_ports/msvc.h
222 lightfield_decoder.GUID = D3BBF1E9-2427-450D-BBFF-B2843C1D44CC
223 lightfield_decoder.DESCRIPTION = lightfield decoder loop
224 endif
225 ifeq ($(CONFIG_AV1_ENCODER),yes)
226 ifeq ($(CONFIG_AV1_DECODER),yes)
227 EXAMPLES-$(CONFIG_AV1_ENCODER) += aom_cx_set_ref.c
228 aom_cx_set_ref.SRCS += ivfenc.h ivfenc.c
229 aom_cx_set_ref.SRCS += tools_common.h tools_common.c
230 aom_cx_set_ref.SRCS += examples/encoder_util.h
231 aom_cx_set_ref.SRCS += examples/encoder_util.c
232 aom_cx_set_ref.SRCS += video_common.h
233 aom_cx_set_ref.SRCS += video_writer.h video_writer.c
234 aom_cx_set_ref.SRCS += aom_ports/msvc.h
235 aom_cx_set_ref.GUID = C5E31F7F-96F6-48BD-BD3E-10EBF6E8057A
236 aom_cx_set_ref.DESCRIPTION = AV1 set encoder reference frame
237 endif
238 endif
240 # Handle extra library flags depending on codec configuration
242 # We should not link to math library (libm) on RVCT
243 # when building for bare-metal targets
244 ifeq ($(CONFIG_OS_SUPPORT), yes)
245 CODEC_EXTRA_LIBS-$(CONFIG_AV1) += m
246 else
247 ifeq ($(CONFIG_GCC), yes)
248 CODEC_EXTRA_LIBS-$(CONFIG_AV1) += m
249 endif
250 endif
252 # End of specified files. The rest of the build rules should happen
253 # automagically from here.
257 # Examples need different flags based on whether we're building
258 # from an installed tree or a version controlled tree. Determine
259 # the proper paths.
260 ifeq ($(HAVE_ALT_TREE_LAYOUT),yes)
261 LIB_PATH-yes := $(SRC_PATH_BARE)/../lib
262 INC_PATH-yes := $(SRC_PATH_BARE)/../include
263 else
264 LIB_PATH-yes += $(if $(BUILD_PFX),$(BUILD_PFX),.)
265 INC_PATH-$(CONFIG_AV1_DECODER) += $(SRC_PATH_BARE)/av1
266 INC_PATH-$(CONFIG_AV1_ENCODER) += $(SRC_PATH_BARE)/av1
267 endif
268 INC_PATH-$(CONFIG_LIBYUV) += $(SRC_PATH_BARE)/third_party/libyuv/include
269 LIB_PATH := $(call enabled,LIB_PATH)
270 INC_PATH := $(call enabled,INC_PATH)
271 INTERNAL_CFLAGS = $(addprefix -I,$(INC_PATH))
272 INTERNAL_LDFLAGS += $(addprefix -L,$(LIB_PATH))
275 # Expand list of selected examples to build (as specified above)
276 UTILS = $(call enabled,UTILS)
277 EXAMPLES = $(addprefix examples/,$(call enabled,EXAMPLES))
278 ALL_EXAMPLES = $(UTILS) $(EXAMPLES)
279 UTIL_SRCS = $(foreach ex,$(UTILS),$($(ex:.c=).SRCS) $($(ex:.cc=).SRCS))
280 ALL_SRCS = $(foreach ex, $(ALL_EXAMPLES), \
281 $($(notdir $(ex:.c=)).SRCS) \
282 $($(notdir $(ex:.cc=)).SRCS))
283 CODEC_EXTRA_LIBS=$(sort $(call enabled,CODEC_EXTRA_LIBS))
286 # Expand all example sources into a variable containing all sources
287 # for that example (not just them main one specified in UTILS/EXAMPLES)
288 # and add this file to the list (for MSVS workspace generation)
289 EXAMPLES_C = $(filter-out %.cc, $(ALL_EXAMPLES))
290 $(foreach ex,$(EXAMPLES_C), \
291 $(eval $(notdir $(ex:.c=)).SRCS += $(ex) examples.mk))
292 EXAMPLES_CXX = $(filter-out %.c, $(ALL_EXAMPLES))
293 $(foreach ex,$(EXAMPLES_CXX), \
294 $(eval $(notdir $(ex:.cc=)).SRCS += $(ex) examples.mk))
296 # Create build/install dependencies for all examples. The common case
297 # is handled here. The MSVS case is handled below.
298 NOT_MSVS = $(if $(CONFIG_MSVS),,yes)
299 DIST-BINS-$(NOT_MSVS) += $(addprefix bin/,$(EXAMPLES_C:.c=$(EXE_SFX)))
300 DIST-BINS-$(NOT_MSVS) += $(addprefix bin/,$(EXAMPLES_CXX:.cc=$(EXE_SFX)))
301 INSTALL-BINS-$(NOT_MSVS) += $(addprefix bin/,$(UTILS:.c=$(EXE_SFX)))
302 DIST-SRCS-yes += $(ALL_SRCS)
303 INSTALL-SRCS-yes += $(UTIL_SRCS)
304 OBJS-$(NOT_MSVS) += $(call objs,$(ALL_SRCS))
305 BINS-$(NOT_MSVS) += $(addprefix $(BUILD_PFX), \
306 $(EXAMPLES_C:.c=$(EXE_SFX)))
307 BINS-$(NOT_MSVS) += $(addprefix $(BUILD_PFX), \
308 $(EXAMPLES_CXX:.cc=$(EXE_SFX)))
310 # Instantiate linker template for all examples.
311 CODEC_LIB=$(if $(CONFIG_DEBUG_LIBS),aom_g,aom)
312 ifneq ($(filter darwin%,$(TGT_OS)),)
313 SHARED_LIB_SUF=.dylib
314 else
315 ifneq ($(filter os2%,$(TGT_OS)),)
316 SHARED_LIB_SUF=_dll.a
317 else
318 SHARED_LIB_SUF=.so
319 endif
320 endif
321 CODEC_LIB_SUF=$(if $(CONFIG_SHARED),$(SHARED_LIB_SUF),.a)
322 $(foreach bin,$(BINS-yes),\
323 $(eval $(bin):$(LIB_PATH)/lib$(CODEC_LIB)$(CODEC_LIB_SUF))\
324 $(eval $(call linker_template,$(bin),\
325 $(call objs,$($(notdir $(bin:$(EXE_SFX)=)).SRCS)) \
326 -l$(CODEC_LIB) $(addprefix -l,$(CODEC_EXTRA_LIBS))\
329 # The following pairs define a mapping of locations in the distribution
330 # tree to locations in the source/build trees.
331 INSTALL_MAPS += src/%.c %.c
332 INSTALL_MAPS += src/% $(SRC_PATH_BARE)/%
333 INSTALL_MAPS += bin/% %
334 INSTALL_MAPS += % %
337 # Set up additional MSVS environment
338 ifeq ($(CONFIG_MSVS),yes)
339 CODEC_LIB=$(if $(CONFIG_SHARED),aom,$(if $(CONFIG_STATIC_MSVCRT),aommt,aommd))
340 # This variable uses deferred expansion intentionally, since the results of
341 # $(wildcard) may change during the course of the Make.
342 VS_PLATFORMS = $(foreach d,$(wildcard */Release/$(CODEC_LIB).lib),$(word 1,$(subst /, ,$(d))))
343 INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),bin/$(p)/% $(p)/Release/%)
344 endif
346 # Build Visual Studio Projects. We use a template here to instantiate
347 # explicit rules rather than using an implicit rule because we want to
348 # leverage make's VPATH searching rather than specifying the paths on
349 # each file in ALL_EXAMPLES. This has the unfortunate side effect that
350 # touching the source files trigger a rebuild of the project files
351 # even though there is no real dependency there (the dependency is on
352 # the makefiles). We may want to revisit this.
353 define vcproj_template
354 $(1): $($(1:.$(VCPROJ_SFX)=).SRCS) aom.$(VCPROJ_SFX)
355 $(if $(quiet),@echo " [vcproj] $$@")
356 $(qexec)$$(GEN_VCPROJ)\
357 --exe\
358 --target=$$(TOOLCHAIN)\
359 --name=$$(@:.$(VCPROJ_SFX)=)\
360 --ver=$$(CONFIG_VS_VERSION)\
361 --proj-guid=$$($$(@:.$(VCPROJ_SFX)=).GUID)\
362 --src-path-bare="$(SRC_PATH_BARE)" \
363 $$(if $$(CONFIG_STATIC_MSVCRT),--static-crt) \
364 --out=$$@ $$(INTERNAL_CFLAGS) $$(CFLAGS) \
365 $$(INTERNAL_LDFLAGS) $$(LDFLAGS) -l$$(CODEC_LIB) $$^
366 endef
367 ALL_EXAMPLES_BASENAME := $(notdir $(ALL_EXAMPLES))
368 PROJECTS-$(CONFIG_MSVS) += $(ALL_EXAMPLES_BASENAME:.c=.$(VCPROJ_SFX))
369 INSTALL-BINS-$(CONFIG_MSVS) += $(foreach p,$(VS_PLATFORMS),\
370 $(addprefix bin/$(p)/,$(ALL_EXAMPLES_BASENAME:.c=.exe)))
371 $(foreach proj,$(call enabled,PROJECTS),\
372 $(eval $(call vcproj_template,$(proj))))
375 # Documentation Rules
377 %.dox: %.c
378 @echo " [DOXY] $@"
379 @mkdir -p $(dir $@)
380 @echo "/*!\page example_$(@F:.dox=) $(@F:.dox=)" > $@
381 @echo " \includelineno $(<F)" >> $@
382 @echo "*/" >> $@
384 samples.dox: examples.mk
385 @echo " [DOXY] $@"
386 @echo "/*!\page samples Sample Code" > $@
387 @echo " This SDK includes a number of sample applications."\
388 "Each sample documents a feature of the SDK in both prose"\
389 "and the associated C code."\
390 "The following samples are included: ">>$@
391 @$(foreach ex,$(sort $(notdir $(EXAMPLES:.c=))),\
392 echo " - \subpage example_$(ex) $($(ex).DESCRIPTION)" >> $@;)
393 @echo >> $@
394 @echo " In addition, the SDK contains a number of utilities."\
395 "Since these utilities are built upon the concepts described"\
396 "in the sample code listed above, they are not documented in"\
397 "pieces like the samples are. Their source is included here"\
398 "for reference. The following utilities are included:" >> $@
399 @$(foreach ex,$(sort $(UTILS:.c=)),\
400 echo " - \subpage example_$(ex) $($(ex).DESCRIPTION)" >> $@;)
401 @echo "*/" >> $@
403 CLEAN-OBJS += examples.doxy samples.dox $(ALL_EXAMPLES:.c=.dox)
404 DOCS-yes += examples.doxy samples.dox
405 examples.doxy: samples.dox $(ALL_EXAMPLES:.c=.dox)
406 @echo "INPUT += $^" > $@