2 # Copyright Neil Brown ©2015 <neil@brown.name>
3 # May be distrubuted under terms of GPLv2 - see file:COPYING
8 export SMATCH_CHECK_SAFE
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
20 DBG= -Werror -fno-omit-frame-pointer -fsanitize=undefined
22 QUIET_CHECK = $(Q:@=@echo ' CHECK '$<;)
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)
32 QUIET_SMATCH = @: skip
34 CFLAGS=-g -Wall -Wstrict-prototypes -Wextra -Wno-unused-parameter $(DBG)
35 #Doesn't work :-( -fsanitize=address
37 all: edlib checksym lib shared
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 \
53 XOBJ = O/rexel.o O/emacs-search.o
55 LIBS-lang-python = -lpython2.7
56 INC-lang-python = -I/usr/include/python2.7
58 LIBS-display-ncurses = -lncursesw
59 INC-display-ncurses = -I/usr/include/ncursesw
60 O/display-ncurses.o : md5.h
62 LIBS-lib-libevent = -levent
64 O/core-editor-static.o : O/mod-list-decl.h O/mod-list.h
66 STATICOBJ = $(SHOBJ:.o=-static.o) $(LIBOBJ:.o=-static.o)
69 # Pretty print - borrowed from 'sparse'
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 '$@;)
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)
86 edlib-static: $(OBJ) $(STATICOBJ) $(XOBJ)
87 $(QUIET_LINK)$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $^ $(LIBS-lang-python) $(LIBS-display-ncurses) $(LIBS-lib-libevent)
89 $(OBJ) $(SHOBJ) $(LIBOBJ) $(XOBJ) $(STATICOBJ) : $(H) O/.exists
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 $@ $<
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 $@ $<
101 $(STATICOBJ) : O/%-static.o : %.c
102 $(QUIET_CCSTATIC)$(CC) -Dedlib_init=$(subst -,_,$*)_edlib_init $(CPPFLAGS) $(INC-$*) $(CFLAGS) -c -o $@ $<
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 \
124 lib: lib/libedlib.so lib/.exists
125 lib/libedlib.so: $(LIBOBJ)
127 $(QUIET_CC)$(CC) -shared -Wl,-soname,libedlib.so -o $@ $(LIBOBJ)
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
133 $(SO) : lib/edlib-%.so : O/%.o lib/.exists
135 $(QUIET_LIB)$(CC) -shared -Wl,-soname,edlib-$*.so -o $@ $(filter %.o,$^) $(LIBS-$*)
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 > $@
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; \
152 @nm edlib | awk '$$2 == "T" {print $$3}' | while read a; do grep $$a *.h > /dev/null || echo $$a; done | grep -vE '^(_.*|main)$$' ||:
156 rm -f edlib edlib-static