]> git.neil.brown.name Git - edlib.git/blob - Makefile
TODO: clean out done items.
[edlib.git] / Makefile
1 #
2 # Copyright Neil Brown ©2015-2023 <neil@brown.name>
3 # May be distrubuted under terms of GPLv2 - see file:COPYING
4 #
5
6 SMATCH_CHECK_SAFE=1
7 export SMATCH_CHECK_SAFE
8
9 # if C=0 is given on command line, disable all checking.
10 # if C=1 is given, enable it
11 C=auto
12 ifeq "$(wildcard .CHECK)" ".CHECK"
13  CHECK=$(C:auto=1)
14 else
15  CHECK=$(C:auto=0)
16 endif
17 # if D=0 is given, don't add debug flags, fully optimize
18 # if D=1, add debugging, no optimization
19 # otherwise, .DEBUG file means compile with debugging
20 D=auto
21 ifeq "$(wildcard .DEBUG)" ".DEBUG"
22  DEBUG=$(D:auto=1)
23 else
24  DEBUG=$(D:auto=0)
25 endif
26 VERSION = $(shell [ -e .git ] && git describe --always HEAD | sed 's/edlib-//')
27 VERS_DATE = $(shell [ -e .git ] && date --iso-8601 --date="`git log -n1 --format=format:%cd --date=iso --date=short`")
28 DVERS = $(if $(VERSION),-DVERSION=\"$(VERSION)\",)
29 DDATE = $(if $(VERS_DATE),-DVERS_DATE="\"$(VERS_DATE)\"",)
30 VCFLAGS += $(DVERS) $(DDATE)
31
32 LDLIBS= -ldl
33 CC = gcc
34 floats= 16 32 64 128 16X 32X 64X 128X
35 have_float=$(foreach n,$(floats),-D__HAVE_FLOAT$(n)=0 -D__HAVE_DISTINCT_FLOAT$(n)=0)
36 SMATCH_FLAGS= -D_BITS_FLOATN_H $(have_float) -D__FLT_EVAL_METHOD__=1 $(VCFLAGS)
37
38 SPARSEFLAGS= -Wsparse-all -Wno-transparent-union -Wsparse-error $(SMATCH_FLAGS) $(VCFLAGS)
39 # Create files .DEBUG and .LEAK for extra checking
40 ifeq "$(DEBUG)" "1"
41  DBG := -Werror -fno-omit-frame-pointer
42  ifeq "$(wildcard .SANITIZE)" ".SANITIZE"
43   DBG += -fsanitize=undefined
44  endif
45  ifeq "$(wildcard .LEAK)" ".LEAK"
46   DBG += -fsanitize=leak
47  endif
48 else
49  DBG=-O3
50 endif
51 ifeq "$(CHECK)" "1"
52  QUIET_CHECK   = $(Q:@=@echo    '     CHECK    '$<;)
53 else
54  QUIET_CHECK   = @: skip
55 endif
56
57 ifeq "$(wildcard .SMATCH) $(CHECK)" ".SMATCH 1"
58  # SYMLINK .SMATCH to the smatch binary for testing.
59  SMATCH_CMD=$(shell readlink .SMATCH) $(SMATCH_FLAGS)
60  QUIET_SMATCH  = $(Q:@=@echo    '     SMATCH   '$<;)$(SMATCH_CMD)
61 else
62  QUIET_SMATCH  = @: skip
63 endif
64 CFLAGS= -g -Wall -Wstrict-prototypes -Wextra -Wno-unused-parameter $(DBG) $(VCFLAGS)
65 #CFLAGS= -pg -fno-pie -fno-PIC -g -Wall -Wstrict-prototypes -Wextra -Wno-unused-parameter $(DBG) $(VCFLAGS)
66 #Doesn't work :-( -fsanitize=address
67
68 all: edlib checksym lib shared NamesList.txt bin
69 test: edlib lib shared test-rexel
70         ./tests run
71
72 OBJ = O/edlib.o
73 LIBOBJ = O/core-mark.o O/core-doc.o O/core-editor.o O/core-attr.o \
74         O/core-keymap.o O/core-pane.o O/core-misc.o O/core-log.o \
75         O/core-version.o O/core-window.o
76 SHOBJ = O/doc-text.o O/doc-dir.o O/doc-docs.o \
77         O/doc-email.o O/doc-multipart.o O/doc-list.o \
78         O/render-hex.o O/render-lines.o \
79         O/render-format.o O/render-complete.o \
80         O/render-imageview.o \
81         O/lib-view.o O/lib-tile.o O/lib-popup.o O/lib-linecount.o \
82         O/lib-search.o O/lib-messageline.o O/lib-input.o O/lib-libevent.o \
83         O/lib-history.o O/lib-crop.o O/lib-markup.o O/lib-rfc822header.o \
84         O/lib-viewer.o O/lib-base64.o O/lib-qprint.o O/lib-utf8.o \
85         O/lib-charset.o O/lib-config.o \
86         O/lib-copybuf.o O/lib-whitespace.o O/lib-colourmap.o \
87         O/lib-renderline.o O/lib-x11selection-gtk.o O/lib-autosave.o \
88         O/lib-x11selection-xcb.o O/display-x11-xcb.o \
89         O/lib-linefilter.o O/lib-wiggle.o O/lib-aspell.o O/lib-calc.o \
90         O/lib-menu.o O/lib-unicode-names.o O/lib-askpass.o \
91         O/lib-test-markup.o O/lib-menubar.o O/lib-rangetrack.o \
92         O/lang-python.o \
93         O/mode-basic.o O/mode-emacs.o O/emacs-search.o \
94         O/display-ncurses.o
95 XOBJ = O/rexel.o
96 WOBJ = O/libwiggle.a
97
98 BIN = edlib elma elc el-askpass
99
100 bin/edlib : edlib
101 bin/elma : edlib
102 bin/elc : python/lib-server.py
103 bin/el-askpass : python/lib-server.py
104
105 # From python 3.8 on we need python3-embed to get the right libraries
106 pypkg=$(shell pkg-config --atleast-version=3.8 python3 && echo python3-embed || echo python3)
107 LIBS-lang-python = $(shell pkg-config --libs $(pypkg))
108 INC-lang-python = $(shell pkg-config --cflags $(pypkg))
109
110 LIBS-display-ncurses = $(shell pkg-config --libs panelw ncursesw MagickWand)
111 INC-display-ncurses = $(shell pkg-config --cflags panelw ncursesw MagickWand)  -Wno-strict-prototypes
112 O/display-ncurses.o : md5.h
113
114 LIBS-lib-aspell = -laspell
115
116 LIBS-lib-libevent = $(shell pkg-config --libs libevent)
117
118 LIBS-lib-x11selection-gtk = $(shell pkg-config --libs gtk+-3.0)
119 INC-lib-x11selection-gtk = $(shell pkg-config --cflags gtk+-3.0)
120
121 LIBS-lib-x11selection-xcb = $(shell pkg-config --libs xcb)
122
123 LIBS-display-x11-xcb = $(shell pkg-config --libs xcb pango cairo pangocairo MagickWand xkbcommon xkbcommon-x11)
124 # magickwand include file contains a non-strict-prototype!
125 INC-display-x11-xcb = $(shell pkg-config --cflags xcb pango cairo pangocairo MagickWand xkbcommon xkbcommon-x11) -Wno-strict-prototypes
126
127 LIBS-lib-calc = -licuuc -lgmp
128 O/libcalc.a : calc-dir
129
130 O/core-editor-static.o : O/mod-list-decl.h O/mod-list.h
131
132 STATICOBJ = $(SHOBJ:.o=-static.o) $(LIBOBJ:.o=-static.o)
133
134 #
135 # Pretty print - borrowed from 'sparse'
136 #
137 V             = @
138 Q             = $(V:1=)
139 QUIET_CC      = $(Q:@=@echo    '     CC       '$@;)
140 QUIET_CCSTATIC= $(Q:@=@echo    '     CCstatic '$@;)
141 QUIET_AR      = $(Q:@=@echo    '     AR       '$@;)
142 QUIET_GEN     = $(Q:@=@echo    '     GEN      '$@;)
143 QUIET_LINK    = $(Q:@=@echo    '     LINK     '$@;)
144 QUIET_LIB     = $(Q:@=@echo    '     LIB      '$@;)
145 QUIET_SCRIPT  = $(Q:@=@echo    '     SCRIPT   '$@;)
146
147 SO = $(patsubst O/%.o,lib/edlib-%.so,$(SHOBJ))
148 H = list.h core.h core-pane.h misc.h safe.h vfunc.h
149 edlib: $(OBJ) lib/libedlib.so
150         $(QUIET_LINK)$(CC) $(CPPFLAGS) $(CFLAGS) -rdynamic -Wl,--disable-new-dtags -o $@ $(OBJ) -Llib -Wl,-rpath=`pwd`/lib -ledlib $(LDLIBS)
151
152 edlib-static: $(OBJ) $(STATICOBJ)  $(XOBJ) O/core-version.o
153         $(QUIET_LINK)$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $^ $(LIBS-lang-python) $(LIBS-display-ncurses) $(LIBS-lib-libevent)
154
155 $(OBJ) $(SHOBJ) $(LIBOBJ) $(XOBJ) $(STATICOBJ) : $(H) O/.exists
156 $(LIBOBJ) : internal.h
157
158 O/lib-config.o : parse-ini.h
159
160 $(OBJ) : O/%.o : %.c
161         $(QUIET_CC)$(CC) $(CPPFLAGS) $(CFLAGS) $(INC-$*) -c -o $@ $<
162         $(QUIET_CHECK)sparse $(CPPFLAGS) $(INC-$*) $(SPARSEFLAGS) $<
163         $(QUIET_SMATCH) $(CPPFLAGS) $(INC-$*) $<
164
165 $(SHOBJ) $(LIBOBJ) $(XOBJ) : O/%.o : %.c
166         $(QUIET_CC)$(CC) -fPIC $(CPPFLAGS) $(CFLAGS) $(INC-$*) -c -o $@ $<
167         $(QUIET_CHECK)sparse $(CPPFLAGS) $(INC-$*) $(SPARSEFLAGS) $<
168         $(QUIET_SMATCH) $(CPPFLAGS) $(INC-$*) $<
169
170
171 O/libwiggle.a wiggle/wiggle.h : wiggle-dir
172
173 .PHONY: wiggle-dir calc-dir
174 wiggle-dir:
175         @[ -f wiggle/wiggle.h ] || { git submodule init && git submodule update; }
176         @$(MAKE) -q -C wiggle O=`pwd`/O OptDbg="-O3 -fPIC" lib || \
177                 { echo '     MAKE     wiggle'; \
178                 $(MAKE) -C wiggle O=`pwd`/O OptDbg="-O3 -fPIC" lib ; }
179
180 calc-dir:
181         @mkdir -p O
182         @$(MAKE) -q -C calc O=`pwd`/O || \
183                 { echo '     MAKE     calc'; \
184                 $(MAKE) -C calc O=`pwd`/O  ; }
185
186
187
188 $(STATICOBJ) : O/%-static.o : %.c
189         $(QUIET_CCSTATIC)$(CC) -Dedlib_init=$(subst -,_,$*)_edlib_init $(CPPFLAGS) $(CFLAGS) $(INC-$*) -c -o $@ $<
190
191 .PHONY: TAGS
192 TAGS :
193         etags -o TAGS.tmp Makefile *.h *.c python/*.py
194         @sed 's/[\o177,].*//' TAGS > .TAGS1
195         @sed 's/[\o177,].*//' TAGS.tmp > .TAGS2
196         @if cmp -s .TAGS1 .TAGS2 ; then \
197             rm -f TAGS.tmp ; \
198         else \
199             mv TAGS.tmp TAGS ;\
200         fi
201         @rm -f .TAGS1 .TAGS2
202
203 O/.exists:
204         @mkdir -p O
205         @touch $@
206 lib/.exists:
207         @mkdir -p lib
208         @ln -s ../python lib/python
209         @ln -s ../data lib/edlib
210         @touch $@
211
212 .PHONY: lib bin
213 lib: lib/libedlib.so lib/.exists
214 lib/libedlib.so: $(LIBOBJ)
215         @mkdir -p lib
216         $(QUIET_CC)$(CC) -shared -Wl,-soname,libedlib.so -o $@ $(LIBOBJ)
217 bin: $(patsubst %,bin/%,$(BIN))
218 bin/% :
219         @mkdir -p bin
220         cp $< $@
221         @chmod +x $@
222
223 shared: $(SO)
224 lib/edlib-lib-search.so : O/lib-search.o $(XOBJ)
225 lib/edlib-lib-wiggle.so : O/lib-wiggle.o $(WOBJ)
226 lib/edlib-lib-calc.so : O/lib-calc.o O/libcalc.a
227
228 O/lib-search.o : rexel.h
229 O/lib-wiggle.o : wiggle/wiggle.h
230
231 $(SO) : lib/edlib-%.so : O/%.o O/core-version.o lib/.exists
232         @mkdir -p lib
233         $(QUIET_LIB)$(CC) -shared -Wl,-soname,edlib-$*.so -o $@ $(filter %.o,$^) $(filter %.a,$^) $(LIBS-$*)
234
235 O/mod-list.h : Makefile
236         $(QUIET_SCRIPT)for file in $(patsubst O/%.o,%,$(subst -,_,$(SHOBJ))); do echo "{ \"$$file\", $${file}_edlib_init}," ; done | sort > $@
237 O/mod-list-decl.h : Makefile
238         $(QUIET_SCRIPT)for file in $(patsubst O/%.o,%_edlib_init,$(subst -,_,$(SHOBJ))); do echo void $$file"(struct pane *ed);" ; done > $@
239
240 CSRC= attr.c
241
242 test2:
243         @for f in $(CSRC); do sed -n -e 's/^#ifdef TEST_\(.*\)$$/\1/p' $$f | \
244                 while read test; do cc -g -o test_$$test -DTEST_$$test $(CSRC) && \
245                         ./test_$$test || exit 2; \
246                 done || exit 2; \
247         done; echo SUCCESS
248
249 rexel: rexel.c rexel.h core-misc.c
250         $(CC) -DDEBUG -g -o rexel rexel.c core-misc.c
251
252 test-rexel: rexel
253         ./rexel -T
254
255 NamesList.txt:
256         wget https://unicode.org/Public/UNIDATA/NamesList.txt
257
258 checksym: edlib
259         @nm edlib  | awk '$$2 == "T" {print $$3}' | while read a; do grep $$a *.h > /dev/null || echo  $$a; done | grep -vE '^(_.*|main)$$' ||:
260
261 .PHONY: clean
262 clean:
263         rm -f edlib edlib-static rexel
264         rm -rf lib O bin