1
1
PROTO_PATH := /usr/share/xcb
2
2
3
+ ifeq ($(shell ! test -d $(PROTO_PATH ) && echo ok) ,ok)
4
+ $(warning Please set `PROTO_PATH` to the path to the XCB protocol definitions) :
5
+ $(warning make $(MFLAGS) $(MAKEOVERRIDES) $(MAKECMDGOALS) `PROTO_PATH=/opt/X11/...`)
6
+ $(error Could not find directory `$(PROTO_PATH)`)
7
+ endif
8
+
3
9
EXTENSIONS := bigreq composite damage dbe dpms dri2 dri3 ge glx present randr \
4
10
record render res screensaver shape shm sync xc_misc xevie xf86dri \
5
11
xf86vidmode xfixes xinerama xinput xkb xprint xselinux xtest xvmc xv
@@ -13,59 +19,64 @@ ELS = $(ELLS) $(ELGS)
13
19
ELCS = $(ELS:.el=.elc ) xelb-gen.elc
14
20
15
21
.PHONY : all
16
- all : $( ELCS )
22
+ all : compile generate
17
23
18
24
xcb-% .el : $(PROTO_PATH ) /% .xml
19
- @echo -n " \n " Generating $@ ...
25
+ @printf ' %s\n ' ' Generating $@...'
20
26
@./xelb-gen $< > $@
21
27
22
- # Dependencies needed for generating.
23
- $(ELXS ) : xcb-xproto.el
24
- xcb-composite.el : xcb-xfixes.el
25
- xcb-cursor.el : xcb-render.el
26
- xcb-damage.el : xcb-xfixes.el
27
- xcb-present.el : xcb-randr.el xcb-xfixes.el xcb-sync.el
28
- xcb-randr.el : xcb-render.el
29
- xcb-xfixes.el : xcb-render.el xcb-shape.el
30
- xcb-xinput.el : xcb-xfixes.el
31
- xcb-xv.el : xcb-shm.el
32
- xcb-xvmc.el : xcb-xv.el
33
-
34
- # Generate an intermediate .el file from the xelb-gen script so that
35
- # byte-compiling rules below apply. This file will be deleted after the .elc is
36
- # created.
28
+ # Generate an intermediate `.el` file from the xelb-gen script so that
29
+ # byte-compiling rules below apply. This file will be deleted after the `.elc`
30
+ # is created.
37
31
.INTERMEDIATE : xelb-gen.el
38
32
xelb-gen.el : xelb-gen
39
33
cp $< $@
40
34
35
+ # Dependencies needed for generating.
36
+ # We generate makefile fragments by grepping the `<import>`s in the `.xml`
37
+ # protocol definitions.
38
+ # See https://www.gnu.org/software/make/manual/html_node/Automatic-Prerequisites.html .
39
+ ELGDS=$(ELGS:.el =.el.d)
40
+ $(ELGDS ) : xcb-% .el.d: $(PROTO_PATH ) /% .xml
41
+ @printf " Inferring dependencies for $<\n"
42
+ @{ IMPORTS=$$(grep '<import>' $< | sed -E -e 's,^[[:space:]]*<import>([^<]+ ) < /import> ,xcb-\1 ,' | tr ' \n ' ' ' ); \
43
+ test -n " $$ IMPORTS" && printf ' %s' ' xcb-$*.el:' && printf ' %s.el' $$ IMPORTS && printf ' \n' ; \
44
+ test -n " $$ IMPORTS" && printf ' %s' ' xcb-$*.elc:' && printf ' %s.elc' $$ IMPORTS && printf ' \n' ; \
45
+ true ; \
46
+ } > $@
47
+ # All generated `.el` files require `xcb-types.el`.
48
+ $(ELGS ) : xcb-types.el
49
+ $(ELGS:.el =.elc): xcb-types.elc
50
+
41
51
# Dependencies needed for byte-compiling.
42
- xcb-cursor.elc : xcb-render.elc xcb.elc
43
- xcb-ewmh.elc : xcb.elc xcb-icccm.elc xcb.elc
44
- xcb-icccm.elc : xcb.elc
45
- xcb-keysyms.elc : xcb.elc xcb-xkb.elc
46
- xcb-renderutil.elc : xcb.elc xcb-render.elc
47
- xcb-systemtray.elc : xcb-ewmh.elc xcb.elc
48
- xcb-types.elc : xcb-debug.elc
49
- xcb-xembed.elc : xcb-icccm.elc
50
- xcb-xim.elc : xcb-types.elc xcb-xlib.elc
51
- xcb-xsettings.elc : xcb-icccm.elc xcb-types.elc
52
- xcb.elc : xcb-xproto.elc xcb-xkb.elc
53
- xelb.elc : xcb.elc
54
- $(ELXS:.el =.elc): xcb-xproto.elc xcb-types.elc
55
- xcb-composite.elc : xcb-xfixes.elc
56
- xcb-damage.elc : xcb-xfixes.elc
57
- xcb-present.elc : xcb-randr.elc xcb-xfixes.elc xcb-sync.elc
58
- xcb-randr.elc : xcb-render.elc
59
- xcb-xfixes.elc : xcb-render.elc xcb-shape.elc
60
- xcb-xinput.elc : xcb-xfixes.elc
61
- xcb-xv.elc : xcb-shm.elc
62
- xcb-xvmc.elc : xcb-xv.elc
63
- xelb-gen.elc : xcb-types.elc
52
+ # We grep the `require`s in non-generated `.el` files.
53
+ ELLDS=$(ELLS:.el =.el.d)
54
+ $(ELLDS ) : % .el.d: % .el
55
+ @printf " Inferring dependencies for $<\n"
56
+ @{ printf ' %s' ' $*.elc: ' ; \
57
+ grep " require 'xcb" $< | \
58
+ sed -E -e " s,.*\(require '([^)]+)\).*,\1.elc," | \
59
+ tr ' \n' ' ' ; \
60
+ printf ' \n' ; \
61
+ } > $@
62
+
63
+ # This is a small crutch: we want to avoid generating the `.el.d`s (which means
64
+ # parsing the XML and generating the corresponding `.el`s) in order to clean.
65
+ ifneq ($(MAKECMDGOALS ) ,clean)
66
+ include $(ELLDS )
67
+ include $(ELGDS )
68
+ endif
64
69
65
70
% .elc : % .el
66
71
@printf " Compiling $<\n"
67
- emacs --batch -Q -L . -f batch-byte-compile $<
72
+ @emacs --batch -Q -L . -f batch-byte-compile $<
73
+
74
+ .PHONY : compile
75
+ compile : $(ELCS )
76
+
77
+ .PHONY : generate
78
+ generate : $(ELGS )
68
79
69
80
.PHONY : clean
70
81
clean :
71
- @rm -vf $(ELGS ) $(ELCS )
82
+ @rm -vf $(ELGS ) $(ELLDS ) $( ELCS ) $( ELGDS )
0 commit comments