X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=common.mk;h=b9e15a286fc27d335e4ae8c12a36ec8188dbd972;hb=c2ccfc7e6088153c3846ea6b525cd41a6606ae72;hp=41946d41246ae06351f6262d34acf4ac0452decc;hpb=c55abca11555d735bf15b14d4f7eaeb61ee6c034;p=i3%2Fi3 diff --git a/common.mk b/common.mk index 41946d41..b9e15a28 100644 --- a/common.mk +++ b/common.mk @@ -2,112 +2,201 @@ UNAME=$(shell uname) DEBUG=1 COVERAGE=0 INSTALL=install -PREFIX=/usr -ifeq ($(PREFIX),/usr) -SYSCONFDIR=/etc +LN=ln +ifndef PREFIX + PREFIX=/usr +endif +ifndef SYSCONFDIR + ifeq ($(PREFIX),/usr) + SYSCONFDIR=/etc + else + SYSCONFDIR=$(PREFIX)/etc + endif +endif + +# In dist tarballs, the version is stored in the I3_VERSION and VERSION files. +I3_VERSION := '$(shell [ -f $(TOPDIR)/I3_VERSION ] && cat $(TOPDIR)/I3_VERSION)' +VERSION := '$(shell [ -f $(TOPDIR)/VERSION ] && cat $(TOPDIR)/VERSION)' +ifeq ('',$(I3_VERSION)) +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 -SYSCONFDIR=$(PREFIX)/etc +CFLAGS ?= -pipe -O2 -freorder-blocks-and-partition endif -TERM_EMU=xterm -# The escaping is absurd, but we need to escape for shell, sed, make, define -GIT_VERSION:="$(shell git describe --tags --always) ($(shell git log --pretty=format:%cd --date=short -n1), branch $(shell [ -f .git/HEAD ] && sed 's/ref: refs\/heads\/\(.*\)/\\\\\\"\1\\\\\\"/g' .git/HEAD || echo 'unknown'))" -VERSION:=$(shell git describe --tags --abbrev=0) + +# 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 -cflags_for_lib = $(shell pkg-config --silence-errors --cflags $(1)) -ldflags_for_lib = $(shell pkg-config --exists $(1) && pkg-config --libs $(1) || echo -l$(2)) +# 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)) -CFLAGS += -std=c99 -CFLAGS += -pipe -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 -CFLAGS += -Wunused-value -CFLAGS += -Iinclude -CFLAGS += $(call cflags_for_lib, xcb-keysyms) -ifeq ($(shell pkg-config --exists xcb-util || echo 1),1) -CFLAGS += -DXCB_COMPAT -CFLAGS += $(call cflags_for_lib, xcb-atom) -CFLAGS += $(call cflags_for_lib, xcb-aux) +# 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) +ifeq ($(shell pkg-config --exists xcb-util 2>/dev/null || echo 1),1) +XCB_CFLAGS += $(call cflags_for_lib, xcb-atom) +XCB_CFLAGS += $(call cflags_for_lib, xcb-aux) +XCB_LIBS += $(call ldflags_for_lib, xcb-atom,xcb-atom) +XCB_LIBS += $(call ldflags_for_lib, xcb-aux,xcb-aux) +XCB_CPPFLAGS+= -DXCB_COMPAT else -CFLAGS += $(call cflags_for_lib, xcb-util) -endif -CFLAGS += $(call cflags_for_lib, xcb-icccm) -CFLAGS += $(call cflags_for_lib, xcb-xinerama) -CFLAGS += $(call cflags_for_lib, xcb-randr) -CFLAGS += $(call cflags_for_lib, xcb) -CFLAGS += $(call cflags_for_lib, xcursor) -CFLAGS += $(call cflags_for_lib, x11) -CFLAGS += $(call cflags_for_lib, yajl) -CFLAGS += $(call cflags_for_lib, libev) -CFLAGS += -DI3_VERSION=\"${GIT_VERSION}\" -CFLAGS += -DSYSCONFDIR=\"${SYSCONFDIR}\" -CFLAGS += -DTERM_EMU=\"$(TERM_EMU)\" - -LDFLAGS += -lm -LDFLAGS += $(call ldflags_for_lib, xcb-event, xcb-event) -LDFLAGS += $(call ldflags_for_lib, xcb-keysyms, xcb-keysyms) -ifeq ($(shell pkg-config --exists xcb-util || echo 1),1) -LDFLAGS += $(call ldflags_for_lib, xcb-atom, xcb-atom) -LDFLAGS += $(call ldflags_for_lib, xcb-aux, xcb-aux) -else -LDFLAGS += $(call ldflags_for_lib, xcb-util) +XCB_CFLAGS += $(call cflags_for_lib, xcb-util) +XCB_LIBS += $(call ldflags_for_lib, xcb-util) +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) + +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) + +# Xcursor +XCURSOR_CFLAGS := $(call cflags_for_lib, xcb-cursor) +XCURSOR_LIBS := $(call ldflags_for_lib, xcb-cursor,xcb-cursor) + +# 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) +ifeq ($(shell pkg-config --atleast-version=8.10 libpcre 2>/dev/null && echo 1),1) +I3_CPPFLAGS += -DPCRE_HAS_UCP=1 +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) +I3_CPPFLAGS += -DPANGO_SUPPORT=1 +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 -LDFLAGS += $(call ldflags_for_lib, xcb-icccm, xcb-icccm) -LDFLAGS += $(call ldflags_for_lib, xcb-xinerama, xcb-xinerama) -LDFLAGS += $(call ldflags_for_lib, xcb-randr, xcb-randr) -LDFLAGS += $(call ldflags_for_lib, xcb, xcb) -LDFLAGS += $(call ldflags_for_lib, xcursor, Xcursor) -LDFLAGS += $(call ldflags_for_lib, x11, X11) -LDFLAGS += $(call ldflags_for_lib, yajl, yajl) -LDFLAGS += $(call ldflags_for_lib, libev, ev) ifeq ($(UNAME),NetBSD) # We need -idirafter instead of -I to prefer the system’s iconv over GNU libiconv -CFLAGS += -idirafter /usr/pkg/include -LDFLAGS += -Wl,-rpath,/usr/local/lib -Wl,-rpath,/usr/pkg/lib +I3_CFLAGS += -idirafter /usr/pkg/include +I3_LDFLAGS += -Wl,-rpath,/usr/local/lib -Wl,-rpath,/usr/pkg/lib endif ifeq ($(UNAME),OpenBSD) -CFLAGS += -I${X11BASE}/include -LDFLAGS += -liconv -LDFLAGS += -L${X11BASE}/lib +I3_CFLAGS += -I${X11BASE}/include +LIBS += -liconv +I3_LDFLAGS += -L${X11BASE}/lib endif ifeq ($(UNAME),FreeBSD) -LDFLAGS += -liconv +LIBS += -liconv endif -# Fallback for libyajl 1 which did not include yajl_version.h. We need -# YAJL_MAJOR from that file to decide which code path should be used. -CFLAGS += -idirafter yajl-fallback +ifeq ($(UNAME),Darwin) +LIBS += -liconv +else ifneq ($(UNAME),OpenBSD) +# Darwin (Mac OS X) and OpenBSD do not have librt +LIBS += -lrt +endif ifneq (,$(filter Linux GNU GNU/%, $(UNAME))) -CFLAGS += -D_GNU_SOURCE +I3_CPPFLAGS += -D_GNU_SOURCE endif -ifeq ($(DEBUG),1) -# Extended debugging flags, macros shall be available in gcc -CFLAGS += -gdwarf-2 -CFLAGS += -g3 -else -CFLAGS += -O2 -CFLAGS += -freorder-blocks-and-partition -endif ifeq ($(COVERAGE),1) -CFLAGS += -fprofile-arcs -ftest-coverage -LDFLAGS += -lgcov +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