We strive to avoid conditional compilation in i3 as much as possible. cairo and pangocairo have been around long enough in the versions that we need that it’s time to unconditionally depend on them. Also update DEPENDS with the last-known-good-versions while at it.
219 lines
6.6 KiB
Makefile
219 lines
6.6 KiB
Makefile
UNAME=$(shell uname)
|
||
DEBUG=1
|
||
ASAN=0
|
||
INSTALL=install
|
||
LN=ln
|
||
PKG_CONFIG=pkg-config
|
||
ifndef PREFIX
|
||
PREFIX=/usr
|
||
endif
|
||
ifndef EXEC_PREFIX
|
||
EXEC_PREFIX=$(PREFIX)
|
||
endif
|
||
ifndef SYSCONFDIR
|
||
ifeq ($(PREFIX),/usr)
|
||
SYSCONFDIR=/etc
|
||
else
|
||
SYSCONFDIR=$(PREFIX)/etc
|
||
endif
|
||
endif
|
||
|
||
# In dist and snapshot tarballs, use the I3_VERSION and VERSION files. Otherwise use git information.
|
||
ifeq ($(wildcard .git),)
|
||
# not in git repository
|
||
VERSION := $(shell [ -f $(TOPDIR)/I3_VERSION ] && cat $(TOPDIR)/I3_VERSION | cut -d '-' -f 1)
|
||
I3_VERSION := '$(shell [ -f $(TOPDIR)/I3_VERSION ] && cat $(TOPDIR)/I3_VERSION)'
|
||
else
|
||
VERSION := $(shell git describe --tags --abbrev=0)
|
||
I3_VERSION := '$(shell git describe --tags --always) ($(shell git log --pretty=format:%cd --date=short -n1), branch \"$(shell git describe --tags --always --all | sed s:heads/::)\")'
|
||
endif
|
||
|
||
MAJOR_VERSION := $(shell echo ${VERSION} | cut -d '.' -f 1)
|
||
MINOR_VERSION := $(shell echo ${VERSION} | cut -d '.' -f 2)
|
||
PATCH_VERSION := $(shell echo ${VERSION} | cut -d '.' -f 3)
|
||
ifeq (${PATCH_VERSION},)
|
||
PATCH_VERSION := 0
|
||
endif
|
||
|
||
## Generic flags
|
||
|
||
# Default CFLAGS that users should be able to override
|
||
ifeq ($(DEBUG),1)
|
||
# Extended debugging flags, macros shall be available in gcc
|
||
CFLAGS ?= -pipe -gdwarf-2 -g3
|
||
else
|
||
CFLAGS ?= -pipe -O2 -freorder-blocks-and-partition
|
||
endif
|
||
|
||
ifeq ($(ASAN),1)
|
||
CFLAGS += -fsanitize=address -DI3_ASAN_ENABLED
|
||
LDFLAGS += -fsanitize=address
|
||
endif
|
||
|
||
# Default LDFLAGS that users should be able to override
|
||
LDFLAGS ?= $(as_needed_LDFLAG)
|
||
|
||
# Common CFLAGS for all i3 related binaries
|
||
I3_CFLAGS = -std=c99
|
||
I3_CFLAGS += -Wall
|
||
# unused-function, unused-label, unused-variable are turned on by -Wall
|
||
# We don’t want unused-parameter because of the use of many callbacks
|
||
I3_CFLAGS += -Wunused-value
|
||
I3_CFLAGS += -Iinclude
|
||
|
||
I3_CPPFLAGS = -DI3_VERSION=\"${I3_VERSION}\"
|
||
I3_CPPFLAGS += -DMAJOR_VERSION=${MAJOR_VERSION}
|
||
I3_CPPFLAGS += -DMINOR_VERSION=${MINOR_VERSION}
|
||
I3_CPPFLAGS += -DPATCH_VERSION=${PATCH_VERSION}
|
||
I3_CPPFLAGS += -DSYSCONFDIR=\"${SYSCONFDIR}\"
|
||
I3_CPPFLAGS += -DI3__FILE__=__FILE__
|
||
|
||
|
||
## Libraries flags
|
||
|
||
ifeq ($(shell which $(PKG_CONFIG) 2>/dev/null 1>/dev/null || echo 1),1)
|
||
$(error "pkg-config was not found")
|
||
endif
|
||
|
||
# An easier way to get CFLAGS and LDFLAGS falling back in case there's
|
||
# no pkg-config support for certain libraries.
|
||
#
|
||
# NOTE that you must not use a blank after comma when calling this:
|
||
# $(call ldflags_for_lib name, fallback) # bad
|
||
# $(call ldflags_for_lib name,fallback) # good
|
||
# Otherwise, the compiler will get -l foo instead of -lfoo
|
||
#
|
||
# We redirect stderr to /dev/null because pkg-config prints an error if support
|
||
# for gnome-config was enabled but gnome-config is not actually installed.
|
||
cflags_for_lib = $(shell $(PKG_CONFIG) --silence-errors --cflags $(1) 2>/dev/null)
|
||
ldflags_for_lib = $(shell $(PKG_CONFIG) --exists 2>/dev/null $(1) && $(PKG_CONFIG) --libs $(1) 2>/dev/null || echo -l$(2))
|
||
|
||
# XCB common stuff
|
||
XCB_CFLAGS := $(call cflags_for_lib, xcb)
|
||
XCB_CFLAGS += $(call cflags_for_lib, xcb-event)
|
||
XCB_LIBS := $(call ldflags_for_lib, xcb,xcb)
|
||
XCB_LIBS += $(call ldflags_for_lib, xcb-event,xcb-event)
|
||
XCB_CFLAGS += $(call cflags_for_lib, xcb-util)
|
||
XCB_LIBS += $(call ldflags_for_lib, xcb-util)
|
||
ifneq ($(shell $(PKG_CONFIG) --atleast-version=0.3.8 xcb-util 2>/dev/null && echo 1),1)
|
||
$(error "xcb-util >= 0.3.8 not found")
|
||
endif
|
||
XCB_XKB_LIBS := $(call ldflags_for_lib, xcb-xkb,xcb-xkb)
|
||
|
||
# XCB keyboard stuff
|
||
XCB_KBD_CFLAGS := $(call cflags_for_lib, xcb-keysyms)
|
||
XCB_KBD_LIBS := $(call ldflags_for_lib, xcb-keysyms,xcb-keysyms)
|
||
|
||
# XCB WM stuff
|
||
XCB_WM_CFLAGS := $(call cflags_for_lib, xcb-icccm)
|
||
XCB_WM_CFLAGS += $(call cflags_for_lib, xcb-xinerama)
|
||
XCB_WM_CFLAGS += $(call cflags_for_lib, xcb-randr)
|
||
XCB_WM_LIBS := $(call ldflags_for_lib, xcb-icccm,xcb-icccm)
|
||
XCB_WM_LIBS += $(call ldflags_for_lib, xcb-xinerama,xcb-xinerama)
|
||
XCB_WM_LIBS += $(call ldflags_for_lib, xcb-randr,xcb-randr)
|
||
|
||
# XCB cursor
|
||
XCB_CURSOR_CFLAGS := $(call cflags_for_lib, xcb-cursor)
|
||
XCB_CURSOR_LIBS := $(call ldflags_for_lib, xcb-cursor,xcb-cursor)
|
||
|
||
XKB_COMMON_CFLAGS := $(call cflags_for_lib, xkbcommon,xkbcommon)
|
||
XKB_COMMON_LIBS := $(call ldflags_for_lib, xkbcommon,xkbcommon)
|
||
XKB_COMMON_X11_CFLAGS := $(call cflags_for_lib, xkbcommon-x11,xkbcommon-x11)
|
||
XKB_COMMON_X11_LIBS := $(call ldflags_for_lib, xkbcommon-x11,xkbcommon-x11)
|
||
|
||
# XCB xrm
|
||
XCB_XRM_CFLAGS := $(call cflags_for_lib, xcb-xrm)
|
||
XCB_XRM_LIBS := $(call ldflags_for_lib, xcb-xrm,xcb-xrm)
|
||
|
||
# yajl
|
||
YAJL_CFLAGS := $(call cflags_for_lib, yajl)
|
||
YAJL_LIBS := $(call ldflags_for_lib, yajl,yajl)
|
||
|
||
#libev
|
||
LIBEV_CFLAGS := $(call cflags_for_lib, libev)
|
||
LIBEV_LIBS := $(call ldflags_for_lib, libev,ev)
|
||
|
||
# libpcre
|
||
PCRE_CFLAGS := $(call cflags_for_lib, libpcre)
|
||
ifneq ($(shell $(PKG_CONFIG) --atleast-version=8.10 libpcre 2>/dev/null && echo 1),1)
|
||
$(error "libpcre >= 8.10 not found")
|
||
endif
|
||
PCRE_LIBS := $(call ldflags_for_lib, libpcre,pcre)
|
||
|
||
# startup-notification
|
||
LIBSN_CFLAGS := $(call cflags_for_lib, libstartup-notification-1.0)
|
||
LIBSN_LIBS := $(call ldflags_for_lib, libstartup-notification-1.0,startup-notification-1)
|
||
|
||
# Pango
|
||
PANGO_CFLAGS := $(call cflags_for_lib, cairo)
|
||
PANGO_CFLAGS += $(call cflags_for_lib, pangocairo)
|
||
ifneq ($(shell $(PKG_CONFIG) --atleast-version=1.14.4 cairo 2>/dev/null && echo 1),1)
|
||
$(error "cairo >= 1.14.4 missing")
|
||
endif
|
||
PANGO_LIBS := $(call ldflags_for_lib, cairo)
|
||
PANGO_LIBS += $(call ldflags_for_lib, pangocairo)
|
||
|
||
# libi3
|
||
LIBS = -L$(TOPDIR) -li3 -lm
|
||
|
||
## Platform-specific flags
|
||
|
||
# Please test if -Wl,--as-needed works on your platform and send me a patch.
|
||
# it is known not to work on Darwin (Mac OS X)
|
||
ifneq (,$(filter Linux GNU GNU/%, $(UNAME)))
|
||
as_needed_LDFLAG = -Wl,--as-needed
|
||
endif
|
||
|
||
ifeq ($(UNAME),NetBSD)
|
||
# We need -idirafter instead of -I to prefer the system’s iconv over GNU libiconv
|
||
I3_CFLAGS += -idirafter /usr/pkg/include
|
||
I3_LDFLAGS += -Wl,-rpath,/usr/local/lib -Wl,-rpath,/usr/pkg/lib
|
||
endif
|
||
|
||
ifeq ($(UNAME),OpenBSD)
|
||
I3_CFLAGS += -I${X11BASE}/include
|
||
LIBS += -liconv
|
||
I3_LDFLAGS += -L${X11BASE}/lib
|
||
endif
|
||
|
||
ifeq ($(UNAME),FreeBSD)
|
||
LIBS += -liconv
|
||
endif
|
||
|
||
ifeq ($(UNAME),Darwin)
|
||
LIBS += -liconv
|
||
else ifneq ($(UNAME),OpenBSD)
|
||
# Darwin (Mac OS X) and OpenBSD do not have librt
|
||
LIBS += -lrt
|
||
endif
|
||
|
||
ifeq ($(UNAME),SunOS)
|
||
LIBS += -lsocket -liconv -lgen
|
||
endif
|
||
|
||
ifneq (,$(filter Linux GNU GNU/%, $(UNAME)))
|
||
I3_CPPFLAGS += -D_GNU_SOURCE
|
||
endif
|
||
|
||
|
||
ifeq ($(COVERAGE),1)
|
||
I3_CFLAGS += -fprofile-arcs -ftest-coverage
|
||
LIBS += -lgcov
|
||
endif
|
||
|
||
V ?= 0
|
||
ifeq ($(V),0)
|
||
# Don’t print command lines which are run
|
||
.SILENT:
|
||
|
||
# echo-ing vars
|
||
V_ASCIIDOC = echo ASCIIDOC $@;
|
||
V_POD2HTML = echo POD2HTML $@;
|
||
V_POD2MAN = echo POD2MAN $@;
|
||
V_A2X = echo A2X $@;
|
||
endif
|
||
|
||
# Always remake the following targets
|
||
.PHONY: install clean dist distclean
|
||
|