1###
2# Media build rules - Auto-generates media contents/indexes and *.h xml's
3#
4
5SHELL=/bin/bash
6
7MEDIA_OBJ_DIR=$(objtree)/Documentation/DocBook/
8MEDIA_SRC_DIR=$(srctree)/Documentation/DocBook/media
9
10MEDIA_TEMP =  media-entities.tmpl \
11	      media-indices.tmpl \
12	      videodev2.h.xml \
13	      v4l2.xml \
14	      audio.h.xml \
15	      ca.h.xml \
16	      dmx.h.xml \
17	      frontend.h.xml \
18	      net.h.xml \
19	      video.h.xml \
20
21IMGFILES := $(patsubst %.b64,%, $(notdir $(shell ls $(MEDIA_SRC_DIR)/*.b64)))
22OBJIMGFILES := $(addprefix $(MEDIA_OBJ_DIR)/, $(IMGFILES))
23GENFILES := $(addprefix $(MEDIA_OBJ_DIR)/, $(MEDIA_TEMP))
24
25PHONY += cleanmediadocs
26
27cleanmediadocs:
28	-@rm -f `find $(MEDIA_OBJ_DIR) -type l` $(GENFILES) $(OBJIMGFILES) 2>/dev/null
29
30$(obj)/media_api.xml: $(GENFILES) FORCE
31
32#$(MEDIA_OBJ_DIR)/media_api.html: $(MEDIA_OBJ_DIR)/media_api.xml
33#$(MEDIA_OBJ_DIR)/media_api.pdf: $(MEDIA_OBJ_DIR)/media_api.xml
34#$(MEDIA_OBJ_DIR)/media_api.ps: $(MEDIA_OBJ_DIR)/media_api.xml
35
36V4L_SGMLS = \
37	$(shell ls $(MEDIA_SRC_DIR)/v4l/*.xml|perl -ne 'print "$$1 " if (m,.*/(.*)\n,)') \
38	capture.c.xml \
39	keytable.c.xml \
40	v4l2grab.c.xml
41
42DVB_SGMLS = \
43	$(shell ls $(MEDIA_SRC_DIR)/dvb/*.xml|perl -ne 'print "$$1 " if (m,.*/(.*)\n,)')
44
45MEDIA_SGMLS =  $(addprefix ./,$(V4L_SGMLS)) $(addprefix ./,$(DVB_SGMLS)) $(addprefix ./,$(MEDIA_TEMP))
46
47FUNCS = \
48	close \
49	ioctl \
50	mmap \
51	munmap \
52	open \
53	poll \
54	read \
55	select \
56	write \
57
58IOCTLS = \
59	$(shell perl -ne 'print "$$1 " if /\#define\s+([^\s]+)\s+_IO/' $(srctree)/include/uapi/linux/videodev2.h) \
60	$(shell perl -ne 'print "$$1 " if /\#define\s+([^\s]+)\s+_IO/' $(srctree)/include/uapi/linux/dvb/audio.h) \
61	$(shell perl -ne 'print "$$1 " if /\#define\s+([^\s]+)\s+_IO/' $(srctree)/include/uapi/linux/dvb/ca.h) \
62	$(shell perl -ne 'print "$$1 " if /\#define\s+([^\s]+)\s+_IO/' $(srctree)/include/uapi/linux/dvb/dmx.h) \
63	$(shell perl -ne 'print "$$1 " if /\#define\s+([^\s]+)\s+_IO/' $(srctree)/include/uapi/linux/dvb/frontend.h) \
64	$(shell perl -ne 'print "$$1 " if /\#define\s+([A-Z][^\s]+)\s+_IO/' $(srctree)/include/uapi/linux/dvb/net.h) \
65	$(shell perl -ne 'print "$$1 " if /\#define\s+([^\s]+)\s+_IO/' $(srctree)/include/uapi/linux/dvb/video.h) \
66	$(shell perl -ne 'print "$$1 " if /\#define\s+([^\s]+)\s+_IO/' $(srctree)/include/uapi/linux/media.h) \
67	$(shell perl -ne 'print "$$1 " if /\#define\s+([^\s]+)\s+_IO/' $(srctree)/include/uapi/linux/v4l2-subdev.h) \
68	VIDIOC_SUBDEV_G_FRAME_INTERVAL \
69	VIDIOC_SUBDEV_S_FRAME_INTERVAL \
70	VIDIOC_SUBDEV_ENUM_MBUS_CODE \
71	VIDIOC_SUBDEV_ENUM_FRAME_SIZE \
72	VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL \
73	VIDIOC_SUBDEV_G_SELECTION \
74	VIDIOC_SUBDEV_S_SELECTION \
75
76TYPES = \
77	$(shell perl -ne 'print "$$1 " if /^typedef\s+[^\s]+\s+([^\s]+)\;/' $(srctree)/include/uapi/linux/videodev2.h) \
78	$(shell perl -ne 'print "$$1 " if /^}\s+([a-z0-9_]+_t)/' $(srctree)/include/uapi/linux/dvb/frontend.h)
79
80ENUMS = \
81	$(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/videodev2.h) \
82	$(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/dvb/audio.h) \
83	$(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/dvb/ca.h) \
84	$(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/dvb/dmx.h) \
85	$(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/dvb/frontend.h) \
86	$(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/dvb/net.h) \
87	$(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/dvb/video.h) \
88	$(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/media.h) \
89	$(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/v4l2-mediabus.h) \
90	$(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/v4l2-subdev.h)
91
92STRUCTS = \
93	$(shell perl -ne 'print "$$1 " if /^struct\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/videodev2.h) \
94	$(shell perl -ne 'print "$$1 " if (/^struct\s+([^\s\{]+)\s*/)' $(srctree)/include/uapi/linux/dvb/audio.h) \
95	$(shell perl -ne 'print "$$1 " if (/^struct\s+([^\s]+)\s+/)' $(srctree)/include/uapi/linux/dvb/ca.h) \
96	$(shell perl -ne 'print "$$1 " if (/^struct\s+([^\s]+)\s+/)' $(srctree)/include/uapi/linux/dvb/dmx.h) \
97	$(shell perl -ne 'print "$$1 " if (!/dtv\_cmds\_h/ && /^struct\s+([^\s]+)\s+/)' $(srctree)/include/uapi/linux/dvb/frontend.h) \
98	$(shell perl -ne 'print "$$1 " if (/^struct\s+([A-Z][^\s]+)\s+/)' $(srctree)/include/uapi/linux/dvb/net.h) \
99	$(shell perl -ne 'print "$$1 " if (/^struct\s+([^\s]+)\s+/)' $(srctree)/include/uapi/linux/dvb/video.h) \
100	$(shell perl -ne 'print "$$1 " if /^struct\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/media.h) \
101	$(shell perl -ne 'print "$$1 " if /^struct\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/v4l2-subdev.h) \
102	$(shell perl -ne 'print "$$1 " if /^struct\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/v4l2-mediabus.h)
103
104ERRORS = \
105	E2BIG \
106	EACCES \
107	EAGAIN \
108	EBADF \
109	EBADFD \
110	EBADR \
111	EBADRQC \
112	EBUSY \
113	ECHILD \
114	ECONNRESET \
115	EDEADLK \
116	EDOM \
117	EEXIST \
118	EFAULT \
119	EFBIG \
120	EILSEQ \
121	EINIT \
122	EINPROGRESS \
123	EINTR \
124	EINVAL \
125	EIO \
126	EMFILE \
127	ENFILE \
128	ENOBUFS \
129	ENODATA \
130	ENODEV \
131	ENOENT \
132	ENOIOCTLCMD \
133	ENOMEM \
134	ENOSPC \
135	ENOSR \
136	ENOSYS \
137	ENOTSUP \
138	ENOTSUPP \
139	ENOTTY \
140	ENXIO \
141	EOPNOTSUPP \
142	EOVERFLOW \
143	EPERM \
144	EPIPE \
145	EPROTO \
146	ERANGE \
147	EREMOTE \
148	EREMOTEIO \
149	ERESTART \
150	ERESTARTSYS \
151	ESHUTDOWN \
152	ESPIPE \
153	ETIME \
154	ETIMEDOUT \
155	EUSERS \
156	EWOULDBLOCK \
157	EXDEV \
158
159ESCAPE = \
160	-e "s/&/\\&/g" \
161	-e "s/</\\&lt;/g" \
162	-e "s/>/\\&gt;/g"
163
164FILENAME = \
165	-e s,"^[^\/]*/",, \
166	-e s/"\\.xml"// \
167	-e s/"\\.tmpl"// \
168	-e s/\\\./-/g \
169	-e s/"^func-"// \
170	-e s/"^pixfmt-"// \
171	-e s/"^vidioc-"//
172
173# Generate references to these structs in videodev2.h.xml.
174DOCUMENTED = \
175	-e "s/\(enum *\)v4l2_mpeg_cx2341x_video_\([a-z]*_spatial_filter_type\)/\1<link linkend=\"\2\">v4l2_mpeg_cx2341x_video_\2<\/link>/g" \
176	-e "s/\(\(enum\|struct\) *\)\(v4l2_[a-zA-Z0-9_]*\)/\1<link linkend=\"\3\">\3<\/link>/g" \
177	-e "s/\(V4L2_PIX_FMT_[A-Z0-9_]\+\)\(\s\+v4l2_fourcc\)/<link linkend=\"\1\">\1<\/link>\2/g" \
178	-e ":a;s/\(linkend=\".*\)_\(.*\">\)/\1-\2/;ta" \
179	-e "s/v4l2\-mpeg\-vbi\-ITV0/v4l2-mpeg-vbi-itv0-1/g"
180
181DVB_DOCUMENTED = \
182	-e "s/\(linkend\=\"\)FE_SET_PROPERTY/\1FE_GET_PROPERTY/g" \
183	-e "s,\(struct\s\+\)\([a-z0-9_]\+\)\(\s\+{\),\1\<link linkend=\"\2\">\2\<\/link\>\3,g" \
184	-e "s,\(}\s\+\)\([a-z0-9_]\+_t\+\),\1\<link linkend=\"\2\">\2\<\/link\>,g" \
185	-e "s,\(define\s\+\)\(DTV_[A-Z0-9_]\+\)\(\s\+[0-9]\+\),\1\<link linkend=\"\2\">\2\<\/link\>\3,g" \
186	-e "s,<link\s\+linkend=\".*\">\(DTV_IOCTL_MAX_MSGS\|dtv_cmds_h\|__.*_old\)<\/link>,\1,g" \
187	-e ":a;s/\(linkend=\".*\)_\(.*\">\)/\1-\2/;ta" \
188	-e "s,\(audio-mixer\|audio-karaoke\|audio-status\|ca-slot-info\|ca-descr-info\|ca-caps\|ca-msg\|ca-descr\|ca-pid\|dmx-filter\|dmx-caps\|video-system\|video-highlight\|video-spu\|video-spu-palette\|video-navi-pack\)-t,\1,g" \
189	-e "s,DTV-ISDBT-LAYER[A-C],DTV-ISDBT-LAYER,g" \
190	-e "s,\(define\s\+\)\([A-Z0-9_]\+\)\(\s\+_IO\),\1\<link linkend=\"\2\">\2\<\/link\>\3,g" \
191	-e "s,<link\s\+linkend=\".*\">\(__.*_OLD\)<\/link>,\1,g" \
192
193#
194# Media targets and dependencies
195#
196
197install_media_images = \
198	$(Q)-cp $(OBJIMGFILES) $(MEDIA_SRC_DIR)/v4l/*.svg $(MEDIA_OBJ_DIR)/media_api
199
200$(MEDIA_OBJ_DIR)/%: $(MEDIA_SRC_DIR)/%.b64
201	$(Q)base64 -d $< >$@
202
203$(MEDIA_OBJ_DIR)/v4l2.xml: $(OBJIMGFILES)
204	@$($(quiet)gen_xml)
205	@(ln -sf `cd $(MEDIA_SRC_DIR) && /bin/pwd`/v4l/*xml $(MEDIA_OBJ_DIR)/)
206	@(ln -sf `cd $(MEDIA_SRC_DIR) && /bin/pwd`/dvb/*xml $(MEDIA_OBJ_DIR)/)
207
208$(MEDIA_OBJ_DIR)/videodev2.h.xml: $(srctree)/include/uapi/linux/videodev2.h $(MEDIA_OBJ_DIR)/v4l2.xml
209	@$($(quiet)gen_xml)
210	@(					\
211	echo "<programlisting>") > $@
212	@(					\
213	expand --tabs=8 < $< |			\
214	  sed $(ESCAPE) $(DOCUMENTED) |		\
215	  sed 's/i\.e\./&ie;/') >> $@
216	@(					\
217	echo "</programlisting>") >> $@
218
219$(MEDIA_OBJ_DIR)/audio.h.xml: $(srctree)/include/uapi/linux/dvb/audio.h $(MEDIA_OBJ_DIR)/v4l2.xml
220	@$($(quiet)gen_xml)
221	@(					\
222	echo "<programlisting>") > $@
223	@(					\
224	expand --tabs=8 < $< |			\
225	  sed $(ESCAPE) $(DVB_DOCUMENTED) |	\
226	  sed 's/i\.e\./&ie;/') >> $@
227	@(					\
228	echo "</programlisting>") >> $@
229
230$(MEDIA_OBJ_DIR)/ca.h.xml: $(srctree)/include/uapi/linux/dvb/ca.h $(MEDIA_OBJ_DIR)/v4l2.xml
231	@$($(quiet)gen_xml)
232	@(					\
233	echo "<programlisting>") > $@
234	@(					\
235	expand --tabs=8 < $< |			\
236	  sed $(ESCAPE) $(DVB_DOCUMENTED) |	\
237	  sed 's/i\.e\./&ie;/') >> $@
238	@(					\
239	echo "</programlisting>") >> $@
240
241$(MEDIA_OBJ_DIR)/dmx.h.xml: $(srctree)/include/uapi/linux/dvb/dmx.h $(MEDIA_OBJ_DIR)/v4l2.xml
242	@$($(quiet)gen_xml)
243	@(					\
244	echo "<programlisting>") > $@
245	@(					\
246	expand --tabs=8 < $< |			\
247	  sed $(ESCAPE) $(DVB_DOCUMENTED) |	\
248	  sed 's/i\.e\./&ie;/') >> $@
249	@(					\
250	echo "</programlisting>") >> $@
251
252$(MEDIA_OBJ_DIR)/frontend.h.xml: $(srctree)/include/uapi/linux/dvb/frontend.h $(MEDIA_OBJ_DIR)/v4l2.xml
253	@$($(quiet)gen_xml)
254	@(					\
255	echo "<programlisting>") > $@
256	@(					\
257	expand --tabs=8 < $< |			\
258	  sed $(ESCAPE) $(DVB_DOCUMENTED) |	\
259	  sed 's/i\.e\./&ie;/') >> $@
260	@(					\
261	echo "</programlisting>") >> $@
262
263$(MEDIA_OBJ_DIR)/net.h.xml: $(srctree)/include/uapi/linux/dvb/net.h $(MEDIA_OBJ_DIR)/v4l2.xml
264	@$($(quiet)gen_xml)
265	@(					\
266	echo "<programlisting>") > $@
267	@(					\
268	expand --tabs=8 < $< |			\
269	  sed $(ESCAPE) $(DVB_DOCUMENTED) |	\
270	  sed 's/i\.e\./&ie;/') >> $@
271	@(					\
272	echo "</programlisting>") >> $@
273
274$(MEDIA_OBJ_DIR)/video.h.xml: $(srctree)/include/uapi/linux/dvb/video.h $(MEDIA_OBJ_DIR)/v4l2.xml
275	@$($(quiet)gen_xml)
276	@(					\
277	echo "<programlisting>") > $@
278	@(					\
279	expand --tabs=8 < $< |			\
280	  sed $(ESCAPE) $(DVB_DOCUMENTED) |	\
281	  sed 's/i\.e\./&ie;/') >> $@
282	@(					\
283	echo "</programlisting>") >> $@
284
285$(MEDIA_OBJ_DIR)/media-entities.tmpl: $(MEDIA_OBJ_DIR)/v4l2.xml
286	@$($(quiet)gen_xml)
287	@(								\
288	echo "<!-- Generated file! Do not edit. -->") >$@
289	@(								\
290	echo -e "\n<!-- Functions -->") >>$@
291	@(								\
292	for ident in $(FUNCS) ; do					\
293	  entity=`echo $$ident | tr _ -` ;				\
294	  echo "<!ENTITY func-$$entity \"<link"				\
295	    "linkend='func-$$entity'><function>$$ident()</function></link>\">" \
296	  >>$@ ;							\
297	done)
298	@(								\
299	echo -e "\n<!-- Ioctls -->") >>$@
300	@(								\
301	for ident in $(IOCTLS) ; do					\
302	  entity=`echo $$ident | tr _ -` ;				\
303	  id=`grep "<refname>$$ident" $(MEDIA_OBJ_DIR)/vidioc-*.xml $(MEDIA_OBJ_DIR)/media-ioc-*.xml | sed -r s,"^.*/(.*).xml.*","\1",` ; \
304	  echo "<!ENTITY $$entity \"<link"				\
305	    "linkend='$$id'><constant>$$ident</constant></link>\">"	\
306	  >>$@ ;							\
307	done)
308	@(								\
309	echo -e "\n<!-- Types -->") >>$@
310	@(								\
311	for ident in $(TYPES) ; do					\
312	  entity=`echo $$ident | tr _ -` ;				\
313	  echo "<!ENTITY $$entity \"<link"				\
314	    "linkend='$$entity'>$$ident</link>\">" >>$@ ;		\
315	done)
316	@(								\
317	echo -e "\n<!-- Enums -->") >>$@
318	@(								\
319	for ident in $(ENUMS) ; do					\
320	  entity=`echo $$ident | sed -e "s/v4l2_mpeg_cx2341x_video_\([a-z]*_spatial_filter_type\)/\1/" | tr _ -` ; \
321	  echo "<!ENTITY $$entity \"enum&nbsp;<link"			\
322	    "linkend='$$entity'>$$ident</link>\">" >>$@ ;		\
323	done)
324	@(								\
325	echo -e "\n<!-- Structures -->") >>$@
326	@(								\
327	for ident in $(STRUCTS) ; do					\
328	  entity=`echo $$ident | tr _ - | sed s/v4l2-mpeg-vbi-ITV0/v4l2-mpeg-vbi-itv0-1/g` ; \
329	  echo "<!ENTITY $$entity \"struct&nbsp;<link"			\
330	    "linkend='$$entity'>$$ident</link>\">" >>$@ ;		\
331	done)
332	@(								\
333	echo -e "\n<!-- Error Codes -->") >>$@
334	@(								\
335	for ident in $(ERRORS) ; do					\
336	  echo "<!ENTITY $$ident \"<errorcode>$$ident</errorcode>"	\
337	    "error code\">" >>$@ ;					\
338	done)
339	@(								\
340	echo -e "\n<!-- Subsections -->") >>$@
341	@(								\
342	for file in $(MEDIA_SGMLS) ; do					\
343	  entity=`echo "$$file" | sed $(FILENAME) -e s/"^([^-]*)"/sub\1/` ; \
344	  if ! echo "$$file" |						\
345	    grep -q -E -e '^(func|vidioc|pixfmt)-' ; then		\
346	    echo "<!ENTITY sub-$$entity SYSTEM \"$$file\">" >>$@ ;	\
347	  fi ;								\
348	done)
349	@(								\
350	echo -e "\n<!-- Function Reference -->") >>$@
351	@(								\
352	for file in $(MEDIA_SGMLS) ; do					\
353	  if echo "$$file" |						\
354	    grep -q -E -e '(func|vidioc|pixfmt)-' ; then		\
355	    entity=`echo "$$file" |sed $(FILENAME)` ;			\
356	    echo "<!ENTITY $$entity SYSTEM \"$$file\">" >>$@ ;	\
357	  fi ;								\
358	done)
359
360# Jade can auto-generate a list-of-tables, which includes all structs,
361# but we only want data types, all types, and sorted please.
362$(MEDIA_OBJ_DIR)/media-indices.tmpl: $(MEDIA_OBJ_DIR)/v4l2.xml
363	@$($(quiet)gen_xml)
364	@(								\
365	echo "<!-- Generated file! Do not edit. -->") >$@
366	@(								\
367	echo -e "\n<index><title>List of Types</title>") >>$@
368	@(								\
369	for ident in $(TYPES) ; do					\
370	  id=`echo $$ident | tr _ -` ;					\
371	  echo "<indexentry><primaryie><link"				\
372	    "linkend='$$id'>$$ident</link></primaryie></indexentry>" >>$@ ; \
373	done)
374	@(								\
375	for ident in $(ENUMS) ; do					\
376	  id=`echo $$ident | sed -e "s/v4l2_mpeg_cx2341x_video_\([a-z]*_spatial_filter_type\)/\1/" | tr _ -`; \
377	  echo "<indexentry><primaryie>enum&nbsp;<link"			\
378	    "linkend='$$id'>$$ident</link></primaryie></indexentry>" >>$@ ; \
379	done)
380	@(								\
381	for ident in $(STRUCTS) ; do					\
382	  id=`echo $$ident | tr _ - | sed s/v4l2-mpeg-vbi-ITV0/v4l2-mpeg-vbi-itv0-1/g` ; \
383	  echo "<indexentry><primaryie>struct&nbsp;<link"		\
384	    "linkend='$$id'>$$ident</link></primaryie></indexentry>" >>$@ ; \
385	done)
386	@(								\
387	echo "</index>") >>$@
388
389