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