New make targets: exe, build-arch, man and build-indep.
[tfortune.git] / Makefile
1 # SPDX-License-Identifier: GPL-3.0-only
2
3 .SUFFIXES:
4 MAKEFLAGS += -Rr
5 .ONESHELL:
6 .SHELLFLAGS := -ec
7
8 RM := rm -f
9 MKDIR_P := mkdir -p
10 CHMOD := chmod
11 GZIP := gzip -f9
12
13 ifeq ("$(origin CC)", "default")
14 CC := cc
15 endif
16 ifeq ("$(origin V)", "command line")
17 SAY =
18 else
19 SAY = @echo '$(strip $(1))'
20 endif
21
22 PACKAGE := tfortune
23 SLOGAN := fortune cookies with tags
24 AUTHOR := Andre Noll
25 EMAIL := maan@tuebingen.mpg.de
26 COPYRIGHT_YEAR := 2019
27 PACKAGE_HOMEPAGE := http://people.tuebingen.mpg.de/maan/$(PACKAGE)/
28 CLONE_URL := git://git.tuebingen.mpg.de/$(PACKAGE)/
29 GITWEB_URL := http://git.tuebingen.mpg.de/$(PACKAGE).git
30 LICENSE := GNU GPL version 3
31 LICENSE_URL := https://www.gnu.org/licenses/gpl-3.0-standalone.html
32 HOME_URL := http://people.tuebingen.mpg.de/maan/
33
34 define DESCRIPTION1 :=
35 Like fortune(6), tfortune is a Unix command line utility which prints
36 a random epigram. Epigrams are stored as plain text files, but they
37 must be annotated with tags to make full use of the features which
38 tfortune offers over other implementations.
39 endef
40
41 define DESCRIPTION2 :=
42 Tfortune has a built-in matching language for epigrams. User-supplied
43 tag expressions define subsets of admissible epigrams. If a tag
44 expression is given, epigrams are picked from the admissible subset
45 only.
46 endef
47
48 define DESCRIPTION3 :=
49 Besides printing random epigrams, tfortune supports a number of other
50 subcommands which help to maintain epigrams and tag expressions. There
51 are subcommands for listing and for editing the input files, and for
52 printing statistics about epigrams, expressions and tags. A subcommand
53 that enables bash command line completion is also included.
54 endef
55 LOGLEVELS := LL_DEBUG,LL_INFO,LL_NOTICE,LL_WARNING,LL_ERROR,LL_CRIT,LL_EMERG
56 GIT_VERSION := $(shell ./version-gen.sh $(PACKAGE) version.c)
57 cc_version := $(shell $(CC) --version | head -n 1)
58 build_date := $(shell date)
59 uname_rs := $(shell uname -rs)
60
61 exe := tfortune
62 man := tfortune.6.gz
63 all: $(man) $(exe)
64 man build-indep: $(man)
65 exe build-arch: $(exe)
66
67 deps := txp.bison.d txp.flex.d ast.d tfortune.d util.d txp.flex.d \
68 tfortune.lsg.d version.d linhash.d
69
70 ifeq ($(findstring clean, $(MAKECMDGOALS)),)
71 -include $(deps)
72 include config.mak
73 endif
74
75 config.h.in: configure.ac
76 $(call SAY, AH $<)
77 autoheader -f
78 config.mak config.h: config.status config.mak.in config.h.in
79 $(call SAY, CS $@)
80 ./config.status -q
81 test -f config.h && touch config.h
82 config.status: configure.sh
83 $(call SAY, CFG)
84 if test -x config.status; then \
85 ./config.status --recheck; \
86 else \
87 ./configure.sh --no-create; \
88 fi
89 configure.sh: configure.ac
90 $(call SAY, AC $<)
91 autoconf configure.ac > $@
92 $(CHMOD) 755 $@
93
94 .PRECIOUS: %.flex.c %.bison.c %.bison.h %.lsg.h %.lsg.c %.lsg.h
95
96 # created by version-gen.sh
97 version.c:
98
99 index.html tfortune.suite: %: %.m4
100 $(call SAY, M4 $<)
101 $(M4) -D "AUTHOR=$(AUTHOR)" -D "COPYRIGHT_YEAR=$(COPYRIGHT_YEAR)" \
102 -D "PACKAGE=$(PACKAGE)" \
103 -D "SLOGAN=$(SLOGAN)" \
104 -D "EMAIL=$(EMAIL)" \
105 -D "PACKAGE_URL=$(PACKAGE_URL)" \
106 -D "PACKAGE_HOMEPAGE=$(PACKAGE_HOMEPAGE)" \
107 -D "CLONE_URL=$(CLONE_URL)" \
108 -D "GITWEB_URL=$(GITWEB_URL)" \
109 -D "HOME_URL=$(HOME_URL)" \
110 -D "LICENSE=$(LICENSE)" \
111 -D "LICENSE_URL=$(LICENSE_URL)" \
112 -D "DESCRIPTION1=$(DESCRIPTION1)" \
113 -D "DESCRIPTION2=$(DESCRIPTION2)" \
114 -D "DESCRIPTION3=$(DESCRIPTION3)" $< > $@
115 %.lsg.c: %.suite
116 $(call SAY, LSGC $<)
117 $(LOPSUBGEN) --gen-c < $<
118
119 %.lsg.h: %.suite
120 $(call SAY, LSGH $<)
121 $(LOPSUBGEN) --gen-header < $<
122
123 %.6.gz: %.suite version.c
124 $(call SAY, LSGM $<)
125 $(LOPSUBGEN) --gen-man=${@:.gz=} --version-string $(GIT_VERSION) < $<
126 $(GZIP) ${@:.gz=}
127
128 %.flex.c: %.lex
129 $(call SAY, FLEX $<)
130 $(FLEX) -o $@ $<
131
132 %.bison.c %.bison.h: %.y
133 $(call SAY, BISON $<)
134 $(BISON) --defines=$(notdir $(<:.y=.bison.h)) \
135 --output=$(notdir $(<:.y=.bison.c)) $<
136
137 TF_CPPFLAGS += -Wunused-macros
138 TF_CPPFLAGS += -DCOPYRIGHT_YEAR='"$(COPYRIGHT_YEAR)"'
139 TF_CPPFLAGS += -DPACKAGE='"$(PACKAGE)"'
140 TF_CPPFLAGS += -DAUTHOR='"$(AUTHOR)"'
141 TF_CPPFLAGS += -DEMAIL='"$(EMAIL)"'
142 TF_CPPFLAGS += -DPACKAGE_HOMEPAGE='"$(PACKAGE_HOMEPAGE)"'
143 TF_CPPFLAGS += -DCLONE_URL='"$(CLONE_URL)"'
144 TF_CPPFLAGS += -DGITWEB_URL='"$(GITWEB_URL)"'
145 TF_CPPFLAGS += -DHOME_URL='"$(HOME_URL)"'
146 TF_CPPFLAGS += -DGET_VERSION='$(PACKAGE)_version'
147 TF_CPPFLAGS += -DLOGLEVELS='$(LOGLEVELS)'
148 TF_CPPFLAGS += -DBUILD_DATE='"$(build_date)"'
149 TF_CPPFLAGS += -DCC_VERSION='"$(cc_version)"'
150 TF_CPPFLAGS += -DUNAME_RS='"$(uname_rs)"'
151 TF_CPPFLAGS += -DLICENSE='"$(LICENSE)"'
152 TF_CPPFLAGS += -DLICENSE_URL='"$(LICENSE_URL)"'
153 TF_CPPFLAGS += -I/usr/local/include
154
155 TF_CFLAGS += -g
156 TF_CFLAGS += -O2
157 TF_CFLAGS += -Wall
158 TF_CFLAGS += -Wundef -W -Wuninitialized
159 TF_CFLAGS += -Wchar-subscripts
160 TF_CFLAGS += -Werror-implicit-function-declaration
161 TF_CFLAGS += -Wmissing-noreturn
162 TF_CFLAGS += -Wbad-function-cast
163 TF_CFLAGS += -Wredundant-decls
164 TF_CFLAGS += -Wdeclaration-after-statement
165 TF_CFLAGS += -Wformat -Wformat-security -Wmissing-format-attribute
166 #TF_CFLAGS += -fsanitize=address
167
168 %.flex.o: TF_CFLAGS += -Wno-all -Wno-sign-compare -Wno-unused-parameter
169 %.flex.o %.bison.o: TF_CPPFLAGS += -Wno-unused-macros
170
171 %.o: %.c tfortune.lsg.h txp.bison.h
172 $(call SAY, CC $<)
173 $(CC) \
174 -o $@ -c -MMD -MF $(*F).d \
175 -MT $@ $(TF_CPPFLAGS) $(CPPFLAGS) $(TF_CFLAGS) $(CFLAGS) $<
176
177 TF_LDFLAGS = -llopsub
178 #TF_LDFLAGS += -fsanitize=address
179
180 tfortune: $(deps:.d=.o)
181 $(call SAY, LD $@)
182 $(CC) $^ -o $@ $(TF_LDFLAGS) $(LDFLAGS)
183
184 .PHONY: all mostlyclean clean distclan maintainer-clean install \
185 install-strip README exe build-arch man build-indep
186
187 mostlyclean:
188 $(RM) $(exe) *.o *.d
189 clean: mostlyclean
190 $(RM) *.lsg.* *.flex.* *.bison.* $(man) *.suite
191 distclean: clean
192 $(RM) config.mak config.status config.log config.h config.h.in \
193 version.c configure.sh
194 $(RM) -r autom4te.cache
195 maintainer-clean:
196 git clean -dfqx > /dev/null 2>&1
197
198 mandir := $(datarootdir)/man/man6
199 INSTALL ?= install
200 INSTALL_PROGRAM ?= $(INSTALL) -m 755
201 INSTALL_DATA ?= $(INSTALL) -m 644
202 ifneq ($(findstring strip, $(MAKECMDGOALS)),)
203 strip_option := -s
204 endif
205
206 install install-strip: all
207 $(MKDIR_P) $(DESTDIR)$(bindir) $(DESTDIR)$(mandir)
208 $(INSTALL_PROGRAM) $(strip_option) $(exe) $(DESTDIR)$(bindir)
209 $(INSTALL_DATA) $(man) $(DESTDIR)$(mandir)
210
211 define README :=
212 tfortune - $(SLOGAN)
213
214 $(DESCRIPTION1)
215
216 $(DESCRIPTION2)
217
218 $(DESCRIPTION3)
219
220 Resources
221 ~~~~~~~~~
222 | web page: $(PACKAGE_HOMEPAGE)
223 | git clone URL: $(CLONE_URL)
224 | gitweb: $(GITWEB_URL)
225 | author's home page: $(HOME_URL)
226 | Send feedback to: $(AUTHOR) <$(EMAIL)>
227
228 Documentation
229 ~~~~~~~~~~~~~
230 See tfortune.suite. Or build the man page with \"make man\"
231 and run \"man -l $(man)\".
232
233 Dependencies
234 ~~~~~~~~~~~~
235 This package requires m4, autoconf, gnu make, flex, bison, gcc or
236 clang, and lopsub. The configure script checks if all required
237 dependencies are installed and prints a meaningful error message if
238 one of them is missing.
239
240 Building
241 ~~~~~~~~
242 Run \"make\" to build tfortune with the default settings. Run
243 \"./configure -h\" to list configuration options.
244
245 Installation
246 ~~~~~~~~~~~~
247 Run \"sudo make install\" to install to /usr/local. To install to
248 /somewhere/else, run \"./configure --prefix /somewhere/else && make\"
249 first.
250 endef
251
252 README:
253 @printf '%s\n' "$(README)"