1VERSION ?= $(shell cat VERSION)
2PREFIX ?= /usr/local
3includedir ?= /include
4bindir ?= /bin
5libdir ?= /lib
6mandir ?= /share/man/man1
7
8GIT_SHA1 = $(shell git rev-parse HEAD 2>/dev/null || printf 'nogit')
9GIT_TAG = $(shell git tag --points-at HEAD 2>/dev/null || cat VERSION)
10MAKEFLAGS += --no-builtin-rules
11
12WARNINGS = -Wall -Wextra -Wpedantic -Wformat=2 -Wstrict-aliasing=3 -Wstrict-overflow=5 -Wstack-usage=12500 \
13	-Wfloat-equal -Wcast-align -Wpointer-arith -Wchar-subscripts -Warray-bounds=2 -Wno-unknown-warning-option
14
15override CFLAGS ?= -g -O2 $(WARNINGS) $(EXTRA_WARNINGS)
16override CFLAGS += -std=c99
17override CPPFLAGS ?= -D_FORTIFY_SOURCE=2
18override CPPFLAGS += -DBM_VERSION=\"$(VERSION)\" -DBM_PLUGIN_VERSION=\"$(VERSION)-$(GIT_SHA1)\" -DINSTALL_LIBDIR=\"$(PREFIX)$(libdir)\"
19override CPPFLAGS += -D_DEFAULT_SOURCE -Ilib
20
21libs = libbemenu.so
22pkgconfigs = bemenu.pc
23bins = bemenu bemenu-run
24mans = bemenu.1
25renderers = bemenu-renderer-x11.so bemenu-renderer-curses.so
26all: $(bins) $(renderers) $(mans)
27clients: $(bins)
28curses: bemenu-renderer-curses.so
29x11: bemenu-renderer-x11.so
30wayland: bemenu-renderer-wayland.so
31
32# support non git builds
33.git/index:
34	mkdir -p .git
35	touch .git/index
36
37%.a:
38	$(LINK.c) -c $(filter %.c,$^) $(LDLIBS) -o $@
39
40$(libs): private override full=$(addsuffix .$(VERSION), $@)
41$(libs): private override major=$(addsuffix .$(firstword $(subst ., ,$(VERSION))), $@)
42$(libs): %: VERSION .git/index
43	$(LINK.c) -shared -fPIC $(filter %.c %.a,$^) $(LDLIBS) -o $(full) -Wl,-soname,$(major)
44	ln -fs $(full) $(major)
45	ln -fs $(full) $@
46
47$(pkgconfigs): %: VERSION %.in
48	sed "s/@VERSION@/$(VERSION)/;s,@PREFIX@,$(PREFIX),;s,@LIBDIR@,$(libdir),;s,@INCLUDEDIR@,$(includedir)," $(addsuffix .in, $@) > $@
49
50bemenu.1: man/bemenu.1.in
51	sed 's,@LIBDIR@,$(PREFIX)$(libdir),' $< > $@
52
53$(renderers): %: VERSION .git/index | $(libs)
54	$(LINK.c) -shared -fPIC $(filter %.c %.a,$^) $(LDLIBS) -L. -lbemenu -o $@
55
56$(bins): %: | $(libs)
57	$(LINK.c) $(filter %.c %.a,$^) $(LDLIBS) -L. -lbemenu -o $@
58
59cdl.a: private override LDFLAGS += -fPIC
60cdl.a: lib/3rdparty/cdl.c lib/3rdparty/cdl.h
61
62libbemenu.so: private override LDLIBS += -ldl
63libbemenu.so: lib/bemenu.h lib/internal.h lib/filter.c lib/item.c lib/library.c lib/list.c lib/menu.c lib/util.c cdl.a
64
65bemenu-renderer-curses.so: private override LDLIBS += $(shell pkg-config --libs ncursesw) -lm
66bemenu-renderer-curses.so: private override CPPFLAGS += $(shell pkg-config --cflags-only-I ncursesw)
67bemenu-renderer-curses.so: lib/renderers/curses/curses.c
68
69bemenu-renderer-x11.so: private override LDLIBS += $(shell pkg-config --libs x11 xinerama cairo pango pangocairo)
70bemenu-renderer-x11.so: private override CPPFLAGS += $(shell pkg-config --cflags-only-I x11 xinerama cairo pango pangocairo)
71bemenu-renderer-x11.so: lib/renderers/cairo_renderer.h lib/renderers/x11/x11.c lib/renderers/x11/x11.h lib/renderers/x11/window.c lib/renderers/x11/xkb_unicode.c lib/renderers/x11/xkb_unicode.h
72
73lib/renderers/wayland/xdg-shell.c:
74	wayland-scanner private-code < "$$(pkg-config --variable=pkgdatadir wayland-protocols)/stable/xdg-shell/xdg-shell.xml" > $@
75
76lib/renderers/wayland/wlr-layer-shell-unstable-v1.h: lib/renderers/wayland/wlr-layer-shell-unstable-v1.xml
77	wayland-scanner client-header < $^ > $@
78
79lib/renderers/wayland/wlr-layer-shell-unstable-v1.c: lib/renderers/wayland/wlr-layer-shell-unstable-v1.xml
80	wayland-scanner private-code < $^ > $@
81
82lib/renderers/wayland/xdg-output-unstable-v1.h: lib/renderers/wayland/xdg-output-unstable-v1.xml
83	wayland-scanner client-header < $^ > $@
84
85lib/renderers/wayland/xdg-output-unstable-v1.c: lib/renderers/wayland/xdg-output-unstable-v1.xml
86	wayland-scanner private-code < $^ > $@
87
88xdg-shell.a: private override LDFLAGS += -fPIC
89xdg-shell.a: private override CPPFLAGS += $(shell pkg-config --cflags-only-I wayland-client)
90xdg-shell.a: lib/renderers/wayland/xdg-shell.c
91wlr-layer-shell.a: private override LDFLAGS += -fPIC
92wlr-layer-shell.a: private override CPPFLAGS += $(shell pkg-config --cflags-only-I wayland-client)
93wlr-layer-shell.a: lib/renderers/wayland/wlr-layer-shell-unstable-v1.c lib/renderers/wayland/wlr-layer-shell-unstable-v1.h
94xdg-output.a: private override LDFLAGS += -fPIC
95xdg-output.a: private override CPPFLAGS += $(shell pkg-config --cflags-only-I wayland-client)
96xdg-output.a: lib/renderers/wayland/xdg-output-unstable-v1.c lib/renderers/wayland/xdg-output-unstable-v1.h
97bemenu-renderer-wayland.so: private override LDLIBS += $(shell pkg-config --libs wayland-client cairo pango pangocairo xkbcommon)
98bemenu-renderer-wayland.so: private override CPPFLAGS += $(shell pkg-config --cflags-only-I wayland-client cairo pango pangocairo xkbcommon)
99: lib/renderers/cairo_renderer.h lib/renderers/wayland/wayland.c lib/renderers/wayland/wayland.h lib/renderers/wayland/registry.c lib/renderers/wayland/window.c xdg-shell.a wlr-layer-shell.a xdg-output.a
100
101common.a: client/common/common.c client/common/common.h
102bemenu: common.a client/bemenu.c
103bemenu-run: common.a client/bemenu-run.c
104
105install-pkgconfig: $(pkgconfigs)
106	mkdir -p "$(DESTDIR)$(PREFIX)$(libdir)/pkgconfig"
107	cp $^ "$(DESTDIR)$(PREFIX)$(libdir)/pkgconfig"
108
109install-include: lib/bemenu.h
110	mkdir -p "$(DESTDIR)$(PREFIX)$(includedir)"
111	cp $^ "$(DESTDIR)$(PREFIX)$(includedir)"
112
113install-libs: $(libs)
114	mkdir -p "$(DESTDIR)$(PREFIX)$(libdir)"
115	cp $(addsuffix .$(VERSION), $^) "$(DESTDIR)$(PREFIX)$(libdir)"
116
117install-lib-symlinks: $(libs) | install-libs
118	cp -RP $^ $(addsuffix .$(firstword $(subst ., ,$(VERSION))), $^) "$(DESTDIR)$(PREFIX)$(libdir)"
119
120install-bins:
121	mkdir -p "$(DESTDIR)$(PREFIX)$(bindir)"
122	-cp $(bins) "$(DESTDIR)$(PREFIX)$(bindir)"
123	-chmod 0755 $(addprefix "$(DESTDIR)$(PREFIX)$(bindir)"/,$(bins))
124
125install-man: bemenu.1
126	mkdir -p "$(DESTDIR)$(PREFIX)$(mandir)"
127	cp $< "$(DESTDIR)$(PREFIX)$(mandir)"
128
129install-renderers: install-curses  install-x11
130
131install-curses:
132	mkdir -p "$(DESTDIR)$(PREFIX)$(libdir)/bemenu"
133	-cp bemenu-renderer-curses.so "$(DESTDIR)$(PREFIX)$(libdir)/bemenu"
134
135install-wayland:
136	mkdir -p "$(DESTDIR)$(PREFIX)$(libdir)/bemenu"
137	-cp bemenu-renderer-wayland.so "$(DESTDIR)$(PREFIX)$(libdir)/bemenu"
138
139install-x11:
140	mkdir -p "$(DESTDIR)$(PREFIX)$(libdir)/bemenu"
141	-cp bemenu-renderer-x11.so "$(DESTDIR)$(PREFIX)$(libdir)/bemenu"
142
143install-base: install-pkgconfig install-include install-lib-symlinks install-bins install-man
144
145install: install-base install-renderers
146	@echo "Install OK!"
147
148doxygen:
149	BM_VERSION=$(VERSION) doxygen doxygen/Doxyfile
150	cp -R doxygen/doxygen-qmi-style/navtree html
151	cp -R doxygen/doxygen-qmi-style/search html/search
152
153sign:
154	test "x$(GIT_TAG)" = "x$(VERSION)"
155	git archive --prefix="bemenu-$(VERSION)/" -o "bemenu-$(VERSION).tar.gz" "$(GIT_TAG)"
156	gpg --default-key "$(GPG_KEY_ID)" --armor --detach-sign "bemenu-$(VERSION).tar.gz"
157
158clean:
159	$(RM) -r *.dSYM # OSX generates .dSYM dirs with -g ...
160	$(RM) $(pkgconfigs) $(libs) $(bins) $(renderers) $(mans) *.a *.so.*
161	$(RM) lib/renderers/wayland/wlr-*.h lib/renderers/wayland/wlr-*.c lib/renderers/wayland/xdg-shell.c
162	$(RM) -r html
163
164.DELETE_ON_ERROR:
165.PHONY: all clean install install-base install-pkgconfig install-include install-libs install-lib-symlinks \
166		install-man install-bins install-renderers install-curses  install-x11 \
167		doxygen sign clients curses x11 wayland
168