examples.mk 16.4 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
##
2
##  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
##
4
##  Use of this source code is governed by a BSD-style license
5
6
##  that can be found in the LICENSE file in the root of the source
##  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.
John Koleszar's avatar
John Koleszar committed
9
10
##

11
12
LIBYUV_SRCS +=  third_party/libyuv/include/libyuv/basic_types.h  \
                third_party/libyuv/include/libyuv/cpu_id.h  \
Deb Mukherjee's avatar
Deb Mukherjee committed
13
14
                third_party/libyuv/include/libyuv/planar_functions.h  \
                third_party/libyuv/include/libyuv/row.h  \
15
                third_party/libyuv/include/libyuv/scale.h  \
Deb Mukherjee's avatar
Deb Mukherjee committed
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
                third_party/libyuv/include/libyuv/scale_row.h  \
                third_party/libyuv/source/cpu_id.cc \
                third_party/libyuv/source/planar_functions.cc \
                third_party/libyuv/source/row_any.cc \
                third_party/libyuv/source/row_common.cc \
                third_party/libyuv/source/row_mips.cc \
                third_party/libyuv/source/row_neon.cc \
                third_party/libyuv/source/row_posix.cc \
                third_party/libyuv/source/row_win.cc \
                third_party/libyuv/source/scale.cc  \
                third_party/libyuv/source/scale_common.cc \
                third_party/libyuv/source/scale_mips.cc \
                third_party/libyuv/source/scale_neon.cc \
                third_party/libyuv/source/scale_posix.cc \
                third_party/libyuv/source/scale_win.cc
John Koleszar's avatar
John Koleszar committed
31

32
33
34
35
36
37
38
39
40
41
LIBWEBM_MUXER_SRCS += third_party/libwebm/mkvmuxer.cpp \
                      third_party/libwebm/mkvmuxerutil.cpp \
                      third_party/libwebm/mkvwriter.cpp \
                      third_party/libwebm/mkvmuxer.hpp \
                      third_party/libwebm/mkvmuxertypes.hpp \
                      third_party/libwebm/mkvmuxerutil.hpp \
                      third_party/libwebm/mkvparser.hpp \
                      third_party/libwebm/mkvwriter.hpp \
                      third_party/libwebm/webmids.hpp

42
43
44
45
46
LIBWEBM_PARSER_SRCS = third_party/libwebm/mkvparser.cpp \
                      third_party/libwebm/mkvreader.cpp \
                      third_party/libwebm/mkvparser.hpp \
                      third_party/libwebm/mkvreader.hpp

47
48
# List of examples to build. UTILS are tools meant for distribution
# while EXAMPLES demonstrate specific portions of the API.
49
50
UTILS-$(CONFIG_DECODERS)    += vpxdec.c
vpxdec.SRCS                 += md5_utils.c md5_utils.h
51
52
vpxdec.SRCS                 += vpx_ports/mem_ops.h
vpxdec.SRCS                 += vpx_ports/mem_ops_aligned.h
53
54
vpxdec.SRCS                 += vpx_ports/vpx_timer.h
vpxdec.SRCS                 += vpx/vpx_integer.h
55
vpxdec.SRCS                 += args.c args.h
56
vpxdec.SRCS                 += ivfdec.c ivfdec.h
John Koleszar's avatar
John Koleszar committed
57
vpxdec.SRCS                 += tools_common.c tools_common.h
58
vpxdec.SRCS                 += y4menc.c y4menc.h
Deb Mukherjee's avatar
Deb Mukherjee committed
59
60
61
ifeq ($(CONFIG_LIBYUV),yes)
  vpxdec.SRCS                 += $(LIBYUV_SRCS)
endif
62
ifeq ($(CONFIG_WEBM_IO),yes)
63
64
  vpxdec.SRCS                 += $(LIBWEBM_PARSER_SRCS)
  vpxdec.SRCS                 += webmdec.cc webmdec.h
65
endif
66
67
68
vpxdec.GUID                  = BA5FE66F-38DD-E034-F542-B1578C5FB950
vpxdec.DESCRIPTION           = Full featured decoder
UTILS-$(CONFIG_ENCODERS)    += vpxenc.c
69
vpxenc.SRCS                 += args.c args.h y4minput.c y4minput.h vpxenc.h
70
71
vpxenc.SRCS                 += ivfdec.c ivfdec.h
vpxenc.SRCS                 += ivfenc.c ivfenc.h
72
vpxenc.SRCS                 += rate_hist.c rate_hist.h
John Koleszar's avatar
John Koleszar committed
73
vpxenc.SRCS                 += tools_common.c tools_common.h
74
vpxenc.SRCS                 += warnings.c warnings.h
75
vpxenc.SRCS                 += vpx_ports/mem_ops.h
76
vpxenc.SRCS                 += vpx_ports/mem_ops_aligned.h
Johann's avatar
Johann committed
77
vpxenc.SRCS                 += vpx_ports/vpx_timer.h
78
vpxenc.SRCS                 += vpxstats.c vpxstats.h
Deb Mukherjee's avatar
Deb Mukherjee committed
79
80
81
ifeq ($(CONFIG_LIBYUV),yes)
  vpxenc.SRCS                 += $(LIBYUV_SRCS)
endif
82
ifeq ($(CONFIG_WEBM_IO),yes)
83
84
  vpxenc.SRCS                 += $(LIBWEBM_MUXER_SRCS)
  vpxenc.SRCS                 += webmenc.cc webmenc.h
85
endif
86
87
vpxenc.GUID                  = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1
vpxenc.DESCRIPTION           = Full featured encoder
James Zern's avatar
James Zern committed
88
89
90
91
92
93
94
95
96
97
98
ifeq ($(CONFIG_SPATIAL_SVC),yes)
  EXAMPLES-$(CONFIG_VP9_ENCODER)      += vp9_spatial_svc_encoder.c
  vp9_spatial_svc_encoder.SRCS        += args.c args.h
  vp9_spatial_svc_encoder.SRCS        += ivfenc.c ivfenc.h
  vp9_spatial_svc_encoder.SRCS        += tools_common.c tools_common.h
  vp9_spatial_svc_encoder.SRCS        += video_common.h
  vp9_spatial_svc_encoder.SRCS        += video_writer.h video_writer.c
  vp9_spatial_svc_encoder.SRCS        += vpxstats.c vpxstats.h
  vp9_spatial_svc_encoder.GUID        = 4A38598D-627D-4505-9C7B-D4020C84100D
  vp9_spatial_svc_encoder.DESCRIPTION = VP9 Spatial SVC Encoder
endif
99

Deb Mukherjee's avatar
Deb Mukherjee committed
100
ifneq ($(CONFIG_SHARED),yes)
James Zern's avatar
James Zern committed
101
EXAMPLES-$(CONFIG_VP9_ENCODER)    += resize_util.c
102
103
endif

104
105
106
107
108
109
110
EXAMPLES-$(CONFIG_ENCODERS)          += vpx_temporal_svc_encoder.c
vpx_temporal_svc_encoder.SRCS        += ivfenc.c ivfenc.h
vpx_temporal_svc_encoder.SRCS        += tools_common.c tools_common.h
vpx_temporal_svc_encoder.SRCS        += video_common.h
vpx_temporal_svc_encoder.SRCS        += video_writer.h video_writer.c
vpx_temporal_svc_encoder.GUID        = B18C08F2-A439-4502-A78E-849BE3D60947
vpx_temporal_svc_encoder.DESCRIPTION = Temporal SVC Encoder
111
112
EXAMPLES-$(CONFIG_VP8_DECODER)     += simple_decoder.c
simple_decoder.GUID                 = D3BBF1E9-2427-450D-BBFF-B2843C1D44CC
113
114
simple_decoder.SRCS                += ivfdec.h ivfdec.c
simple_decoder.SRCS                += tools_common.h tools_common.c
115
116
simple_decoder.SRCS                += video_common.h
simple_decoder.SRCS                += video_reader.h video_reader.c
117
118
simple_decoder.SRCS                += vpx_ports/mem_ops.h
simple_decoder.SRCS                += vpx_ports/mem_ops_aligned.h
119
120
simple_decoder.DESCRIPTION          = Simplified decoder loop
EXAMPLES-$(CONFIG_VP8_DECODER)     += postproc.c
121
122
postproc.SRCS                      += ivfdec.h ivfdec.c
postproc.SRCS                      += tools_common.h tools_common.c
123
124
postproc.SRCS                      += video_common.h
postproc.SRCS                      += video_reader.h video_reader.c
125
126
postproc.SRCS                      += vpx_ports/mem_ops.h
postproc.SRCS                      += vpx_ports/mem_ops_aligned.h
127
128
129
postproc.GUID                       = 65E33355-F35E-4088-884D-3FD4905881D7
postproc.DESCRIPTION                = Decoder postprocessor control
EXAMPLES-$(CONFIG_VP8_DECODER)     += decode_to_md5.c
130
131
132
decode_to_md5.SRCS                 += md5_utils.h md5_utils.c
decode_to_md5.SRCS                 += ivfdec.h ivfdec.c
decode_to_md5.SRCS                 += tools_common.h tools_common.c
133
134
decode_to_md5.SRCS                 += video_common.h
decode_to_md5.SRCS                 += video_reader.h video_reader.c
135
136
decode_to_md5.SRCS                 += vpx_ports/mem_ops.h
decode_to_md5.SRCS                 += vpx_ports/mem_ops_aligned.h
137
138
139
decode_to_md5.GUID                  = 59120B9B-2735-4BFE-B022-146CA340FE42
decode_to_md5.DESCRIPTION           = Frame by frame MD5 checksum
EXAMPLES-$(CONFIG_VP8_ENCODER)  += simple_encoder.c
140
141
142
143
simple_encoder.SRCS             += ivfenc.h ivfenc.c
simple_encoder.SRCS             += tools_common.h tools_common.c
simple_encoder.SRCS             += video_common.h
simple_encoder.SRCS             += video_writer.h video_writer.c
John Koleszar's avatar
John Koleszar committed
144
145
simple_encoder.GUID              = 4607D299-8A71-4D2C-9B1D-071899B6FBFD
simple_encoder.DESCRIPTION       = Simplified encoder loop
146
EXAMPLES-$(CONFIG_VP8_ENCODER)  += twopass_encoder.c
147
148
149
150
twopass_encoder.SRCS            += ivfenc.h ivfenc.c
twopass_encoder.SRCS            += tools_common.h tools_common.c
twopass_encoder.SRCS            += video_common.h
twopass_encoder.SRCS            += video_writer.h video_writer.c
John Koleszar's avatar
John Koleszar committed
151
152
153
twopass_encoder.GUID             = 73494FA6-4AF9-4763-8FBB-265C92402FD8
twopass_encoder.DESCRIPTION      = Two-pass encoder loop
ifeq ($(CONFIG_DECODERS),yes)
154
155
156
EXAMPLES-$(CONFIG_VP8_ENCODER)  += decode_with_drops.c
decode_with_drops.SRCS          += ivfdec.h ivfdec.c
decode_with_drops.SRCS          += tools_common.h tools_common.c
157
158
decode_with_drops.SRCS          += video_common.h
decode_with_drops.SRCS          += video_reader.h video_reader.c
159
160
decode_with_drops.SRCS          += vpx_ports/mem_ops.h
decode_with_drops.SRCS          += vpx_ports/mem_ops_aligned.h
John Koleszar's avatar
John Koleszar committed
161
162
163
endif
decode_with_drops.GUID           = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D26
decode_with_drops.DESCRIPTION    = Drops frames while decoding
164
165
166
167
168
169
170
EXAMPLES-$(CONFIG_ENCODERS)        += set_maps.c
set_maps.SRCS                      += ivfenc.h ivfenc.c
set_maps.SRCS                      += tools_common.h tools_common.c
set_maps.SRCS                      += video_common.h
set_maps.SRCS                      += video_writer.h video_writer.c
set_maps.GUID                       = ECB2D24D-98B8-4015-A465-A4AF3DCC145F
set_maps.DESCRIPTION                = Set active and ROI maps
171
EXAMPLES-$(CONFIG_VP8_ENCODER)     += vp8cx_set_ref.c
172
173
174
175
vp8cx_set_ref.SRCS                 += ivfenc.h ivfenc.c
vp8cx_set_ref.SRCS                 += tools_common.h tools_common.c
vp8cx_set_ref.SRCS                 += video_common.h
vp8cx_set_ref.SRCS                 += video_writer.h video_writer.c
John Koleszar's avatar
John Koleszar committed
176
177
178
vp8cx_set_ref.GUID                  = C5E31F7F-96F6-48BD-BD3E-10EBF6E8057A
vp8cx_set_ref.DESCRIPTION           = VP8 set encoder reference frame

179
180

ifeq ($(CONFIG_MULTI_RES_ENCODING),yes)
Deb Mukherjee's avatar
Deb Mukherjee committed
181
ifeq ($(CONFIG_LIBYUV),yes)
182
183
EXAMPLES-$(CONFIG_VP8_ENCODER)          += vp8_multi_resolution_encoder.c
vp8_multi_resolution_encoder.SRCS       += tools_common.h tools_common.c
184
185
186
187
vp8_multi_resolution_encoder.SRCS       += $(LIBYUV_SRCS)
vp8_multi_resolution_encoder.GUID        = 04f8738e-63c8-423b-90fa-7c2703a374de
vp8_multi_resolution_encoder.DESCRIPTION = VP8 Multiple-resolution Encoding
endif
Deb Mukherjee's avatar
Deb Mukherjee committed
188
endif
John Koleszar's avatar
John Koleszar committed
189
190
191

# Handle extra library flags depending on codec configuration

192
193
194
195
# We should not link to math library (libm) on RVCT
# when building for bare-metal targets
ifeq ($(CONFIG_OS_SUPPORT), yes)
CODEC_EXTRA_LIBS-$(CONFIG_VP8)         += m
196
CODEC_EXTRA_LIBS-$(CONFIG_VP9)         += m
197
198
199
else
    ifeq ($(CONFIG_GCC), yes)
    CODEC_EXTRA_LIBS-$(CONFIG_VP8)         += m
200
    CODEC_EXTRA_LIBS-$(CONFIG_VP9)         += m
201
202
    endif
endif
John Koleszar's avatar
John Koleszar committed
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#
# End of specified files. The rest of the build rules should happen
# automagically from here.
#


# Examples need different flags based on whether we're building
# from an installed tree or a version controlled tree. Determine
# the proper paths.
ifeq ($(HAVE_ALT_TREE_LAYOUT),yes)
    LIB_PATH := $(SRC_PATH_BARE)/../lib
    INC_PATH := $(SRC_PATH_BARE)/../include
else
    LIB_PATH-yes                     += $(if $(BUILD_PFX),$(BUILD_PFX),.)
    INC_PATH-$(CONFIG_VP8_DECODER)   += $(SRC_PATH_BARE)/vp8
    INC_PATH-$(CONFIG_VP8_ENCODER)   += $(SRC_PATH_BARE)/vp8
219
220
    INC_PATH-$(CONFIG_VP9_DECODER)   += $(SRC_PATH_BARE)/vp9
    INC_PATH-$(CONFIG_VP9_ENCODER)   += $(SRC_PATH_BARE)/vp9
John Koleszar's avatar
John Koleszar committed
221
222
223
    LIB_PATH := $(call enabled,LIB_PATH)
    INC_PATH := $(call enabled,INC_PATH)
endif
224
225
INTERNAL_CFLAGS = $(addprefix -I,$(INC_PATH))
INTERNAL_LDFLAGS += $(addprefix -L,$(LIB_PATH))
John Koleszar's avatar
John Koleszar committed
226
227
228
229


# Expand list of selected examples to build (as specified above)
UTILS           = $(call enabled,UTILS)
230
231
EXAMPLES        = $(addprefix examples/,$(call enabled,EXAMPLES))
ALL_EXAMPLES    = $(UTILS) $(EXAMPLES)
232
UTIL_SRCS       = $(foreach ex,$(UTILS),$($(ex:.c=).SRCS))
233
ALL_SRCS        = $(foreach ex,$(ALL_EXAMPLES),$($(notdir $(ex:.c=)).SRCS))
John Koleszar's avatar
John Koleszar committed
234
235
236
237
CODEC_EXTRA_LIBS=$(sort $(call enabled,CODEC_EXTRA_LIBS))


# Expand all example sources into a variable containing all sources
238
# for that example (not just them main one specified in UTILS/EXAMPLES)
John Koleszar's avatar
John Koleszar committed
239
# and add this file to the list (for MSVS workspace generation)
240
$(foreach ex,$(ALL_EXAMPLES),$(eval $(notdir $(ex:.c=)).SRCS += $(ex) examples.mk))
John Koleszar's avatar
John Koleszar committed
241
242
243
244
245
246
247
248
249
250
251
252
253


# If this is a universal (fat) binary, then all the subarchitectures have
# already been built and our job is to stitch them together. The
# BUILD_OBJS variable indicates whether we should be building
# (compiling, linking) the library. The LIPO_OBJS variable indicates
# that we're stitching.
$(eval $(if $(filter universal%,$(TOOLCHAIN)),LIPO_OBJS,BUILD_OBJS):=yes)


# Create build/install dependencies for all examples. The common case
# is handled here. The MSVS case is handled below.
NOT_MSVS = $(if $(CONFIG_MSVS),,yes)
KO Myung-Hun's avatar
KO Myung-Hun committed
254
255
DIST-BINS-$(NOT_MSVS)      += $(addprefix bin/,$(ALL_EXAMPLES:.c=$(EXE_SFX)))
INSTALL-BINS-$(NOT_MSVS)   += $(addprefix bin/,$(UTILS:.c=$(EXE_SFX)))
256
257
DIST-SRCS-yes              += $(ALL_SRCS)
INSTALL-SRCS-yes           += $(UTIL_SRCS)
John Koleszar's avatar
John Koleszar committed
258
OBJS-$(NOT_MSVS)           += $(if $(BUILD_OBJS),$(call objs,$(ALL_SRCS)))
KO Myung-Hun's avatar
KO Myung-Hun committed
259
BINS-$(NOT_MSVS)           += $(addprefix $(BUILD_PFX),$(ALL_EXAMPLES:.c=$(EXE_SFX)))
John Koleszar's avatar
John Koleszar committed
260
261
262
263


# Instantiate linker template for all examples.
CODEC_LIB=$(if $(CONFIG_DEBUG_LIBS),vpx_g,vpx)
jimbankoski's avatar
jimbankoski committed
264
265
SHARED_LIB_SUF=$(if $(filter darwin%,$(TGT_OS)),.dylib,.so)
CODEC_LIB_SUF=$(if $(CONFIG_SHARED),$(SHARED_LIB_SUF),.a)
John Koleszar's avatar
John Koleszar committed
266
$(foreach bin,$(BINS-yes),\
267
268
    $(if $(BUILD_OBJS),$(eval $(bin):\
        $(LIB_PATH)/lib$(CODEC_LIB)$(CODEC_LIB_SUF)))\
John Koleszar's avatar
John Koleszar committed
269
    $(if $(BUILD_OBJS),$(eval $(call linker_template,$(bin),\
KO Myung-Hun's avatar
KO Myung-Hun committed
270
        $(call objs,$($(notdir $(bin:$(EXE_SFX)=)).SRCS)) \
John Koleszar's avatar
John Koleszar committed
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
        -l$(CODEC_LIB) $(addprefix -l,$(CODEC_EXTRA_LIBS))\
        )))\
    $(if $(LIPO_OBJS),$(eval $(call lipo_bin_template,$(bin))))\
    )


# The following pairs define a mapping of locations in the distribution
# tree to locations in the source/build trees.
INSTALL_MAPS += src/%.c   %.c
INSTALL_MAPS += src/%     $(SRC_PATH_BARE)/%
INSTALL_MAPS += bin/%     %
INSTALL_MAPS += %         %


# Set up additional MSVS environment
ifeq ($(CONFIG_MSVS),yes)
Jim Bankoski's avatar
Jim Bankoski committed
287
CODEC_LIB=$(if $(CONFIG_SHARED),vpx,$(if $(CONFIG_STATIC_MSVCRT),vpxmt,vpxmd))
John Koleszar's avatar
John Koleszar committed
288
289
290
291
292
293
294
295
296
297
298
299
300
301
# This variable uses deferred expansion intentionally, since the results of
# $(wildcard) may change during the course of the Make.
VS_PLATFORMS = $(foreach d,$(wildcard */Release/$(CODEC_LIB).lib),$(word 1,$(subst /, ,$(d))))
INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),bin/$(p)/%  $(p)/Release/%)
endif

# Build Visual Studio Projects. We use a template here to instantiate
# explicit rules rather than using an implicit rule because we want to
# leverage make's VPATH searching rather than specifying the paths on
# each file in ALL_EXAMPLES. This has the unfortunate side effect that
# touching the source files trigger a rebuild of the project files
# even though there is no real dependency there (the dependency is on
# the makefiles). We may want to revisit this.
define vcproj_template
302
$(1): $($(1:.$(VCPROJ_SFX)=).SRCS) vpx.$(VCPROJ_SFX)
John Koleszar's avatar
John Koleszar committed
303
	@echo "    [vcproj] $$@"
304
	$$(GEN_VCPROJ)\
John Koleszar's avatar
John Koleszar committed
305
306
            --exe\
            --target=$$(TOOLCHAIN)\
307
            --name=$$(@:.$(VCPROJ_SFX)=)\
John Koleszar's avatar
John Koleszar committed
308
            --ver=$$(CONFIG_VS_VERSION)\
309
            --proj-guid=$$($$(@:.$(VCPROJ_SFX)=).GUID)\
310
            --src-path-bare="$(SRC_PATH_BARE)" \
John Koleszar's avatar
John Koleszar committed
311
            $$(if $$(CONFIG_STATIC_MSVCRT),--static-crt) \
312
            --out=$$@ $$(INTERNAL_CFLAGS) $$(CFLAGS) \
Martin Storsjo's avatar
Martin Storsjo committed
313
            $$(INTERNAL_LDFLAGS) $$(LDFLAGS) -l$$(CODEC_LIB) $$^
John Koleszar's avatar
John Koleszar committed
314
endef
315
316
ALL_EXAMPLES_BASENAME := $(notdir $(ALL_EXAMPLES))
PROJECTS-$(CONFIG_MSVS) += $(ALL_EXAMPLES_BASENAME:.c=.$(VCPROJ_SFX))
John Koleszar's avatar
John Koleszar committed
317
INSTALL-BINS-$(CONFIG_MSVS) += $(foreach p,$(VS_PLATFORMS),\
318
                               $(addprefix bin/$(p)/,$(ALL_EXAMPLES_BASENAME:.c=.exe)))
John Koleszar's avatar
John Koleszar committed
319
320
$(foreach proj,$(call enabled,PROJECTS),\
    $(eval $(call vcproj_template,$(proj))))
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353

#
# Documentation Rules
#
%.dox: %.c
	@echo "    [DOXY] $@"
	@echo "/*!\page example_$(@F:.dox=) $(@F:.dox=)" > $@
	@echo "   \includelineno $(<F)" >> $@
	@echo "*/" >> $@

samples.dox: examples.mk
	@echo "    [DOXY] $@"
	@echo "/*!\page samples Sample Code" > $@
	@echo "    This SDK includes a number of sample applications."\
	      "Each sample documents a feature of the SDK in both prose"\
	      "and the associated C code."\
	      "The following samples are included: ">>$@
	@$(foreach ex,$(sort $(notdir $(EXAMPLES:.c=))),\
	   echo "     - \subpage example_$(ex) $($(ex).DESCRIPTION)" >> $@;)
	@echo >> $@
	@echo "    In addition, the SDK contains a number of utilities."\
              "Since these utilities are built upon the concepts described"\
              "in the sample code listed above, they are not documented in"\
              "pieces like the samples are. Their source is included here"\
              "for reference. The following utilities are included:" >> $@
	@$(foreach ex,$(sort $(UTILS:.c=)),\
	   echo "     - \subpage example_$(ex) $($(ex).DESCRIPTION)" >> $@;)
	@echo "*/" >> $@

CLEAN-OBJS += examples.doxy samples.dox $(ALL_EXAMPLES:.c=.dox)
DOCS-yes += examples.doxy samples.dox
examples.doxy: samples.dox $(ALL_EXAMPLES:.c=.dox)
	@echo "INPUT += $^" > $@