]> git.neil.brown.name Git - edlib.git/blob - Makefile
add lib-copybuf
[edlib.git] / Makefile
1 #
2 # Copyright Neil Brown ©2015 <neil@brown.name>
3 # May be distrubuted under terms of GPLv2 - see file:COPYING
4 #
5 MAKEFLAGS += -j
6
7 SMATCH_CHECK_SAFE=1
8 export SMATCH_CHECK_SAFE
9
10 VERSION = $(shell [ -d .git ] && git describe --always HEAD | sed 's/edlib-//')
11 VERS_DATE = $(shell [ -d .git ] && date --iso-8601 --date="`git log -n1 --format=format:%cd --date=iso --date=short`")
12 DVERS = $(if $(VERSION),-DVERSION=\"$(VERSION)\",)
13 DDATE = $(if $(VERS_DATE),-DVERS_DATE="\"$(VERS_DATE)\"",)
14 VCFLAGS += $(DVERS) $(DDATE)
15
16 LDLIBS= -ldl
17 CC = gcc
18 SMATCH_FLAGS= -D_BITS_FLOATN_H -D__HAVE_FLOAT128=0 -D__FLT_EVAL_METHOD__=1 -D__HAVE_DISTINCT_FLOAT128=0 $(VCFLAGS)
19 SPARSEFLAGS= -Wsparse-all -Wno-transparent-union -Wsparse-error $(SMATCH_FLAGS) $(VCFLAGS)
20 # Create files .DEBUG and .LEAK for extra checking
21 ifeq "$(wildcard .DEBUG)" ".DEBUG"
22  ifeq "$(wildcard .LEAK)" ".LEAK"
23   DBG= -Werror -fno-omit-frame-pointer -fsanitize=undefined -fsanitize=leak
24  else
25   DBG= -Werror -fno-omit-frame-pointer -fsanitize=undefined
26  endif
27  QUIET_CHECK   = $(Q:@=@echo    '     CHECK    '$<;)
28 else
29  DBG=
30  QUIET_CHECK   = @: skip
31 endif
32 ifeq "$(wildcard .SMATCH)" ".SMATCH"
33  # SYMLINK .SMATCH to the smatch binary for testing.
34  SMATCH_CMD=$(shell readlink .SMATCH) $(SMATCH_FLAGS)
35  QUIET_SMATCH  = $(Q:@=@echo    '     SMATCH   '$<;)$(SMATCH_CMD)
36 else
37  QUIET_SMATCH  = @: skip
38 endif
39 CFLAGS=-g -Wall -Wstrict-prototypes -Wextra -Wno-unused-parameter $(DBG) $(VCFLAGS)
40 #Doesn't work :-( -fsanitize=address
41
42 all: edlib checksym lib shared
43
44 OBJ = O/edlib.o
45 LIBOBJ = O/core-mark.o O/core-doc.o O/core-editor.o O/core-attr.o \
46         O/core-keymap.o O/core-pane.o O/core-misc.o
47 SHOBJ = O/doc-text.o O/doc-dir.o O/doc-docs.o \
48         O/doc-email.o O/doc-multipart.o \
49         O/render-hex.o O/render-lines.o \
50         O/render-format.o O/render-complete.o \
51         O/lib-view.o O/lib-tile.o O/lib-popup.o O/lib-linecount.o O/lib-keymap.o \
52         O/lib-search.o O/lib-messageline.o O/lib-input.o O/lib-libevent.o \
53         O/lib-history.o O/lib-crop.o O/lib-renderline.o O/lib-rfc822header.o \
54         O/lib-viewer.o O/lib-base64.o O/lib-qprint.o O/lib-utf8.o \
55         O/lib-copybuf.o \
56         O/lang-python.o \
57         O/mode-emacs.o \
58         O/display-ncurses.o
59 XOBJ = O/rexel.o O/emacs-search.o
60
61 LIBS-lang-python = $(shell pkg-config --libs python-2.7)
62 INC-lang-python = $(shell pkg-config --cflags python-2.7)
63
64 LIBS-display-ncurses = $(shell pkg-config --libs ncursesw)
65 INC-display-ncurses = $(shell pkg-config --cflags ncursesw)
66 O/display-ncurses.o : md5.h
67
68 LIBS-lib-libevent = $(shell pkg-config --libs libevent)
69
70 O/core-editor-static.o : O/mod-list-decl.h O/mod-list.h
71 O/core-keymap.o : jhash.h
72
73 STATICOBJ = $(SHOBJ:.o=-static.o) $(LIBOBJ:.o=-static.o)
74
75 #
76 # Pretty print - borrowed from 'sparse'
77 #
78 V             = @
79 Q             = $(V:1=)
80 QUIET_CC      = $(Q:@=@echo    '     CC       '$@;)
81 QUIET_CCSTATIC= $(Q:@=@echo    '     CCstatic '$@;)
82 QUIET_AR      = $(Q:@=@echo    '     AR       '$@;)
83 QUIET_GEN     = $(Q:@=@echo    '     GEN      '$@;)
84 QUIET_LINK    = $(Q:@=@echo    '     LINK     '$@;)
85 QUIET_LIB     = $(Q:@=@echo    '     LIB      '$@;)
86 QUIET_SCRIPT  = $(Q:@=@echo    '     SCRIPT   '$@;)
87
88 SO = $(patsubst O/%.o,lib/edlib-%.so,$(SHOBJ))
89 H = list.h core.h misc.h
90 edlib: $(OBJ) lib/libedlib.so
91         $(QUIET_LINK)$(CC) $(CPPFLAGS) $(CFLAGS) -rdynamic -Wl,--disable-new-dtags -o $@ $(OBJ) -Llib -Wl,-rpath=`pwd`/lib -ledlib $(LDLIBS)
92
93 edlib-static: $(OBJ) $(STATICOBJ)  $(XOBJ)
94         $(QUIET_LINK)$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $^ $(LIBS-lang-python) $(LIBS-display-ncurses) $(LIBS-lib-libevent)
95
96 $(OBJ) $(SHOBJ) $(LIBOBJ) $(XOBJ) $(STATICOBJ) : $(H) O/.exists
97
98 $(OBJ) : O/%.o : %.c
99         $(QUIET_CHECK)sparse $(CPPFLAGS) $(INC-$*) $(SPARSEFLAGS) $<
100         $(QUIET_SMATCH) $(CPPFLAGS) $(INC-$*) $<
101         $(QUIET_CC)$(CC) $(CPPFLAGS) $(INC-$*) $(CFLAGS) -c -o $@ $<
102
103 $(SHOBJ) $(LIBOBJ) $(XOBJ) : O/%.o : %.c
104         $(QUIET_CHECK)sparse $(CPPFLAGS) $(INC-$*) $(SPARSEFLAGS) $<
105         $(QUIET_SMATCH) $(CPPFLAGS) $(INC-$*) $<
106         $(QUIET_CC)$(CC) -fPIC $(CPPFLAGS) $(INC-$*) $(CFLAGS) -c -o $@ $<
107
108 $(STATICOBJ) : O/%-static.o : %.c
109         $(QUIET_CCSTATIC)$(CC) -Dedlib_init=$(subst -,_,$*)_edlib_init $(CPPFLAGS) $(INC-$*) $(CFLAGS) -c -o $@ $<
110
111 .PHONY: TAGS
112 TAGS :
113         etags -o TAGS.tmp Makefile *.h *.c python/*.py
114         @sed 's/[\o177,].*//' TAGS > .TAGS1
115         @sed 's/[\o177,].*//' TAGS.tmp > .TAGS2
116         @if cmp -s .TAGS1 .TAGS2 ; then \
117             rm -f TAGS.tmp ; \
118         else \
119             mv TAGS.tmp TAGS ;\
120         fi
121         @rm -f .TAGS1 .TAGS2
122
123 O/.exists:
124         @mkdir -p O
125         @touch $@
126 lib/.exists:
127         @mkdir -p lib
128         @touch $@
129
130 .PHONY: lib
131 lib: lib/libedlib.so lib/.exists
132 lib/libedlib.so: $(LIBOBJ) core-version.c
133         @$(CC) $(CFLAGS) -c -o O/core-version.o core-version.c
134         @mkdir -p lib
135         $(QUIET_CC)$(CC) -shared -Wl,-soname,libedlib.so -o $@ $(LIBOBJ) O/core-version.o
136
137 shared: $(SO)
138 lib/edlib-lib-search.so : O/lib-search.o O/rexel.o
139 lib/edlib-mode-emacs.so : O/mode-emacs.o O/emacs-search.o
140
141 $(SO) : lib/edlib-%.so : O/%.o lib/.exists
142         @mkdir -p lib
143         $(QUIET_LIB)$(CC) -shared -Wl,-soname,edlib-$*.so -o $@ $(filter %.o,$^) $(LIBS-$*)
144
145 O/mod-list.h : Makefile
146         $(QUIET_SCRIPT)for file in $(patsubst O/%.o,%,$(subst -,_,$(SHOBJ))); do echo "{ \"$$file\", $${file}_edlib_init}," ; done | sort > $@
147 O/mod-list-decl.h : Makefile
148         $(QUIET_SCRIPT)for file in $(patsubst O/%.o,%_edlib_init,$(subst -,_,$(SHOBJ))); do echo void $$file"(struct pane *ed);" ; done > $@
149
150 CSRC= attr.c
151
152 test:
153         @for f in $(CSRC); do sed -n -e 's/^#ifdef TEST_\(.*\)$$/\1/p' $$f | \
154                 while read test; do cc -g -o test_$$test -DTEST_$$test $(CSRC) && \
155                         ./test_$$test || exit 2; \
156                 done || exit 2; \
157         done; echo SUCCESS
158
159 checksym: edlib
160         @nm edlib  | awk '$$2 == "T" {print $$3}' | while read a; do grep $$a *.h > /dev/null || echo  $$a; done | grep -vE '^(_.*|main)$$' ||:
161
162 .PHONY: clean
163 clean:
164         rm -f edlib edlib-static
165         rm -rf lib O