# important directories prefix?=/usr/local mandir?=$(prefix)/share/man datadir?=$(prefix)/share localedir?=$(datadir)/locale docdir?=$(datadir)/doc/$(PACKAGE) CPPCHECK_JOBS?=5 # compiler CXX?=c++ # Compiler for building executables meant to be run on the # host system during cross compilation CXX_FOR_BUILD?=$(CXX) # compiler and linker flags DEFINES=-DLOCALEDIR=\"$(localedir)\" WARNFLAGS=-Werror -Wall -Wextra -Wunreachable-code INCLUDES=-Iinclude -Istfl -Ifilter -I. -Irss BARE_CXXFLAGS=-std=c++11 -O2 -ggdb $(INCLUDES) LDFLAGS+=-L. PACKAGE=newsboat ifeq (, $(filter $(MAKECMDGOALS),distclean run-i18nspector)) include config.mk endif ifeq ($(PROFILE),1) BARE_CXXFLAGS+=-O0 -fprofile-arcs -ftest-coverage LDFLAGS+=-fprofile-arcs -ftest-coverage endif CXXFLAGS:=$(BARE_CXXFLAGS) $(WARNFLAGS) $(DEFINES) $(CXXFLAGS) CXXFLAGS_FOR_BUILD?=$(CXXFLAGS) LIB_SOURCES:=$(shell cat mk/libboat.deps) LIB_OBJS:=$(patsubst %.cpp,%.o,$(LIB_SOURCES)) LIB_OUTPUT=libboat.a FILTERLIB_SOURCES=filter/Scanner.cpp filter/Parser.cpp filter/FilterParser.cpp FILTERLIB_OBJS:=$(patsubst %.cpp,%.o,$(FILTERLIB_SOURCES)) FILTERLIB_OUTPUT=libfilter.a NEWSBOAT=newsboat NEWSBOAT_SOURCES:=$(shell cat mk/newsboat.deps) NEWSBOAT_OBJS:=$(patsubst %.cpp,%.o,$(NEWSBOAT_SOURCES)) NEWSBOAT_LIBS=-lboat -lnewsboat -lfilter -lpthread -lrsspp -ldl RSSPPLIB_SOURCES=$(sort $(wildcard rss/*.cpp)) RSSPPLIB_OBJS=$(patsubst rss/%.cpp,rss/%.o,$(RSSPPLIB_SOURCES)) RSSPPLIB_OUTPUT=librsspp.a CARGO_FLAGS+=--verbose ifeq ($(PROFILE),1) ifdef CARGO_BUILD_TARGET NEWSBOATLIB_OUTPUT=target/$(CARGO_BUILD_TARGET)/debug/libnewsboat.a LDFLAGS+=-L./target/$(CARGO_BUILD_TARGET)/debug else NEWSBOATLIB_OUTPUT=target/debug/libnewsboat.a LDFLAGS+=-L./target/debug endif else ifdef CARGO_BUILD_TARGET NEWSBOATLIB_OUTPUT=target/$(CARGO_BUILD_TARGET)/release/libnewsboat.a LDFLAGS+=-L./target/$(CARGO_BUILD_TARGET)/release else NEWSBOATLIB_OUTPUT=target/release/libnewsboat.a LDFLAGS+=-L./target/release endif CARGO_FLAGS+=--release endif PODBOAT=podboat PODBOAT_SOURCES:=$(shell cat mk/podboat.deps) PODBOAT_OBJS:=$(patsubst %.cpp,%.o,$(PODBOAT_SOURCES)) PODBOAT_LIBS=-lboat -lnewsboat -lpthread -ldl ifeq (, $(filter Linux GNU GNU/%, $(shell uname -s))) NEWSBOAT_LIBS+=-liconv -lintl PODBOAT_LIBS+=-liconv -lintl endif # additional commands MKDIR=mkdir -p INSTALL=install A2X=a2x MSGFMT=msgfmt RANLIB?=ranlib AR?=ar CHMOD=chmod CARGO=cargo STFLHDRS:=$(patsubst %.stfl,%.h,$(wildcard stfl/*.stfl)) POFILES:=$(wildcard po/*.po) MOFILES:=$(patsubst %.po,%.mo,$(POFILES)) POTFILE=po/newsboat.pot RUST_SRCS:=Cargo.toml $(shell find rust -type f) TEXTCONV=./txt2h RM=rm -f all: doc $(NEWSBOAT) $(PODBOAT) mo-files NB_DEPS=xlicense.h $(LIB_OUTPUT) $(FILTERLIB_OUTPUT) $(NEWSBOAT_OBJS) $(RSSPPLIB_OUTPUT) $(NEWSBOATLIB_OUTPUT) $(NEWSBOATLIB_OUTPUT): $(RUST_SRCS) $(CARGO) build $(CARGO_FLAGS) $(NEWSBOAT): $(NB_DEPS) $(CXX) $(CXXFLAGS) -o $(NEWSBOAT) $(NEWSBOAT_OBJS) $(NEWSBOAT_LIBS) $(LDFLAGS) $(PODBOAT): $(LIB_OUTPUT) $(NEWSBOATLIB_OUTPUT) $(PODBOAT_OBJS) $(CXX) $(CXXFLAGS) -o $(PODBOAT) $(PODBOAT_OBJS) $(PODBOAT_LIBS) $(LDFLAGS) $(LIB_OUTPUT): $(LIB_OBJS) $(RM) $@ $(AR) qc $@ $^ $(RANLIB) $@ $(RSSPPLIB_OUTPUT): $(RSSPPLIB_OBJS) $(RM) $@ $(AR) qc $@ $^ $(RANLIB) $@ $(FILTERLIB_OUTPUT): $(FILTERLIB_OBJS) $(RM) $@ $(AR) qc $@ $^ $(RANLIB) $@ regenerate-parser: $(RM) filter/Scanner.cpp filter/Parser.cpp filter/Scanner.h filter/Parser.h cococpp -frames filter filter/filter.atg %.o: %.cpp $(CXX) $(CXXFLAGS) -o $@ -c $< %.h: %.stfl $(TEXTCONV) $< .stfl > $@ clean-newsboat: $(RM) $(NEWSBOAT) $(NEWSBOAT_OBJS) clean-podboat: $(RM) $(PODBOAT) $(PODBOAT_OBJS) clean-libboat: $(RM) $(LIB_OUTPUT) $(LIB_OBJS) clean-librsspp: $(RM) $(RSSPPLIB_OUTPUT) $(RSSPPLIB_OBJS) clean-libfilter: $(RM) $(FILTERLIB_OUTPUT) $(FILTERLIB_OBJS) clean-libnewsboat: cargo clean clean-doc: $(RM) -r doc/xhtml $(RM) doc/*.xml doc/*.1 doc/newsboat-cfgcmds.txt doc/podboat-cfgcmds.txt \ doc/newsboat-keycmds.txt doc/configcommands-linked.dsv \ doc/podboat-cmds-linked.dsv doc/keycmds-linked.dsv \ doc/gen-example-config doc/example-config doc/generate doc/generate2 clean: clean-newsboat clean-podboat clean-libboat clean-libfilter clean-doc clean-librsspp clean-libnewsboat $(RM) $(STFLHDRS) xlicense.h distclean: clean clean-mo test-clean profclean $(RM) core *.core core.* config.mk doc: doc/newsboat.1 doc/podboat.1 doc/xhtml/newsboat.html doc/xhtml/faq.html doc/xhtml/newsboat.html: doc/newsboat.txt doc/chapter-firststeps.txt doc/configcommands-linked.dsv \ doc/keycmds-linked.dsv doc/chapter-tagging.txt doc/chapter-snownews.txt \ doc/chapter-cmdline.txt doc/chapter-podcasts.txt doc/podboat-cmds-linked.dsv \ doc/chapter-password.txt doc/chapter-environment-variables.txt $(MKDIR) doc/xhtml $(A2X) -f xhtml -D doc/xhtml doc/newsboat.txt $(CHMOD) u+w doc/xhtml/docbook-xsl.css echo "/* AsciiDoc's new tables have

inside which wastes vertical space, so fix it */" >> doc/xhtml/docbook-xsl.css echo "td > p { margin: 0; }" >> doc/xhtml/docbook-xsl.css echo "td > p + p { margin-top: 0.5em; }" >> doc/xhtml/docbook-xsl.css echo "td > pre { margin: 0; white-space: pre-wrap; }" >> doc/xhtml/docbook-xsl.css doc/xhtml/faq.html: doc/faq.txt $(MKDIR) doc/xhtml $(A2X) -f xhtml -D doc/xhtml doc/faq.txt $(CHMOD) u+w doc/xhtml/docbook-xsl.css echo "/* AsciiDoc's new tables have

inside which wastes vertical space, so fix it */" >> doc/xhtml/docbook-xsl.css echo "td > p { margin: 0; }" >> doc/xhtml/docbook-xsl.css echo "td > p + p { margin-top: 0.5em; }" >> doc/xhtml/docbook-xsl.css echo "td > pre { margin: 0; white-space: pre-wrap; }" >> doc/xhtml/docbook-xsl.css doc/generate: doc/generate.cpp doc/split.h $(CXX_FOR_BUILD) $(CXXFLAGS_FOR_BUILD) -o doc/generate doc/generate.cpp doc/newsboat-cfgcmds.txt: doc/generate doc/configcommands.dsv doc/generate doc/configcommands.dsv > doc/newsboat-cfgcmds.txt doc/generate2: doc/generate2.cpp $(CXX_FOR_BUILD) $(CXXFLAGS_FOR_BUILD) -o doc/generate2 doc/generate2.cpp doc/newsboat-keycmds.txt: doc/generate2 doc/keycmds.dsv doc/generate2 doc/keycmds.dsv > doc/newsboat-keycmds.txt doc/newsboat.1: doc/manpage-newsboat.txt doc/chapter-firststeps.txt doc/newsboat-cfgcmds.txt \ doc/newsboat-keycmds.txt doc/chapter-tagging.txt doc/chapter-snownews.txt \ doc/chapter-cmdline.txt doc/chapter-environment-variables.txt $(A2X) -f manpage doc/manpage-newsboat.txt doc/podboat-cfgcmds.txt: doc/generate doc/podboat-cmds.dsv doc/generate doc/podboat-cmds.dsv 'pb-' > doc/podboat-cfgcmds.txt doc/podboat.1: doc/manpage-podboat.txt doc/chapter-podcasts.txt doc/podboat-cfgcmds.txt \ doc/chapter-environment-variables.txt $(A2X) -f manpage doc/manpage-podboat.txt doc/gen-example-config: doc/gen-example-config.cpp doc/split.h $(CXX_FOR_BUILD) $(CXXFLAGS_FOR_BUILD) -o doc/gen-example-config doc/gen-example-config.cpp doc/example-config: doc/gen-example-config doc/configcommands.dsv sed 's/+{backslash}"+/`\\"`/g' doc/configcommands.dsv | doc/gen-example-config > doc/example-config # add hyperlinks for every configuration command doc/configcommands-linked.dsv: doc/configcommands.dsv sed -E 's/^([^|]+)/[[\1]]<<\1,`\1`>>/' doc/configcommands.dsv > doc/configcommands-linked.dsv # add hyperlinks for every configuration command doc/podboat-cmds-linked.dsv: doc/podboat-cmds.dsv sed -E 's/^([^|]+)/[[\1]]<<\1,`\1`>>/' doc/podboat-cmds.dsv > doc/podboat-cmds-linked.dsv doc/keycmds-linked.dsv: doc/keycmds.dsv sed -E 's/^([^|]+)/[[\1]]<<\1,`\1`>>/' doc/keycmds.dsv > doc/keycmds-linked.dsv fmt: clang-format --style=file -i *.cpp doc/*.cpp include/*.h rss/*.h rss/*.cpp src/*.cpp test/*.h test/*.cpp cppcheck: cppcheck -j$(CPPCHECK_JOBS) --force --enable=all --suppress=unusedFunction \ -DDEBUG=1 \ $(INCLUDES) $(DEFINES) \ include filter newsboat.cpp podboat.cpp rss src stfl \ test/*.cpp test/*.h \ 2>cppcheck.log @echo "Done! See cppcheck.log for details." install-newsboat: $(NEWSBOAT) doc/$(NEWSBOAT).1 $(MKDIR) $(DESTDIR)$(prefix)/bin $(INSTALL) $(NEWSBOAT) $(DESTDIR)$(prefix)/bin $(MKDIR) $(DESTDIR)$(mandir)/man1 $(INSTALL) -m 644 doc/$(NEWSBOAT).1 $(DESTDIR)$(mandir)/man1 || true install-podboat: $(PODBOAT) doc/$(PODBOAT).1 $(MKDIR) $(DESTDIR)$(prefix)/bin $(INSTALL) $(PODBOAT) $(DESTDIR)$(prefix)/bin $(MKDIR) $(DESTDIR)$(mandir)/man1 $(INSTALL) -m 644 doc/$(PODBOAT).1 $(DESTDIR)$(mandir)/man1 || true install-docs: doc $(MKDIR) $(DESTDIR)$(docdir) $(INSTALL) -m 644 doc/xhtml/* $(DESTDIR)$(docdir) || true $(INSTALL) -m 644 CHANGELOG.md $(DESTDIR)$(docdir) || true $(MKDIR) $(DESTDIR)$(docdir)/contrib $(INSTALL) -m 755 contrib/*.sh $(DESTDIR)$(docdir)/contrib || true $(INSTALL) -m 755 contrib/*.rb $(DESTDIR)$(docdir)/contrib || true $(INSTALL) -m 755 contrib/*.pl $(DESTDIR)$(docdir)/contrib || true $(MKDIR) $(DESTDIR)$(docdir)/contrib/colorschemes $(INSTALL) -m 644 contrib/colorschemes/* $(DESTDIR)$(docdir)/contrib/colorschemes || true $(MKDIR) $(DESTDIR)$(docdir)/contrib/getpocket.com $(INSTALL) -m 755 contrib/getpocket.com/*.sh $(DESTDIR)$(docdir)/contrib/getpocket.com || true $(INSTALL) -m 644 contrib/getpocket.com/*.md $(DESTDIR)$(docdir)/contrib/getpocket.com || true install-examples: doc/example-config $(MKDIR) $(DESTDIR)$(docdir)/examples $(INSTALL) -m 644 doc/example-config $(DESTDIR)$(docdir)/examples/config || true $(INSTALL) -m 755 doc/example-bookmark-plugin.sh $(DESTDIR)$(docdir)/examples/example-bookmark-plugin.sh || true install: install-newsboat install-podboat install-docs install-examples install-mo uninstall: uninstall-mo $(RM) $(DESTDIR)$(prefix)/bin/$(NEWSBOAT) $(RM) $(DESTDIR)$(prefix)/bin/$(PODBOAT) $(RM) $(DESTDIR)$(mandir)/man1/$(NEWSBOAT).1 $(RM) $(DESTDIR)$(mandir)/man1/$(PODBOAT).1 $(RM) -rf $(DESTDIR)$(docdir) $(RM) -r $(DESTDIR)$(docdir) .PHONY: doc clean distclean all test test-rss extract install uninstall regenerate-parser clean-newsboat \ clean-podboat clean-libboat clean-librsspp clean-libfilter clean-doc install-mo msgmerge clean-mo \ test-clean config cppcheck # the following targets are i18n/l10n-related: run-i18nspector: $(POFILES) i18nspector $^ mo-files: $(MOFILES) extract: $(RM) $(POTFILE) xgettext -c/ -k_ -k_s -o $(POTFILE) *.cpp src/*.cpp rss/*.cpp sed -i 's#Report-Msgid-Bugs-To: \\n#Report-Msgid-Bugs-To: https://github.com/newsboat/newsboat/issues\\n#' $(POTFILE) msgmerge: for f in $(POFILES) ; do msgmerge -U $$f $(POTFILE) ; done %.mo: %.po $(MSGFMT) --check --statistics -o $@ $< clean-mo: $(RM) $(MOFILES) po/*~ install-mo: mo-files $(MKDIR) $(DESTDIR)$(datadir) @for mof in $(MOFILES) ; do \ mofile=`basename $$mof` ; \ lang=`echo $$mofile | sed 's/\.mo$$//'`; \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(MKDIR) $$dir ; \ $(INSTALL) -m 644 $$mof $$dir/$(PACKAGE).mo ; \ echo "Installing $$mofile as $$dir/$(PACKAGE).mo" ; \ done uninstall-mo: @for mof in $(MOFILES) ; do \ mofile=`basename $$mof` ; \ lang=`echo $$mofile | sed 's/\.mo$$//'`; \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(RM) -f $$dir/$(PACKAGE).mo ; \ echo "Uninstalling $$dir/$(PACKAGE).mo" ; \ done # tests and coverage reports test: test/test TEST_SRCS:=$(wildcard test/*.cpp) TEST_OBJS:=$(patsubst %.cpp,%.o,$(TEST_SRCS)) test/test: xlicense.h $(LIB_OUTPUT) $(NEWSBOATLIB_OUTPUT) $(NEWSBOAT_OBJS) $(PODBOAT_OBJS) $(FILTERLIB_OUTPUT) $(RSSPPLIB_OUTPUT) $(TEST_OBJS) test/test-helpers.h $(CXX) $(CXXFLAGS) -o test/test $(TEST_OBJS) src/*.o $(NEWSBOAT_LIBS) $(LDFLAGS) test-clean: $(RM) test/test test/*.o profclean: find . -name '*.gc*' -type f -print0 | xargs -0 $(RM) -- $(RM) app*.info # miscellaneous stuff config: config.mk config.mk: @./config.sh xlicense.h: LICENSE $(TEXTCONV) $< > $@ ALL_SRCS:=$(wildcard filter/*.cpp rss/*.cpp src/*.cpp test/*.cpp) ALL_HDRS:=$(wildcard filter/*.h rss/*.h test/*.h 3rd-party/*.hpp) $(STFLHDRS) xlicense.h depslist: $(ALL_SRCS) $(ALL_HDRS) > mk/mk.deps for dir in filter rss src test ; do \ for file in $$dir/*.cpp ; do \ target=`echo $$file | sed 's/cpp$$/o/'`; \ $(CXX) $(BARE_CXXFLAGS) -MM -MG -MQ $$target $$file >> mk/mk.deps ; \ echo $$file ; \ done; \ done include mk/mk.deps