picom/Makefile

198 lines
5.2 KiB
Makefile

# Use tab to indent recipe lines, spaces to indent other lines, otherwise
# GNU make may get unhappy.
CC ?= gcc
PREFIX ?= /usr
BINDIR ?= $(PREFIX)/bin
MANDIR ?= $(PREFIX)/share/man/man1
APPDIR ?= $(PREFIX)/share/applications
ICODIR ?= $(PREFIX)/share/icons/hicolor/
PACKAGES = x11 x11-xcb xcb-renderutil xcb-render xcb-damage xcb-randr xcb-composite xcb-shape xcb-image xcb-xfixes xext pixman-1
LIBS = -lm -lrt -lev
INCS =
OBJS = compton.o config.o win.o x.o
# === Configuration flags ===
CFG = -std=c11 -D_GNU_SOURCE -Wall -Wextra -Wno-unused-parameter -Wnonnull
ifeq "$(CC)" "clang"
CFG += -Wconditional-uninitialized
endif
# ==== Xinerama ====
# Enables support for --xinerama-shadow-crop
ifeq "$(NO_XINERAMA)" ""
CFG += -DCONFIG_XINERAMA
PACKAGES += xcb-xinerama
endif
# ==== libconfig ====
# Enables configuration file parsing support
ifeq "$(NO_LIBCONFIG)" ""
CFG += -DCONFIG_LIBCONFIG
PACKAGES += libconfig
OBJS += config_libconfig.o
# libconfig-1.3* does not define LIBCONFIG_VER* macros, so we use
# pkg-config to determine its version here
LIBCONFIG_VER = $(shell pkg-config --atleast-version=1.4 libconfig; echo $$?)
ifeq ($LIBCONFIG_VER, 1)
$(error "Your libconfig is too old, at least 1.4 is required")
endif
endif
# ==== PCRE regular expression ====
# Enables support for PCRE regular expression pattern in window conditions
ifeq "$(NO_REGEX_PCRE)" ""
CFG += -DCONFIG_REGEX_PCRE
LIBS += $(shell pcre-config --libs)
INCS += $(shell pcre-config --cflags)
# Enables JIT support in libpcre
ifeq "$(NO_REGEX_PCRE_JIT)" ""
CFG += -DCONFIG_REGEX_PCRE_JIT
endif
endif
# ==== DRM VSync ====
# Enables support for "drm" VSync method
ifeq "$(NO_VSYNC_DRM)" ""
INCS += $(shell pkg-config --cflags libdrm)
CFG += -DCONFIG_VSYNC_DRM
endif
# ==== OpenGL ====
# Enables support for GLX backend, OpenGL VSync methods, etc.
ifneq "$(NO_VSYNC_OPENGL)" ""
NO_OPENGL=$(NO_VSYNC_OPENGL)
endif
ifeq "$(NO_OPENGL)" ""
CFG += -DCONFIG_OPENGL
# -lGL must precede some other libraries, or it segfaults on FreeBSD (#74)
LIBS := -lGL $(LIBS)
OBJS += opengl.o
endif
# ==== D-Bus ====
# Enables support for --dbus (D-Bus remote control)
ifeq "$(NO_DBUS)" ""
CFG += -DCONFIG_DBUS
PACKAGES += dbus-1
OBJS += dbus.o
endif
# ==== X Sync ====
# Enables support for --xrender-sync-fence
ifeq "$(NO_XSYNC)" ""
CFG += -DCONFIG_XSYNC
endif
OBJS += c2.o
# ==== X resource checker ====
# Enable X resource leakage checking (Pixmap only, presently)
ifneq "$(ENABLE_XRESCHECK)" ""
CFG += -DDEBUG_XRC
OBJS += xrescheck.o
endif
# === Version string ===
COMPTON_VERSION ?= git-$(shell git describe --always --dirty)-$(shell git log -1 --date=short --pretty=format:%cd)
CFG += -DCOMPTON_VERSION="\"$(COMPTON_VERSION)\""
LDFLAGS ?= -Wl,-O1 -Wl,--as-needed
BUILD_TYPE ?= "Debug"
ifeq "$(BUILD_TYPE)" "Release"
CFG += -DNDEBUG -O2 -D_FORTIFY_SOURCE=2
else ifeq "$(BUILD_TYPE)" "Debug"
CFG += -ggdb -Wshadow
endif
ifeq "$(ENABLE_SAN)" "1"
ifeq "$(CC)" "clang"
CFG += -fsanitize=address,undefined,integer,nullability
else
CFG += -fsanitize=address,undefined
endif
else ifeq "$(ENABLE_SAN)" "memory"
CFG += -fsanitize=memory
endif
LIBS += $(shell pkg-config --libs $(PACKAGES))
INCS += $(shell pkg-config --cflags $(PACKAGES))
BINS = compton bin/compton-trans
MANPAGES = man/compton.1 man/compton-trans.1
MANPAGES_HTML = $(addsuffix .html,$(MANPAGES))
# === Recipes ===
.DEFAULT_GOAL := compton
src/.clang_complete: Makefile
@(for i in $(filter-out -O% -DNDEBUG, $(CFG) $(CPPFLAGS) $(INCS)); do echo "$$i"; done) > $@
.deps:
mkdir -p $@
.deps/%.d: src/%.c | .deps
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $(INCS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
%.o: src/%.c
$(CC) $(CFG) $(CPPFLAGS) $(INCS) -c src/$*.c -o $@
compton: $(OBJS)
$(CC) $(CFG) $(CPPFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
man/%.1: man/%.1.asciidoc
a2x --format manpage $<
man/%.1.html: man/%.1.asciidoc
asciidoc $<
docs: $(MANPAGES) $(MANPAGES_HTML)
install: $(BINS) docs
@install -d "$(DESTDIR)$(BINDIR)" "$(DESTDIR)$(MANDIR)" "$(DESTDIR)$(APPDIR)"
@install -m755 $(BINS) "$(DESTDIR)$(BINDIR)"/
ifneq "$(MANPAGES)" ""
@install -m644 $(MANPAGES) "$(DESTDIR)$(MANDIR)"/
endif
@install -d \
"$(DESTDIR)$(ICODIR)/scalable/apps" \
"$(DESTDIR)$(ICODIR)/48x48/apps"
@install -m644 media/compton.svg "$(DESTDIR)$(ICODIR)/scalable/apps"/
@install -m644 media/icons/48x48/compton.png "$(DESTDIR)$(ICODIR)/48x48/apps"/
@install -m644 compton.desktop "$(DESTDIR)$(APPDIR)"/
ifneq "$(DOCDIR)" ""
@install -d "$(DESTDIR)$(DOCDIR)"
@install -m644 README.md compton.sample.conf "$(DESTDIR)$(DOCDIR)"/
@install -m755 dbus-examples/cdbus-driver.sh "$(DESTDIR)$(DOCDIR)"/
endif
uninstall:
@rm -f "$(DESTDIR)$(BINDIR)/compton" "$(DESTDIR)$(BINDIR)/compton-trans"
@rm -f $(addprefix "$(DESTDIR)$(MANDIR)"/, compton.1 compton-trans.1)
@rm -f "$(DESTDIR)$(APPDIR)/compton.desktop"
ifneq "$(DOCDIR)" ""
@rm -f $(addprefix "$(DESTDIR)$(DOCDIR)"/, README.md compton.sample.conf cdbus-driver.sh)
endif
clean:
@rm -f $(OBJS) compton $(MANPAGES) $(MANPAGES_HTML) .clang_complete
@rm -rf .deps
version:
@echo "$(COMPTON_VERSION)"
.PHONY: uninstall clean docs version
ifneq ($(MAKECMDGOALS),clean)
include $(addprefix .deps/,$(OBJS:.o=.d))
endif