summaryrefslogtreecommitdiff
path: root/src/Makefile
blob: b2186394f48675913b4f0ebe34c2c62b1ea3d146 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
debug ?= yes
static ?= no

ifeq ($(debug),yes)
    CPPFLAGS += -DKAK_DEBUG
    suffix := .debug
else
    ifeq ($(debug),no)
        CXXFLAGS += -O3
        suffix := .opt
    else
        $(error debug should be either yes or no)
    endif
endif

sources := $(wildcard *.cc)
objects := $(addprefix ., $(sources:.cc=$(suffix).o))
deps := $(addprefix ., $(sources:.cc=$(suffix).d))
docs := $(wildcard ../doc/manpages/*.asciidoc)
mandocs := $(docs:.asciidoc=.gz)

PREFIX ?= /usr/local
DESTDIR ?= # root dir

NCURSESW_INCLUDE ?= /usr/include/ncursesw

bindir := $(DESTDIR)$(PREFIX)/bin
sharedir := $(DESTDIR)$(PREFIX)/share/kak
docdir := $(DESTDIR)$(PREFIX)/share/doc/kak
mandir := $(DESTDIR)$(PREFIX)/share/man/man1

os := $(shell uname)

ifeq ($(os),Darwin)
    LIBS += -lncurses -lboost_regex-mt
    CPPFLAGS += -I$(PREFIX)/opt/ncurses/include -I$(PREFIX)/opt/boost/include
    LDFLAGS += -L$(PREFIX)/opt/ncurses/lib -L$(PREFIX)/opt/boost/lib
else ifeq ($(os),FreeBSD)
    LIBS += -ltinfow -lncursesw -lboost_regex
    CPPFLAGS += -I/usr/local/include
    LDFLAGS += -L/usr/local/lib
else ifeq ($(os),Haiku)
    LIBS += -lncursesw -lboost_regex -lnetwork -lbe
else ifeq ($(os),DragonFly)
    LIBS += -lncursesw -lboost_regex
    CPPFLAGS += -I/usr/local/include
    LDFLAGS += -L/usr/local/lib
else ifneq (,$(findstring CYGWIN,$(os)))
    CPPFLAGS += -D_XOPEN_SOURCE=700
    LIBS += -lncursesw -lboost_regex -ldbghelp
else
    LIBS += -lncursesw -lboost_regex
    CPPFLAGS += -I$(NCURSESW_INCLUDE)
    LDFLAGS += -rdynamic
endif

ifeq ($(static),yes)
    LIBS += -ltinfo -lgpm
    LDFLAGS += -static -pthread
endif

CXXFLAGS += -pedantic -std=gnu++11 -g -Wall -Wno-reorder -Wno-sign-compare -Wno-address

all : kak
kak : $(objects)
	$(CXX) $(LDFLAGS) $(CXXFLAGS) $(objects) $(LIBS) -o $@

-include $(deps)

.%$(suffix).o: %.cc
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -MD -MP -MF $(addprefix ., $(<:.cc=$(suffix).d)) -c -o $@ $<

# Generate the man page
../doc/kak.1.gz: ../doc/kak.1.txt
	a2x --no-xmllint -f manpage $<
	gzip -f $(basename $<)

# Generate the editor's documentation pages
# Since `a2x` won't generate man pages if some sections are missing (which we don't need),
# we generate the pages, patch them and then compress them
../doc/manpages/%.gz: ../doc/manpages/%.asciidoc
	a2x --no-xmllint -f manpage $<
	sed -i -r -e "s,^\.TH .+,.TH KAKOUNE 1 \"\" \"\" \"$(basename $(notdir $<))\"," \
	-e "/^\.SH \"NAME\"/{N;d;}" $(@:.gz=.1)
	gzip -f $(@:.gz=.1)
	mv -f $(@:.gz=.1.gz) $@

check: test
test:
	cd ../test && ./run

TAGS: tags
tags:
	ctags -R
man: ../doc/kak.1.gz
doc: $(mandocs)

clean:
	rm -f .*.o .*.d

distclean: clean
	rm -f kak

installdirs:
	install	-d $(bindir) \
		$(sharedir)/rc/base	\
		$(sharedir)/rc/core	\
		$(sharedir)/rc/extra \
		$(sharedir)/colors \
		$(docdir)/manpages \
		$(mandir)

install: kak man doc installdirs
	install	-m 0755	kak	$(bindir)
	install	-m 0644	../share/kak/kakrc $(sharedir)
	install	-m 0644	../rc/base/* $(sharedir)/rc/base
	install	-m 0644	../rc/core/* $(sharedir)/rc/core
	install	-m 0644	../rc/extra/* $(sharedir)/rc/extra
	[ -e $(sharedir)/autoload ]	|| ln -s rc	$(sharedir)/autoload
	install	-m 0644	../colors/*	$(sharedir)/colors
	install	-m 0644	../README.asciidoc $(docdir)
	install	-m 0644	../doc/manpages/*.gz $(docdir)/manpages
	install	-m 0644	../doc/kak.1.gz	$(mandir)

install-strip: install
	strip -s $(bindir)/kak

uninstall:
	rm -rf $(bindir)/kak \
		$(sharedir)	\
		$(docdir) \
		$(mandir)/kak.1.gz

.PHONY: check TAGS clean distclean installdirs install install-strip uninstall
.PHONY: tags test man doc